【问题标题】:show external div on hover悬停时显示外部 div
【发布时间】:2016-03-18 04:40:45
【问题描述】:

我创建了一个导航,现在我想添加一个预览器来获取相关选项。

此 div 未连接到导航,但需要在悬停时显示。我在研究“几个小时”后投降了:/

这是我的简化代码

https://codepen.io/solevita/pen/JXEOQg

<div class="col">
  <div class="content">lorem ipsum</div>
</div>
<div class="col">
  <div class="navigation">
    <ul>
      <li><a href="#">punkt</a></li>
    </ul>
  </div>
</div>

如前所述,我要显示的 div 不在导航中(出于响应原因)。

是否可以使用纯 css 或 javascript 来处理这个问题?我希望不是这样 - 我的 javascript 技能不存在 :D

感谢您的帮助!

【问题讨论】:

  • 我不相信纯 CSS 可以做到这一点。不过,这很容易使用 javascript;您只需在“触发器”元素上设置事件处理程序。并在此处发布 all 您的代码,而不是 codepen。

标签: javascript css css-selectors


【解决方案1】:

如果您不想修改任何现有的标记,您可能需要使用 JavaScript 来执行此操作。 '+' 选择器仅适用于 DOM 中处于同一级别的元素。由于您用于触发内容 div 显示的元素在 DOM 中与内容 div 本身不在同一级别,因此此方法不起作用。如果我正确理解这一点,您可以使用以下 jQuery 来完成您想要做的事情:

$('.navigation a').hover(function(e) {
  $('.content').show();
}, function(e) {
  $('.content').hide();
});

【讨论】:

    【解决方案2】:

    这是一个带有 Javascript (JQuery) 版本的代码笔

    $(document).ready(
      function(){
        $("#punkt").mouseover(function() {
          $('.content').css('display','block');
        });
        $("#punkt").mouseout(function() {
          $('.content').css('display','none');
        });
    });
    

    https://codepen.io/anon/pen/rejdqq?editors=1111

    【讨论】:

      【解决方案3】:

      遗憾(幸运地)你不能使用 CSS 在 DOM 树上“导航”。您只能定位下一个兄弟元素和子元素(您可能已经知道)。

      JavaScript 可以在这种特定 案例中为您提供帮助:

      function showTarget(el) {
      
        var target = document.querySelector("[data-target='"+  el.dataset.hovershow +"']");
      
        el.addEventListener("mouseenter", function() {
          target.classList.add("visible");
        });
      
        el.addEventListener("mouseleave", function() {
          target.classList.remove("visible");
        });
      
      }
      
      [].forEach.call(document.querySelectorAll("[data-hovershow]"), showTarget);
      .navigation{ position:fixed; bottom: 30px; }
      .content         { display: none; }
      .content.visible { display: block; }             /* "visible" class is toggled by JS */
      <div class="col">
        <div class="content" data-target="1">1 lorem ipsum</div>
        <div class="content" data-target="2">2 lorem ipsum</div>
      </div>
      
      <div class="col">
        <div class="navigation">
          <ul>
            <li><a href="#" data-hovershow="1">1 punkt</a></li>
            <li><a href="#" data-hovershow="2">2 punkt</a></li>
          </ul>
        </div>
      </div>

      【讨论】:

      • 谢谢,您的回答是最有用的。可以选择显示不同的 div 真是太好了。旁注:javascript必须在body标签关闭之前实现。否则它不起作用。如果我错了,Roko C. Buljan,请更正:D
      • @Chumminerd 不,你是完全正确的。如果不使用 DOMContentLoaded 回调(在 jQuery 中也称为 document.ready),您需要将 &lt;script&gt; 标签放在关闭 &lt;/body&gt; 之前。不客气
      【解决方案4】:

      如果您将 .contenthtml 移动到 a 元素的相邻兄弟

      .content {
        display: none;
      }
      .navigation ul li a:hover + .content {
        display: block;
      }
      <div class="col">
      </div>
      <div class="col">
        <div class="navigation">
          <ul>
            <li><a href="#">punkt</a>
              <div class="content">lorem ipsum</div>
            </li>
          </ul>
        </div>
      </div>

      【讨论】:

      • 由于特定原因,内容没有嵌套在 UL 中
      • @RokoC.Buljan “由于特定原因,内容没有嵌套在 UL 中” 那么,为什么“否决”可能的解决方案?在另一个地方,您有问题/答案冒昧地在答案stackoverflow.com/a/36046964 的解决方案中添加其他内容?不要做伪君子
      • 我宁愿说一个可能的解决方案是使用JS,而不是使用CSS无法完成的事情;)
      • @RokoC.Buljan 恕我直言,鉴于您在stackoverflow.com/a/36046964 提供的解决方案,您“否决”的理由绝对是虚伪的;您在哪里向实际问题中未出现的解决方案添加了文本?使用css 提供了一个可能的解决方案。如果 element 设置为 display:none ,那么在 html 中的 a 元素旁边有什么关系?
      • @Chumminerd 注意,您应该可以将 .content 元素 position 设置为 absolute ,调整 lefttop 属性以将 .content 呈现在类似的位置第一个.coldiv的子元素的@
      【解决方案5】:

      如果您确定纯 CSS,请查看以下内容: http://jsfiddle.net/raving/87865bq7/

      <!-- normally this stuff would be on the html element -->
      <!--[if lt IE 7]>  <div class="ie ie6 lte9 lte8 lte7"> <![endif]-->
      <!--[if IE 7]>     <div class="ie ie7 lte9 lte8 lte7"> <![endif]-->
      <!--[if IE 8]>     <div class="ie ie8 lte9 lte8"> <![endif]-->
      <!--[if IE 9]>     <div class="ie ie9 lte9"> <![endif]-->
      <!--[if gt IE 9]>  <div> <![endif]-->
      <!--[if !IE]><!--> <div>             <!--<![endif]-->
        <div class="wrapper">
          I have a tooltip.
          <div class="tooltip">I am a tooltip!</div>
        </div>
      </div>
      

      CSS:

      .wrapper {
        text-transform: uppercase;
        background: #ececec;
        color: #555;
        cursor: help;
        font-family: "Gill Sans", Impact, sans-serif;
        font-size: 20px;
        margin: 100px 75px 10px 75px;
        padding: 15px 20px;
        position: relative;
        text-align: center;
        width: 200px;
        -webkit-transform: translateZ(0); /* webkit flicker fix */
        -webkit-font-smoothing: antialiased; /* webkit text rendering fix */
      }
      
      .wrapper .tooltip {
        background: #1496bb;
        bottom: 100%;
        color: #fff;
        display: block;
        left: -25px;
        margin-bottom: 15px;
        opacity: 0;
        padding: 20px;
        pointer-events: none;
        position: absolute;
        width: 100%;
        -webkit-transform: translateY(10px);
           -moz-transform: translateY(10px);
            -ms-transform: translateY(10px);
             -o-transform: translateY(10px);
                transform: translateY(10px);
        -webkit-transition: all .25s ease-out;
           -moz-transition: all .25s ease-out;
            -ms-transition: all .25s ease-out;
             -o-transition: all .25s ease-out;
                transition: all .25s ease-out;
        -webkit-box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.28);
           -moz-box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.28);
            -ms-box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.28);
             -o-box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.28);
                box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.28);
      }
      
      /* This bridges the gap so you can mouse into the tooltip without it disappearing */
      .wrapper .tooltip:before {
        bottom: -20px;
        content: " ";
        display: block;
        height: 20px;
        left: 0;
        position: absolute;
        width: 100%;
      }  
      
      /* CSS Triangles - see Trevor's post */
      .wrapper .tooltip:after {
        border-left: solid transparent 10px;
        border-right: solid transparent 10px;
        border-top: solid #1496bb 10px;
        bottom: -10px;
        content: " ";
        height: 0;
        left: 50%;
        margin-left: -13px;
        position: absolute;
        width: 0;
      }
      
      .wrapper:hover .tooltip {
        opacity: 1;
        pointer-events: auto;
        -webkit-transform: translateY(0px);
           -moz-transform: translateY(0px);
            -ms-transform: translateY(0px);
             -o-transform: translateY(0px);
                transform: translateY(0px);
      }
      
      /* IE can just show/hide with no transition */
      .lte8 .wrapper .tooltip {
        display: none;
      }
      
      .lte8 .wrapper:hover .tooltip {
        display: block;
      }
      

      【讨论】:

      • 这对这项任务来说太过分了,但我认为不赞成投票是不合适的。
      • “如果您确定纯 css” 它是否有效?是的。但是似乎有人有太多的代表,并且没有对否决票的解释。我爱人民! 3
      • @Ertürk Öztürk - 感谢分享,非常有用。我通过谷歌搜索“纯 css 工具提示”然后谷歌搜索列出 jsfiddle 链接的页面找到了它:-)
      【解决方案6】:

      如果将.contenthtml 移动到a 元素的相邻兄弟;将position.content 设置为absolute,调整lefttop 属性以匹配第一个.col 元素的位置,您应该能够在类似于子元素位置的视口中渲染.content第一个.col 元素;即在a元素之上;或在视口内的任何位置。鉴于 .content display 设置为 none.content 是否放置在 html 内的 a 元素旁边并不重要

      .col:nth-of-type(1) {
        top: 0px;
        left:0px;
      }
      
      .content {
        display: none;
      }
      .navigation ul li a:hover + .content {
        display: block;
        position: absolute;
        left:0px;
        top: 0px;
      }
      <div class="col">
      </div>
      <div class="col">
        <div class="navigation">
          <ul>
            <li><a href="#">punkt</a>
              <div class="content">lorem ipsum</div>
            </li>
          </ul>
        </div>
      </div>

      【讨论】:

      • 很酷的解决方案。如果.content 元素需要重叠以实现良好的淡入淡出效果(比在任何情况下它们必须absolute 定位)
      • @RokoC.Buljan 可能还有其他可能的css 解决方案;仍在尝试替代方案
      • 您能得到的唯一其他解决方案是使用clicks 和无线电元素;或再次单击和:target 伪。
      • 是的,尝试使用:target,但可能需要:hover以外的用户操作
      • @RokoC.Buljan “别无他法。”使用::before伪元素查看新答案
      【解决方案7】:

      另一种css 方法是使用::before 伪元素,再次设置position:absolute,调整topleft 值以在视口内的特定位置呈现文本或url

      a:hover::before {
        content: "lorem ipsum\A";
        position: absolute;
        display:block;
        top:8px;
        left:60px;
        color:green;
      }
      <div class="col">
        <div class="content">content:</div>
      </div>
      <div class="col">
        <div class="navigation">
          <ul>
            <li><a href="#">punkt</a></li>
          </ul>
        </div>
      </div>

      【讨论】:

      • 您可以使用 CMS 插入内容吗?在 :after:before 伪元素中使用 HTML 标签设置/插入内容很容易吗?
      • @RokoC.Buljan “您可以使用 CMS 插入内容吗?” 不确定是否正确解释这部分评论;在这里没有尝试过CMS。 “使用 HTML 标记在 :after 或 :before 伪元素内设置样式/插入内容很容易吗?” 应该能够在 content 属性中使用文本或 url(),其中值可以是 @ 987654334@ 或指向外部资源(例如图像)的 url 可以呈现为jsfiddle.net/95yoff8e
      • 真的吗?您是否尝试过使用 :after 或 :before 伪从 page.html 插入 HTML?
      • @RokoC.Buljan 实际上已经尝试了大量尝试在content 处呈现不同类型的数据;既使用data URI,又在元素的属性中嵌入数据
      • 相当长的时间并不意味着它(仍然)可能:)
      猜你喜欢
      • 1970-01-01
      • 2012-06-22
      • 2017-11-12
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      相关资源
      最近更新 更多