仅选择悬停的级别,而不选择其父级或子级

Select only level being hovered, but not its parents or children

提问人:Philipp Koch 提问时间:9/18/2023 最后编辑:corn on the cobPhilipp Koch 更新时间:9/20/2023 访问量:61

问:

(我知道已经有无数的CSS选择器问题,但不幸的是,我找不到这个问题的答案;所以请耐心等待。

我有具有以下属性的 HTML:

  • 某些节点将始终可见。它们可以嵌套。
  • 这些节点中的每一个始终只有一个“信息子节点”,该节点仅在其父节点悬停时显示。(可能还有其他非信息子节点,因为这些子节点可以嵌套)。
  • 只想以独占方式显示当前悬停节点的信息

示例(下面是一个 JSFiddle):

.always-visible {
  display: block;
}

.info-on-parent-hover {
  background-color: #ddd;
  font-weight: normal;
  font-style: italic;
  display: none;
}

.always-visible {
  font-weight: bold;
  background-color: #777;
}

.always-visible:hover {
  background-color: #3377cc;
}

.always-visible:hover>.info-on-parent-hover {
  display: block;
}
<div class="always-visible">
  node A [top-level node]
  <div class="info-on-parent-hover">some info about A</div>
</div>

<div class="always-visible">
  node B [top-level node]
  <div class="info-on-parent-hover">some info about B</div>

  <div class="always-visible">
    node C [child node of B]
    <div class="info-on-parent-hover">some info about C</div>
  </div>

  <div class="always-visible">
    node D [child node of B]
    <div class="info-on-parent-hover">some info about D</div>
  </div>
</div>

到目前为止,这或多或少是有效的,但我的目标是一次只显示一个“信息节点”(即属于其父节点的节点)。所以:

如何只选择当前悬停其父级的 div class=“.info-on-parent-hover”(而不是其祖先、兄弟姐妹或后代的父级;即当节点 D 悬停时,节点 B 的信息也不得同时显示)?

HTML CSS 选择器

评论

1赞 Heretic Monkey 9/18/2023
使用子组合器(>
0赞 Heretic Monkey 9/18/2023
这回答了你的问题吗?有没有办法只为孩子而不是孙子应用css?
0赞 Philipp Koch 9/19/2023
我确实已经使用过子组合器(见) - 但似乎以错误的方式。.always-visible:hover > .info-on-parent-hover
0赞 CBroe 9/19/2023
悬停元素始终意味着悬停其父元素。当你悬停时,也处于状态,就是这样。“高于”的任何内容也是如此 - 包括 和 .(此外,这是基于 DOM 结构的,而不是它的显示方式。DB:hoverBbodyhtml

答:

1赞 himanshu 9/19/2023 #1

你犯了一个基本错误:你徘徊的父母有一个孙子;只需创建一个同级悬停条件,它就可以工作 JSfiddle 链接

.always-visible {
    display: block;
}
.info-on-parent-hover {
  background-color: #ddd;
  font-weight: normal;
  font-style: italic;
  display: none;
}
.always-visible {
  font-weight: bold;
  background-color: #777;
}
.always-visible .text-to-hover:hover {
  background-color: #3377cc;
}
.always-visible .text-to-hover:hover + .info-on-parent-hover {
    display: block;    
}
<div class="always-visible">
  <div class="text-to-hover">
  node A [top-level node]</div>
  <div class="info-on-parent-hover">some info about A</div>
</div>

<div class="always-visible">
  <div class="text-to-hover">
  node B [top-level node]
  </div>
  <div class="info-on-parent-hover">some info about B</div>
  
  <div class="always-visible">
  <div class="text-to-hover">
    node C [child node of B]
    </div>
    <div class="info-on-parent-hover">some info about C</div>
  </div>

  <div class="always-visible">
  <div class="text-to-hover">
  node D [child node of B]</div>
    <div class="info-on-parent-hover">some info about D</div>
  </div>
</div>

评论

1赞 Heretic Monkey 9/19/2023
使用“复制代码片段来回答”按钮将代码(适用于本网站)复制到您的答案中。
1赞 Ronak Shah 9/19/2023 #2

添加以下 CSS 选择器:

.info-on-parent-hover:has(~ .always-visible:hover) {
  display: none;
}

此选择器可在悬停同级元素时有效地隐藏元素。但是,需要注意的是,并非所有浏览器都支持伪类,因此其使用可能会受到限制。在不支持它的浏览器中,您可能需要使用基于 JavaScript 的解决方案。.info-on-parent-hover.always-visible:has()

评论

0赞 Philipp Koch 9/19/2023
谢谢你的解决方案!对我来说,重要的是不要排除Firefox用户(或者任何用户,如果可能的话),所以这里不是一个选项,但了解这种可能性是件好事。