【问题标题】:Cascading <li>-hover effect using CSS [duplicate]使用 CSS 级联 <li>-hover 效果 [重复]
【发布时间】:2011-12-22 10:34:02
【问题描述】:

我有一个简单的 html 无序列表。

<ul>
    <li>Item 1</li>
    <li>
        Group 1
        <ul>
            <li>Item 2</li>
            <li>Item 3</li>
        </ul>
    </li>
</ul>

我想在鼠标悬停在 Item 或 Group 上时使用 CSS 制作一个简单的效果。

li:hover
{
    background-color:#ff0000;
}

它适用于“组 1”或“项目 1”(不包含在组中) - 当我将鼠标移到颜色变化上时。但是,如果我移过“第 2 项”或“第 3 项”,“第 1 组”也会保持突出显示(红色背景)。在这种情况下,我只想突出显示“Item 2”或“Item 3”。

有人知道怎么做吗?

感谢您的帮助!

================================ 编辑

<ul>
    <li>Item 1</li>
    <li>
        Group 1
        <ul>
            <li>Item 2</li>
            <li>Group 2
                <ul>
                    <li>Item 3</li>
                    <li>Item 4</li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

将鼠标悬停在 xxx 上应突出显示 yyy
xxx -> 年年
项目 1 -> 项目 1
Group1 -> Group1, Item2, Group2, Item3, Item4
项目 2 -> 项目 2
Group2 -> Group2, Item3, Item4
项目 3 -> 项目 3
第 4 项 -> 第 4 项

请看http://image-upload.de/image/r76d79/1c7af56a19.png,只是快速绘图。

【问题讨论】:

    标签: html css hover html-lists


    【解决方案1】:

    这个解决方案不是纯粹的 HTML/CSS 解决方案,但它确实有效。它使用 Javascript 库 jQuery。
    http://jsfiddle.net/XP3Vp/

    将其放在页面的头部:

    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
    <script type="text/javascript">
    $('li').mouseover(function()
      {
              if ($('li ul li:hover').length) 
              {
                  $('li ul li:hover').css('background','red'); 
              }
              else
              {
                   $('li:hover').css('background','red'); 
              }
      });
    $('li').mouseout(function()
      {
              $(this).css('background', 'transparent');
      });
    </script>
    

    如果您不希望在将光标移到Group 1 上时也突出显示基础列表项,请使用此选项:http://jsfiddle.net/CwhhN/

    【讨论】:

    • 我对 jquery 还不是很熟悉,但我正在努力。很好的解决方案。是否可以使其能够与嵌套组一起使用?
    • @youllknow 是的,确实如此。这不是重点吗? :p
    • 很抱歉,但事实并非如此。我刚刚再次检查了两个链接。请再次阅读我在问题中的编辑。如果不清楚,我会制作一张快速图片来向您展示我的意思。
    • @youllknow 很抱歉,我一直在寻找一种更清洁的方法,但没有成功。笨拙,但它有效。jsfiddle.net/qpBgR is 有一种更简洁的方法,但它需要加载 另一个 javascript 库(准确地说是一个 jQuery 插件)。
    • 解决方案有效(删除第三行中的 else 时;)!谢谢!您能否提供“更清洁方式”的链接或 jquery 插件的名称?
    【解决方案2】:

    您能做的最好的事情就是为ul 着色..

    ul{background-color:#fff;}
    li:hover
    {
        background-color:#ff0000;
    }
    

    类似 http://jsfiddle.net/gaby/DxsDa/ 的东西,虽然它仍然会突出显示 group 1 文本..


    您也可以使用无效的 html,但出于明显的原因,我不建议这样做。http://jsfiddle.net/gaby/DxsDa/1/

    【讨论】:

    • 是的,与您发布的第一个选项完全相同(但它仍会突出显示第 1 组文本)。无效的 html 是没有选择的。
    【解决方案3】:

    Group 1 包含Item 2。所以,当你悬停Item 2 时,你也悬停在Group 1

    因此,如果不故意错误格式化 HTML,使用 CSS 就不可能实现您想要的。

    不过,有了 JS,你就可以到达那里。
    如果可以接受,请参考@RobinJ's answer

    【讨论】:

      【解决方案4】:

      在 jQuery 文档中找到了可能是最好的解决方案。 http://api.jquery.com/event.stopPropagation/

      $('li').mouseover(function(e)
      {
          e.stopPropagation();
          $(this).addClass('hover');
      });
      
      $('li').mouseout(function()
      {
          $(this).removeClass('hover');
      });
      

      【讨论】:

        【解决方案5】:

        对 UL 元素(突出显示的 li 的父元素)使用 class 或 id 并直接使用子选择器:

        ul#your_id > li:hover{ background-color: #f00; }
        

        它将修复由于您尝试突出显示每个 li 的元素而发生的错误:)

        【讨论】:

        • 使用为 CSS4 宣布的新主题选择器,这种类型的事情会变得更容易 :) @ul li li:hover { ... } 然后应该设置 ul w3.org/TR/2011/WD-selectors4-20110929/#subject
        • -1:错误。 OP 希望 item2 在悬停时突出显示,而您的规则打破了这一点。
        • 我只是给了他一个方向!他的 html 不正确。使用没有包装器的元素是不好的——比如一个组。决定是改进 html,而不是使用一些 javascript 尖峰!
        猜你喜欢
        • 1970-01-01
        • 2013-01-17
        • 2015-11-21
        • 2011-07-04
        • 2013-11-04
        • 2011-03-27
        • 2014-11-22
        • 2015-02-28
        • 2022-07-21
        相关资源
        最近更新 更多