【问题标题】:How do I select the "last child" with a specific class name in CSS? [duplicate]如何在 CSS 中选择具有特定类名的“最后一个孩子”? [复制]
【发布时间】:2011-09-18 01:54:35
【问题描述】:
<ul>
    <li class="list">test1</li>
    <li class="list">test2</li>
    <li class="list">test3</li>
    <li>test4</li>
</ul>

如何选择类名的“最后一个孩子”:list

<style>
    ul li.list:last-child{background-color:#000;}
</style>

我知道上面的例子行不通,但是有什么类似的行得通吗?

重要提示:

a) 我不能使用ul li:nth-child(3),因为它也可能排在第四位或第五位。

b) 没有 JavaScript。

【问题讨论】:

  • 给它一个类名,这将是最简单的跨浏览器方式
  • 另一个副本是stackoverflow.com/questions/49942102/… ...虽然不能添加,因为它变成了循环引用。
  • 如果不是为了 SEO,我会删除这个问题,因为这里的所有答案都非常糟糕。他们要么是错误的/具有误导性,要么完全忽略了问题的重点。特别是 Chase 的回答是另一个例子,说明为什么使用除类型选择器之外的任何东西来限定 :*-of-type 会导致对这些伪类的实际工作方式产生各种误解 - 我讨论了对 :first-of-type 的类似误解我回答的最后一部分here

标签: css css-selectors


【解决方案1】:

这可以使用属性选择器来完成。

[class~='list']:last-of-type  {
    background: #000;
}

class~ 选择特定的整个单词。如果需要,这允许您的列表项以各种顺序具有多个类。它仍然会找到确切的类“列表”并将样式应用于最后一个。

在此处查看工作示例:http://codepen.io/chasebank/pen/ZYyeab

阅读有关属性选择器的更多信息:

http://css-tricks.com/attribute-selectors/ http://www.w3schools.com/css/css_attribute_selectors.asp

【讨论】:

  • 不幸的是,我发现这在技术上是行不通的......它真正做的是找到与类匹配的项目,看看它们是什么,在这种情况下是一个列表项,并且然后选择'last-of-type',不管那个特定的是否有list的类。不过我会留下答案,以防它引发其他一些解决方案,因为属性和伪选择器非常有趣和强大。
  • 这不会使用问题中的 html 选择最后一个具有类 'list' 的 div
  • 使用[class~='list'] 而不仅仅是.list 有什么意义?
  • 什么跨浏览器问题?这个答案没有意义。
  • 不起作用,而且从来没有。除了元素类型之外,没有 CSS 方法可以选择 the-last-of 任何东西。您的属性选择器将与元素的类型匹配,而不是属性本身。
【解决方案2】:

您可以使用相邻兄弟选择器来实现类似的功能,这可能会有所帮助。

.list-item.other-class + .list-item:not(.other-class)

将有效地定位类 other-class 的最后一个元素之后的紧随其后的元素。

在此处阅读更多信息:https://css-tricks.com/almanac/selectors/a/adjacent-sibling/

【讨论】:

  • 这对我来说效果很好,但实际上并没有像 OP 提到的那样选择类 list 的最后一个孩子。也就是说,它可用于根据需要获得类似的结果。
  • 对于我来说,这很有效,因为我只需要一个边框,所以我可以将它应用到兄弟姐妹的顶部。
  • 是的,如果我们希望通过 CSS 来做,它看起来更充分。
【解决方案3】:

这是一个厚颜无耻的答案,但如果您仅限于 CSS 并且能够在 DOM 中反转您的项目,则可能值得考虑。它依赖于这样一个事实:虽然特定类的 last 元素没有选择器,但实际上可以设置 first 的样式。诀窍是然后使用 flexbox 以相反的顺序显示元素。

ul {
  display: flex;
  flex-direction: column-reverse;
}

/* Apply desired style to all matching elements. */
ul > li.list {
  background-color: #888;
}

/* Using a more specific selector, "unstyle" elements which are not the first. */
ul > li.list ~ li.list {
  background-color: inherit;
}
<ul>
  <li class="list">0</li>
  <li>1</li>
  <li class="list">2</li>
</ul>
<ul>
  <li>0</li>
  <li class="list">1</li>
  <li class="list">2</li>
  <li>3</li>
</ul>

【讨论】:

  • 这实际上是唯一真正真正解决问题的hack
  • 我同意,这就是现在的答案。而且我想可能存在一种情况,您无法更改 DOM,但也许可以更改注入的数据。如果你颠倒它的顺序,flexbox 的重新排序将使它恢复正常。
  • 还应该解决只有一个单个项目具有该的情况
【解决方案4】:

如果没有 JS,您无法定位列表中类名的最后一个实例。

但是,您可能不会完全失去 css 的运气,这取决于您想要实现的目标。例如,通过使用下一个兄弟选择器,我在您的最后一个 .list 元素之后添加了一个视觉分隔符:http://jsbin.com/vejixisudo/edit?html,css,output

【讨论】:

    【解决方案5】:
    $('.class')[$(this).length - 1] 
    

    $( "p" ).last().addClass( "selected" );
    

    【讨论】:

    • 要求css 解决方案
    【解决方案6】:

    我建议您利用这样一个事实,即您可以将多个类分配给一个元素,如下所示:

    <ul>
        <li class="list">test1</li>
        <li class="list">test2</li>
        <li class="list last">test3</li>
        <li>test4</li>
    </ul>
    

    最后一个元素有 list 类,就像它的兄弟元素一样,但也有 last 类,您可以使用它来设置您想要的任何 CSS 属性,如下所示:

    ul li.list {
        color: #FF0000;
    }
    
    ul li.list.last {
        background-color: #000;
    }
    

    【讨论】:

    • 这根本没有回答问题,你读了吗?他在询问如何做到这一点,而不必专门为最后一个元素添加另一个类,这就是 :last-child 选择器的全部优点。这不应该是一个公认的答案。
    • @nights 请花时间阅读它,而不是发表此类声明。当你在它建议一个更好的解决方案。
    • @Ibu 我认为最好将“last”类放在第三个 li 元素上(即带有文本“test3”而不是“test4”的元素,以避免一些混淆 - 当我最初在 jsfiddle 中尝试了你的代码,我想“这是如何做到 OP 要求的”,直到我明白你对“最后一个”类的意思。
    • 这个答案完全没有回答@nights提到的问题
    • @danrichardson 实际上是这样。
    猜你喜欢
    • 2015-02-07
    • 2014-02-12
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2013-08-24
    • 1970-01-01
    相关资源
    最近更新 更多