【问题标题】:Why does CSS3 have both a :first-child and :nth-child() pseudo-class selector? [closed]为什么 CSS3 同时具有 :first-child 和 :nth-child() 伪类选择器? [关闭]
【发布时间】:2014-10-14 00:27:37
【问题描述】:

为什么 CSS3 有 :first-child:nth-child() 伪类选择器?

我很好奇:first-child 的意义何在,:nth-child(1) 不应该选择完全相同的东西吗?

让两个伪类选择器来做同样的事情对我来说似乎很奇怪,我能看到的唯一原因是:first-child 少了一个字符可以输入,但代价是多了一个伪-要记住的类选择器。

【问题讨论】:

  • 现在好像很奇怪,但是老版本的IE不支持nth-child
  • 他们是在不同时间介绍的,:first-childin CSS 2:nth-childin CSS 3
  • 当您的技术无处不在时,回溯兼容性非常重要

标签: css css-selectors


【解决方案1】:

我认为这仅仅是由于 CSS 标准的演变。

CSS2 不会因为 CSS3 的存在而突然过时。来自 CSS3 规范:

本文档描述了 CSS1 和 CSS2 中已经存在的选择器,并进一步介绍了 CSS3 和其他可能需要它们的语言的新选择器。

【讨论】:

  • 在我看来,从逻辑上讲,没有 :last-child 选择器而没有 :first-child 选择器是没有意义的。 :nth-child() 不能在动态设置中选择最后一个子元素。例如,只有当您知道最后一个孩子是第 5 个元素时,您才能使用 nth-child 进行这项工作。此外,CSS 变得相当“冗长” 除了上述所有原因之外,:first-child 和 :last-child 比 :nth-child(1) 或 :nth-child(5) 更容易阅读
  • @Michael: ":nth-child() 无法在动态设置中选择最后一个子元素。"这就是为什么 :nth-last-child() 被引入作为 :nth-child() 的补充。
  • :last-child 直到 CSS3 才存在的真正原因是因为它最初是为 CSS2 提出的,然后由于不太为人所知的复杂性而被推迟。 Poor performance? 执行不力?不确定,但不管它是什么,它没有进入 CSS2 的事实并非完全是偶然的。
【解决方案2】:

如果我没记错的话,:first-child 是在 CSS2 中添加的,而 :nth-child() 是在 CSS3 中添加的——可能是“基于”前者提到的伪类。

附带说明,:first-child 将在 IE7 中工作,而 :nth-child(1) 则不能,因此它们并不总是选择完全相同的东西。

来源

http://www.sitepoint.com/web-foundations/css3-pseudo-classes/ http://www.w3.org/TR/CSS21/selector.html#first-child

【讨论】:

  • 更不用说 :last-child 被介绍了。尽管有上述所有其他内容,但您可以仅仅因为最后一个孩子成为一件事就保留第一个孩子。
  • @Michael :nth-last-child() 也被添加到 CSS3 中,所以 :last-child 也不是强制选择最后一个元素(尽管我很高兴它存在。对大多数人来说更容易使用和阅读)
【解决方案3】:

:first-child 是在CSS Selectors level 2 中引入的,而:nth-child() 属于Selectors level 3

Not the all web browsers(包括IE8及以下)支持新的CSS伪类,旧的伪类也被广泛使用,they're also part of Level 3 selectors as well

【讨论】:

    【解决方案4】:

    除了关于两个选择器的不同实现版本的所有正确答案之外,我认为这是遵循最小意外原则的某种约定:

    有一个 :last-child 选择器是某种特殊的东西(不能替换任何 :nth-child 选择器调用(好吧,除了一些肮脏的黑客)),所以一个总是希望还有一个:first-child

    如果我看到没有等效 first 的任何 last 函数/选择器,我个人会非常困惑。

    反过来,这可能会有所不同(因为first 在大多数情况下更有用,例如,用于突出显示书中章节第一个字符的文本等)。所以有::first-letter 选择器,但没有::last-letter(还没有?)。但我不希望有一个,因为实际上没有人真正突出文本的最后一个字母。 :first-child 选择器也是如此:它是由 CSS2 引入的,但当时还没有 :last-child,而是与 CSS3 和 :nth-child 选择器一起引入的。

    【讨论】:

    • ::first-letter even pre-dates :first-child. ::first-letter 在 CSS1 中已经存在,而 :first-child 是在 CSS2 中引入的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    相关资源
    最近更新 更多