如何只悬停嵌套ul中的当前li?

Posted

技术标签:

【中文标题】如何只悬停嵌套ul中的当前li?【英文标题】:How to hover only the current li in nested ul? 【发布时间】:2014-05-24 06:41:23 【问题描述】:

我有一个嵌套列表:

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。

【问题讨论】:

你想要一个纯 CSS 的解决方案? @laaposto 最好是这样,但如果我不得不滥用 javascript 并为所有其他 lis 提供父级,那就这样吧。 【参考方案1】:

我相信你能用 CSS 获得的最接近的方法是从悬停元素的子元素中删除悬停样式......这对父母没有帮助。

li:hover 
    background-color: lightgray;

li:hover 
    font-weight: bold;    

li:hover ul 
    background-color: white;
    font-weight: normal;
<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>foo</li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

JSFiddle


您找到的副本的接受答案是我见过的使用 JavaScript 执行此操作的最佳方法,使用 e.stopPropagation:Cascading <li>-hover effect using CSS。不过,您需要比该选择器中的“所有 lis”更具体:

$('li').mouseover(function(e)

    e.stopPropagation();
    $(this).addClass('currentHover');
);

$('li').mouseout(function()

    $(this).removeClass('currentHover');
);
.currentHover 
    background-color: red;

li.currentHover ul 
    background-color: white;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="container">
    <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>foo</li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

JSFiddle 的答案来自那里。

【讨论】:

【参考方案2】:

当您添加一些内联元素时,子项和父项的解决方案都可以在没有 JavaScript 的情况下触发悬停状态。

li>span:hover 
   background-color: lightgray;
   font-weight: bold;    
<ul>
    <li><span>fnord</span>
        <ul>
            <li><span>baz</span></li>
            <li><span>foo</span>
                <ul>
                    <li><span>baz</span></li>
                    <li><span>foo</span></li>
                </ul>
            </li>
        </ul>
    </li>
</ul> 

JSFiddle 在这里。

【讨论】:

这工作完美无缺,应该更受欢迎,我不得不浏览许多相关问题才能找到这个非常优雅的解决方案。【参考方案3】:

所以你只想直接针对一个 li?试试这个:

 ul li ul li:hover
    background-color: red;

Demo here

编辑

我还添加了另一个EXAMPLE,菜单确实可以继续扩展。

【讨论】:

嵌套可以无限。这将选择 'foo',但 'foo' 本身可能有一个带有多个 li 的子 ul,依此类推。 没错,如果您单击我的最后一个示例,您可以看到 foo 可以自行扩展。 这就是你说的无限扩展吗? 啊,我明白你在这里想要达到的目标。您将遇到的唯一问题是您不知道每个 li 将包含多少项目。因此,例如,如果您有 2 个项目,您可以将鼠标悬停在它们上方,您几乎可以猜测每个项目的位置。如果您有 10 个或更多项目,则很难找到特定项目。这个怎么样? :jsfiddle.net/Jj8B5/5 如果这解决了你的问题,你能接受我的回答吗?【参考方案4】:

使用此选择器悬停

ul ul li:hover 
它只能用 foo 设置元素的样式

【讨论】:

以上是关于如何只悬停嵌套ul中的当前li?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery - 选择嵌套在 div ul li 中的特定按钮

悬停时li元素上的嵌套css样式[重复]

悬停时li元素上的嵌套css样式[重复]

下拉菜单中的父 li 不改变悬停时的颜色

带有嵌套元素的 jQuery 悬停事件

将鼠标悬停在特定 <li> 上时如何更改 <ul> 背景图像? [复制]