我有一个嵌套列表:
li:hover {
background-color: lightgray;
}
ul li ul li:hover {
font-weight: bold;
}
<ul>
<li>fnord
<ul>
<li>baz</li>
<li>foo
<ul>
<li>baz</li>
<li>foo</li>
</ul>
</li>
</ul>
</li>
<li>gnarf
<ul>
<li>baz</li>
<li>foo
<ul>
<li>baz</li>
<li>yolo</li>
</ul>
</li>
</ul>
</li>
</ul>
问题是,悬停"foo"也会悬停"fnord"和它的所有li
元素。如何仅悬停鼠标实际悬停的li
?
嵌套是可变的,理论上可以是无限的。
我已经设置了一个JSFiddle。
5条答案
按热度按时间x759pob21#
一个针对子项和父项的解决方案在没有JavaScript的情况下也是可能的,当您添加一些内联元素时,这将触发悬停状态。
这里。
0aydgbwb2#
我相信你能用CSS得到的最接近的效果是从悬停元素的子元素中删除悬停样式......这对父元素没有帮助。
JSFiddle
您找到的重复项上的公认答案是我见过的使用JavaScript完成此操作的最佳方法,使用
e.stopPropagation
:Cascading -hover effect using CSS。不过,您可能希望在选择器中使用比"all lists"更具体一些内容:一个一个二个一个一个一个三个一个一个一个一个一个四个一个
JSFiddle的答案。
oxcyiej73#
所以你只想直接针对李安?试试这个:
Demo here
我还添加了另一个EXAMPLE,其中菜单确实可以继续扩展。
qyyhg6bp4#
使用此选择器悬停
qkf9rpyu5#
在2023年,通过使用
:has()
和:not()
伪选择器,纯CSS和不修改HTML就可以在Chrome浏览器上使用,但不幸的是,截至2023年1月,:has
在Firefox中还没有完全支持(用户需要通过layout.css.has-selector.enabled
标记选择加入,并且还有一些相关功能尚未实现)。