【问题标题】:How do I change the CSS for the element BEFORE the last?如何在最后一个元素之前更改元素的 CSS?
【发布时间】:2010-11-09 23:50:43
【问题描述】:

如果可能的话,我希望获得最干净的代码,因此可以通过常规 CSS 或 jQuery。 它必须是跨浏览器并在 IE 中工作。

标记是面包屑。

<div id="breadcrumb">
  <ul>
     <li><a href="#">Home</a></li>
     <li><a href="#">Sports</a></li>
     <li><a href="#">Football</a></li>
     <li><a href="#">Leagues/a></li>
  </ul>
</div>

所以,我想分 3 步设置此面包屑的样式。

  • 第一个 一个
  • a项之间(所以不是第一个也不是最后一个)
  • 最后一个 一个

我无法使用常规 CSS 来解决这个问题,因为 IE 不支持 :first-child 等伪类。

所以我尝试了 jQuery 并取得了一些成功:

$("#breadcrumb li:last > a").addClass("last");

但我不知道如何定位介于两者之间的那些,因为如果我将所有 #breadcrumb li > a 的样式设置为“middle”类,那么使用 .addClass 将不再起作用。

有什么建议吗?

【问题讨论】:

    标签: jquery jquery-selectors


    【解决方案1】:

    您可以将:not():first:last 一起使用,如下所示:

    $("#breadcrumb li:first > a").addClass("first");
    $("#breadcrumb li:not(:first,:last) > a").addClass("middle");
    $("#breadcrumb li:last > a").addClass("last");
    

    【讨论】:

    • 嗯...运行选择器 3 次?你是谁,你对尼克做了什么?! ;o)
    • @patrick - 实际上,我正在考虑一个更通用的解决方案,:first-child:last-child 处理任意数量的列表和孩子......我只是被其他与工作相关的事情所吸引不过。
    • 尼克 - 你真的应该学会不让工作干扰你的网上冲浪。 :o)
    【解决方案2】:

    我建议改变对问题的思考:

    • 为所有 a 元素设置样式
    • 覆盖 :first-child 的样式
    • 覆盖 :last 的样式

    【讨论】:

      【解决方案3】:

      在这里扩展一些答案,您基本上有两个问题:

      1. 您想要设计一些既不是第一个也不是最后一个的样式
      2. 您希望它在 IE 中工作。

      因此我建议采用两步法:

      首先,相应地设置您的 HTML+CSS

      <div id="breadcrumb">
        <ul>
           <li><a href="#">Home</a></li>
           <li><a href="#">Sports</a></li>
           <li><a href="#">Football</a></li>
           <li><a href="#">Leagues/a></li>
        </ul>
      </div>
      
      #breadcrumb li a { /* middle rules here */ }
      #breadcrumb li:first-child a { /* first child rules here */ }
      #breadcrumb li:last-child a { /* last child rules here */ }
      

      其次,修复IE,

      <div id="breadcrumb">
        <ul>
           <li class="first-child"><a href="#">Home</a></li>
           <li><a href="#">Sports</a></li>
           <li><a href="#">Football</a></li>
           <li class="last-child"><a href="#">Leagues/a></li>
        </ul>
      </div>
      
      #breadcrumb li a { /* middle rules here */ }
      #breadcrumb li:first-child a { /* first child rules here */ }
      #breadcrumb li:last-child a { /* last child rules here */ }
      
      /* IE part */
      #breadcrumb li.first-child a { /* first child rules here */ }
      #breadcrumb li.last-child a { /* last child rules here */ }
      

      如果你不能在服务器上(或静态地)添加第一个子类和最后一个子类,我会使用这个 jQuery JS:

      $('#breadcrumb li:first-child').addClass('first-child');
      $('#breadcrumb li:last-child').addClass('last-child');
      

      最后,我会使用条件 cmets 或某种特征检测(不确定哪种特征检测会起作用)来确保只有需要修复的浏览器才能获得第一个/最后一个修复。您可以创建一个屏幕外的 div 并查看第一个/最后一个规则是否适用。

      请注意,如果您经常使用 first-child/last-child,那么 jQuery 代码可以很容易地进行调整,您可以在 DOM 中用两行添加这些类。

      编辑我测试了我的解决方案,发现如果您在逗号分隔的规则列表中有 :last-child,那么 IE8 无法解析 CSS 规则,所以不幸的是,您必须为IE。但是,一旦您不再关心支持 IE8(叹息……总有一天),这会更容易删除代码库的那部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-08
        • 1970-01-01
        • 2012-02-25
        • 1970-01-01
        • 2011-01-12
        • 1970-01-01
        相关资源
        最近更新 更多