DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费信用额度!
:nth-child
选择器允许您根据公式选择一个或多个元素,这些元素基于其源顺序。
/* Select the first list item */
li:nth-child(1) { }
/* Select the 5th list item */
li:nth-child(5) { }
/* Select every other list item starting with first */
li:nth-child(odd) { }
/* Select every 3rd list item starting with first */
li:nth-child(3n - 2) { }
/* Select every 3rd list item starting with 2nd */
li:nth-child(3n - 1) { }
/* Select every 3rd child item, as long as it has class "el" */
.el:nth-child(3n) { }
它在 CSS 选择器级别 3 规范 中被定义为“结构性伪类”,这意味着它用于根据内容与其父元素和兄弟元素的关系来设置内容的样式。
假设我们正在构建一个 CSS 网格,并且想要删除每个第四个网格模块上的边距。这是该 HTML 代码
<section class="grid">
<article class="module">One</article>
<article class="module">Two</article>
<article class="module">Three</article>
<article class="module">Four</article>
<article class="module">Five</article>
</section>
与其向每个第四个项目添加一个类(例如 .last
),我们可以使用 :nth-child
.module:nth-child(4n) {
margin-right: 0;
}
:nth-child
选择器采用一个参数:它可以是单个整数、关键字 even
、odd
或公式。如果指定了整数,则仅选择一个元素,但关键字或公式将遍历父元素的所有子元素并选择匹配的元素——类似于在 JavaScript 数组中导航项目。关键字“even”和“odd”很简单(分别为 2、4、6 等或 1、3、5)。公式使用语法 an+b
构造,其中
- “a” 是一个整数值
- “n” 是文字字母“n”
- “+” 是一个运算符,可以是“+”或“-”
- “b” 是一个整数,如果公式中包含运算符,则需要此整数
需要注意的是,此公式是一个方程式,并且会遍历每个兄弟元素,确定要选择哪个元素。“n” 公式的一部分(如果包含)表示一组递增的正整数(就像遍历数组一样)。在上面的示例中,我们使用公式 4n
选择了每个第四个元素,这是有效的,因为每次检查元素时,“n” 都会增加 1(4×0、4×1、4×2、4×3 等)。如果元素的顺序与方程式的结果匹配,则会选择该元素(4、8、12 等)。有关所涉及数学的更深入解释,请阅读 本文。
为了进一步说明,以下是一些有效的 :nth-child
选择器的示例
幸运的是,您并不总是需要自己进行计算——有很多 :nth-child
测试器和生成器
:nth-child(an + b of <selector>)
根据 CSS 选择器 规范,可以向 :nth-child
添加一个鲜为人知的过滤器:能够使用 of
格式选择元素子集的 :nth-child
。假设您有一个混合内容列表:有些具有类 .video
,有些具有类 .picture
,并且您想选择前 3 张图片。您可以使用“of”过滤器执行此操作,如下所示
:nth-child(-n+3 of .picture) {
/*
Selects the first 3 elements
applied not to ALL children but
only to those matching .picture
*/
}
请注意,这与将选择器直接附加到 :nth-child
选择器不同
.picture:nth-child(-n+3) {
/*
Not the same!
This applies to elements matching .picture
which _also_ match :nth-child(-n+3)
*/
}
这可能会有点令人困惑,因此一个示例可能有助于说明差异
对“of”过滤器的浏览器支持非常有限:截至撰写本文时,只有 Safari 支持此语法。要检查您喜欢的浏览器的状态,以下是有关 :nth-child(an+b of s)
的开放问题
关注点
:nth-child
从源顺序顶部开始遍历元素。它与:nth-last-child
之间的唯一区别在于后者从源顺序底部开始遍历元素。- 选择前
n
个元素的语法有点违反直觉。您从-n
开始,加上您要选择的元素的正数。例如,li:nth-child(-n+3)
将选择前 3 个li
元素。 :nth-child
选择器与:nth-of-type
非常相似,但有一个关键区别:它不太具体。在上面的示例中,它们将产生相同的结果,因为我们仅迭代.module
元素,但是如果我们迭代更复杂的兄弟元素组,:nth-child
将尝试匹配所有兄弟元素,而不仅仅是相同元素类型的兄弟元素。这揭示了:nth-child
的强大功能——它可以选择排列中的任何兄弟元素,而不仅仅是冒号之前指定的元素。
相关属性
其他资源
浏览器支持
Chrome | Safari | Firefox | Opera | IE | Android | iOS |
---|---|---|---|---|---|---|
任意 | 3.2+ | 任意 | 9.5+ | 9+ | 任意 | 任意 |
:nth-child
在 CSS 选择器模块 3 中引入,这意味着旧版本的浏览器不支持它。但是,现代浏览器支持非常出色,并且新的伪选择器已广泛用于生产环境。如果您需要旧版浏览器支持,请 为 IE 使用 polyfill,或者以渐进增强的方式使用这些选择器,建议这样做。
所以我在我的FAQ部分设置了一个手风琴。在一个“手风琴”中,我有一个带有ul的表单。ul有5个li。
我想要的是,当每个li中的复选框都被选中时,出现一个提交按钮。
我是否应该使用:nth-child来实现这个功能,或者还有其他方法。
感谢您提供的任何帮助。
我在想JavaScript
它有效,谢谢:)
不错。感谢您清晰的描述:-)
感谢您对nth-child伪类的简洁解释。非常有用 - 它澄清了关于这个强大选择器的大量内容。我现在对它足够了解,可以开始使用了。
您好,专家们,
我正在尝试编写一段CSS代码来格式化SAP Design Studio工具中的表格。在一个表格中,我有一个CSS,用于根据第n个子元素选择器将鼠标悬停在表格的特定列上。以下是代码片段。
.Table1 .sapzencrosstab-RowHeaderArea:hover tr > td:nth-child(4)
{
text-decoration: underline !important;
cursor: pointer !important;
}
是否可以在这里提及列标题的名称,而不是将其固定为第4列。需求是将鼠标悬停在名为“Region”的列名上,而不是将其称为第4列,因为当用户向下钻取一些其他维度到表格中时,“Region”维度可能会更改其在表格中的位置。
我在论坛中搜索过以查找CSS类和可能的解决方法,但没有找到任何结果。
谢谢并致以最诚挚的问候,
Kesavan。
您好,
短语“但是关键字或公式将遍历父元素的所有子元素并选择匹配的元素”
根据我的理解,这也是正确的吗 ->“但是关键字或公式会深入到父元素的每个子元素并选择匹配的元素”
除了使用遍历之外,是否也可以像上面那样解释,根据我的理解,这是否也是正确的?
如何使用CSS选择特定数量的最后一个子元素?
例如,总共有12个元素。我只想对总共12个元素中的最后n(1、2、3…)个子元素应用我的样式;我该怎么做?
如果所有子元素都是相同类型(元素、类…),则此方法非常有效。
.parent>.child:nth-last-child(-n+3) { /* 选择类名为“child”的最后三个元素,它们是类名为“parent”的元素的直接子元素 */ } 或只是
.child:nth-last-child(-n+3) { /* 选择类名为“child”的最后三个子元素 */ }
问题是当存在不同的子元素时,并且您只想选择其中具有相同类的一个子组的最后几个子元素。
此
:nth-last-child(-n+3 of selector)
允许您甚至按类进行选择,但遗憾的是,除了Safari之外,其他任何地方都不支持它。我不确定如何针对所有浏览器的.class执行此操作,但我倾向于在可能的情况下使用元素标签来解决此问题
副标题
文本1
文本2
文本3
文本4
制作人
.parent>section:nth-last-of-type(-n+3) { /* 选择类名为“parent”的元素的最后三个section元素,它们是直接子元素 */ } (我知道这是一个愚蠢的例子…)
嗨,我正在尝试在每X个P之后放置一些div,我是否可以使用此方法来做到这一点。我有这个,它有点用,但它将一些“随机”广告标题放在奇怪的地方,而且它似乎没有按照我放置它们的顺序(1、2、3、4)放置这些项目,$(document).ready(function(){
$(‘
广告
‘).insertAfter(‘#mvp-content-main p:nth-child(2)’);
$(‘
广告
‘).insertAfter(‘#mvp-content-main p:nth-child(5)’);
$(‘
广告
‘).insertAfter(‘#mvp-content-main p:nth-child(10)’);
$(‘
广告
‘).insertAfter(‘#mvp-content-main p:nth-child(18)’);
您好,
感谢您撰写了一篇很棒的文章…
我试图弄清楚是否存在一个公式,该公式可以独立于所有其他列或行来关注一列,例如,使用网格类比,可以为网格中的第一个单元格指定与其他单元格不同的宽度?
谢谢。
我想知道是否有一种方法可以让我在有两个同名类的情况下定位第二个类。
我在一个名为item的DIV中包含了两个media-link实例。我需要基本上向第二个类实例添加其他样式。但是,这就是困难所在…我不能向代码中添加任何其他代码或类!我知道,这不是理想的,但这取决于所使用的解决方案,而不是个人选择。
示例代码
作者:John Smith
当我设置此css时,如何控制字体颜色?
鉴于这里所有未解答的问题——以及我想要发布另一个问题——也许可以在这里添加一个指向slackexchange或单独论坛的链接,因为问题在帖子发布后会丢失?idk。只是想想。但不会发布我的问题!!哈哈
最好能提到第一个元素的索引是0还是1。我不会每天都使用这些选择器,每次我必须使用它们时,我都会查找这些信息,包括在这里。谢谢!
是1
那么,如果你必须选择特定限制内的元素,例如从第5个元素到第10个元素呢?那么你该怎么做呢?
使用此选择器可以选择`display:none`元素吗?
有没有办法选择倒数第3个元素?