【问题标题】:Hover on 1 child - hide other children which are inside other divs, css only悬停在 1 个孩子上 - 隐藏其他 div 内的其他孩子,仅 css
【发布时间】:2015-02-08 18:33:16
【问题描述】:

问题来了:

<div class="dep-wrap">
    <div class="dep">
        <div class="dim"></div>
    </div>
    <div class="dep">
        <div class="dim"></div>
    </div>
    <div class="dep">
        <div class="dim"></div>
    </div>
</div>

最初所有dims 都是隐藏的,当我将任何dep div 悬停时,我需要确保其子dim 保持隐藏并显示所有其他dims。是否可以使用这种 HTML 结构来处理纯 CSS,或者 depdim 之间是否存在模式元素?

谢谢。

【问题讨论】:

    标签: css hide show


    【解决方案1】:

    像这样试试。红色项目是最初隐藏的项目。

    需要注意的重要一点是选择器的“附加权重”使自己的子项隐藏起来。否则,您将不得不使用丑陋的 !important

    div.dep-wrap div.dep:hover div.dim {
      display: none;
    }
    

    完整的 CSS:

    div.dep-wrap {
      width: 350px;
      height: 100px;
    }
    
    div.dep {
        width: 100px;
        height: 100px;
        background-color: green;
        display: inline-block;
    }
    
    div.dim {
      width: 100px;
      height: 100px;
      background-color:red;
      display: none;
    }
    
    /* show all items */
    div.dep-wrap:hover div.dim {
      display: block;
    }
    
    /* hide the one you are hovering */
    div.dep-wrap div.dep:hover div.dim {
      display: none;
    }
    

    http://codepen.io/anon/pen/JoGgjj

    【讨论】:

    • 好办法没想到这个,加1
    • 现在这是我们要去的地方。谢谢你。我们可以不使用dep-wrap:hover 吗?问题是这个 div 比它的孩子加起来要大得多,所以所有孩子都受到远距离的影响,甚至在我接近 deps 之前。
    • 您需要该包装器才能访问其他项目。您可能想要添加另一个紧紧包裹项目的 div。然后相同的解决方案将起作用,但您需要对结构进行一些小改动。
    【解决方案2】:

    这是一个 JavaScript 解决方案。

    var dep = document.getElementsByClassName('dep');
    var dim = document.getElementsByClassName('dim');
    
    for (i = 0; i < dep.length; i++) {
      dep[i].addEventListener('mouseover', function() {
        for (j = 0; j < dep.length; j++) {
          if (dep[j] != this) {
            for (k = 0; k < dep[j].children.length; k++) {
              dep[j].children[k].style.opacity = '1';
            }
          }
        }
      })
      dep[i].addEventListener('mouseleave', function() {
        for (j = 0; j < dep.length; j++) {
          for (k = 0; k < dep[j].children.length; k++) {
            dep[j].children[k].style.opacity = '0';
          }
        }
      })
    }
    .dep-wrap {
      width: 360px;
      height: 120px;
      background-color: lightblue;
    }
    .dep {
      display: inline-block;
      width: 110px;
      height: 110px;
      background-color: coral;
      cursor: pointer;
      margin: 5px;
    }
    .dim {
      width: 100px;
      height: 100px;
      background-color: black;
      margin: auto;
      margin-top: 5px;
      opacity: 0;
      transition: opacity 0.4s;
    }
    <div class="dep-wrap">
      <div class="dep">
        <div class="dim"></div>
      </div
      ><div class="dep">
        <div class="dim"></div>
      </div
      ><div class="dep">
        <div class="dim"></div>
      </div>
    </div>

    你也可以使用 jQuery。

    $('.dep').hover(function() {
      $(this).parent().children().not(this).find('.dim').css({'opacity' : '1'})
    }, function() {
      $('.dim').css({'opacity' : '0'})
    })
    .dep-wrap {
      width: 360px;
      height: 120px;
      background-color: lightblue;
    }
    .dep {
      display: inline-block;
      width: 110px;
      height: 110px;
      background-color: coral;
      cursor: pointer;
      margin: 5px;
    }
    .dim {
      width: 100px;
      height: 100px;
      background-color: black;
      margin: auto;
      margin-top: 5px;
      opacity: 0;
      transition: opacity 0.4s;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <div class="dep-wrap">
      <div class="dep">
        <div class="dim"></div>
      </div
      ><div class="dep">
        <div class="dim"></div>
      </div
      ><div class="dep">
        <div class="dim"></div>
      </div>
    </div>

    【讨论】:

    • @chipchocolate-py 也感谢您的解决方案。由于我无法仅通过 css 完成它而不使一切变得丑陋,我将使用 js,但您能否建议优雅的 jQuery 解决方案?这真是太棒了:)
    • @nrvnm - 当然!我将添加一个 jQuery 解决方案。
    • 谢谢!因为我不能只用 css 做,我会接受你的答案是正确的。
    • @nrvnm - 不客气! :)
    【解决方案3】:
    .dep-wrap:hover > .dep > .dim {
        display: block
    }
    .dep-wrap:hover > .dep:hover > .dim {
        display: none
    }   
    

    悬停父级会使所有.dim 可见,但我们会再次删除当前悬停的.dep.dim

    【讨论】:

      【解决方案4】:

      使用 css,您可以使用 ~ 通用兄弟选择器仅定位下一个兄弟。

      .dep, .dim { height: 80px; width: 80px; display: inline-block; }
      .dep { background: blue; }
      .dim { background: orange; display: none; }
      
      .dep:hover ~ .dep .dim { display: inline-block; }
      <div class="dep-wrap">
          <div class="dep">
              <div class="dim"></div>
          </div>
          <div class="dep">
              <div class="dim"></div>
          </div>
          <div class="dep">
              <div class="dim"></div>
          </div>
      </div>

      参考:General sibling selectors

      【讨论】:

      • 谢谢,但这不是我想要的。悬停任何dep 应该隐藏(或着色)所有其他dims,除了我们悬停的那个。如果这有意义的话。
      • 这在 css 中是不可能的,你不能定位以前的元素。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多