有一个 CSS 选择器,实际上是一个伪选择器,称为 :nth-child
。 以下是如何使用它的示例
ul li:nth-child(3n+3) {
color: #ccc;
}
上面的 CSS 代码的作用是选择无序列表中每个第三个列表项。 也就是第 3 个、第 6 个、第 9 个、第 12 个等等。 但是它是如何工作的呢? 以及您还可以使用 :nth-child
做哪些其他事情? 让我们来看看。
它归结为括号之间的内容。 nth-child 在该位置接受两个关键字:even 和 odd。 这些应该非常明显。“Even” 选择偶数编号的元素,例如第 2 个、第 4 个、第 6 个等等。“Odd” 选择奇数编号的元素,例如第 1 个、第 3 个、第 5 个等等。
如第一个示例所示,nth-child 还接受括号之间的表达式。 最简单的表达式是什么? 只是一个数字。 如果您只在括号中输入一个数字,它将只匹配该数字元素。 例如,以下是如何仅选择第 5 个元素
ul li:nth-child(5) {
color: #ccc;
}
让我们回到原始示例中的 3n+3
。 它是如何工作的? 为什么它选择每个第三个元素? 诀窍在于理解“n”和它所代表的代数表达式。 将 n
视为从零开始,然后是一组所有正整数。 然后完成表达式。 因此,3n
是“3xn”,整个表达式合起来是“(3xn)+3”。 现在代入零和正整数,我们得到
(3 x 0) + 3 = 3 = 3rd Element
(3 x 1) + 3 = 6 = 6th Element
(3 x 2) + 3 = 9 = 9th Element
etc.
:nth-child(2n+1)
怎么样?
(2 x 0) + 1 = 1 = 1st Element
(2 x 1) + 1 = 3 = 3rd Element
(2 x 2) + 1 = 5 = 5th Element
etc.
等等! 这与“odd”相同,因此可能不需要经常使用它。 但是等等。 我们是否已经将我们最初的示例暴露为过于复杂了? 如果我们不使用“3n+3”,而是使用 3n+0
,甚至更简单的 3n
呢。
(3 x 0) = 0 = no match
(3 x 1) = 3 = 3rd Element
(3 x 2) = 6 = 6th Element
(3 x 3) = 9 = 9th Element
etc.
因此,如您所见,匹配完全相同,无需“+3”。 我们也可以使用负 n 值,以及在表达式中使用减法。 例如,4n-1
(4 x 0) - 1 = -1 = no match
(4 x 1) - 1 = 3 = 3rd Element
(4 x 2) - 1 = 7 = 7th Element
etc.
使用 -n
值看起来有点奇怪,因为如果最终结果为负数,则没有匹配项,因此您需要添加到表达式中以使其再次变为正数。 事实证明,这是一种相当巧妙的技术。 您可以使用它来选择“前 n 个元素”,方法是使用 -n+3
-0 + 3 = 3 = 3rd Element
-1 + 3 = 2 = 2nd Element
-2 + 3 = 1 = 1st Element
-3 + 3 = 0 = no match
etc.
Sitepoint 有一个不错的参考指南,其中包含此 方便的表格,我将在这里厚颜无耻地重新发布它
n | 2n+1 | 4n+1 | 4n+4 | 4n | 5n-2 | -n+3 |
---|---|---|---|---|---|---|
0 | 1 | 1 | 4 | – | – | 3 |
1 | 3 | 5 | 8 | 4 | 3 | 2 |
2 | 5 | 9 | 12 | 8 | 8 | 1 |
3 | 7 | 13 | 16 | 12 | 13 | – |
4 | 9 | 17 | 20 | 16 | 18 | – |
5 | 11 | 21 | 24 | 20 | 23 | – |
浏览器支持
Chrome | Safari | Firefox | Opera | IE | Android | iOS |
---|---|---|---|---|---|---|
任意 | 3.2+ | 任意 | 9.5+ | 9+ | 任意 | 任意 |
仍然不明白?
我不太喜欢“我是视觉学习者”这句话。 当然你是,每个人都是。 在像这样的情况下,视觉辅助工具非常有帮助。 为了提供帮助,我创建了一个小的 :nth-child
测试页面。 在那里,您可以输入表达式并查看它选择的内容的结果。
另请参阅此页面上的 有用的 :nth-child
示例,以获取有关最常见的位置选择需求的快速复制粘贴代码。
谢谢!
不错的提示!
您对我们其他人的耐心继续让我感到惊讶,Chris。
写得很好,更重要的是,以一种终于让我理解这个概念的方式写成。
而且那是“没有”使用“我是视觉学习者”这句话。
:)
感谢您抽出时间做这件事,并感谢您的分享。 您绝对是将善意传递了下去。
非常棒的帖子。 请在您的帖子中放置一个转发按钮,以便于在 Twitter 上分享。
谢谢。
这里不想听起来像个傻瓜,但如果您问我,转发按钮会带走 Twitter 的所有精神。 如果您喜欢这个(谢谢!),那么转到 URL 栏,复制 URL,转到 Twitter,用您自己的话说写一条新推文,并分享链接。
您可能还有更简单的方法发推文(例如,在我的 Mac 上我使用 Tweetie,我只是按下 Command-Return,就会出现一个新的推文窗口)。
这样
1) 它不会带您离开我的网站,不会使用预先填充的、毫无生气的推文
2) 只有在他们真心想要分享时,人们才会这样做,并用他们自己的声音分享
这听起来不像傻瓜,这听起来像是经过深思熟虑的、公平的和负责任的。 干得好 :)
说的好! 确实让我重新思考了我的 Twitter 活动。
确实,但分享按钮不一定要总是出现在您的眼前,并且可以证明对很多人有用。
说得对。
帖子也很好 :)
还有很好的测试页面。
哇,我以前从未听说过那个 CSS 选择器。 我认为渐进增强理念对大多数客户来说是一个关键的卖点,除了他们嘴里的第一个问题是:“网站在 800 x 600 分辨率的 IE6 上是什么样子。” 爱技术!
同时,只需使用 jQuery。
我发现关于 :nth-child 有点违反直觉的一件事是,它在确定要设置样式的元素时使用了所有兄弟姐妹,但只会设置样式与传递给它的选择器匹配的那些元素。
例如,如果我有一页带有 p 标签、一个 h1 标签和一些 h2 标签的文本,并且出于某种奇怪的原因,我想交替 p 标签的颜色,nth-child 不会成功地做到这一点。
p:nth-child(2n) 将设置样式…
h1
h2
p
p – 本段
p
h2
p
p – 本段。
p
…这是第 2 段和第 5 段。不是我期望的。
当然,唯一应该计算的元素应该是 p 标签?
如果读起来不太好,请见谅。
事实证明我需要 :nth-of-type。
不完全是……您需要使用相邻兄弟组合器
h1 + p + p { color: red; }
演示
:nth-of-type 仍然需要将这些标题和段落包装在某种父元素中。
nth-child 不接受方程式。
它接受表达式。
我也很惊讶地看到文本中出现了“方程式”这个词。 那应该是表达式。
更令人惊讶的是——作者这么多年来还没有更正它!
说得对。 我会改的。 我不禁觉得这有点吹毛求疵,但它也更准确。
感谢 Chris 的精彩帖子!
我上周绝对试图做到这一点“从一个三乘三网格中的每个第三个框中删除右边距,以便它们可以正确地拟合”。 尽管我知道我需要使用 js 来解决 IE 问题,但我难以正确编写方程式/表达式。 出于某种原因,我错过了整个代数问题。
但感谢您方便的复习课程,我现在明白了! ;-)
(我暂时采取了简单的方法,只是给我的 #wrap div 添加了右外边距。)
当遇到一个浏览器支持而另一个不支持的情况时,我倾向于使用 JavaScript 选项。如果它在跨浏览器环境下效果不好,那么它就不会被用作关键元素,因此用 JavaScript 实现它应该是一个安全的方法。跨浏览器,但不是关键。
酷。我不知道可以用 CSS 做到这一点。我将来可能会找到它的用途。
看起来像是一种处理斑马线表格数据非常简单的方法……当然,除了 IE 一如既往地破坏了派对。
我特别喜欢“前 n 个元素”的方法。
感谢 Chris!
太棒了 - 感谢你编写了这个教程和测试器。我最近在一个网站上使用了 nth-child 来逐渐淡出较旧的推文。
#tweets li:nth-child(2){opacity:.8;}
对于好的浏览器来说,这只是一个不错的效果。
很好的工作,为我们这些不记得学校数学的人解释了 :D
顺便说一句,它被称为“伪”而不是“pseduo”,就像你的第一句话那样 ^^
另一个简短的例子。
假设你想以一种特殊的方式来设置前 3 个和前 10 个元素的样式,在你的前 100 个列表中。
# HTML
[ol id=ranking]
[li]1. Lorem
[li]2. Isum
[li]3. etc.
[/ol]
# CSS
#ranking li { default:style; }
#ranking li:nth-child(odd) { zebra:style; }
#ranking li:nth-child(-n+10) { special: styling; }
#ranking li:nth-child(-n+3) { special: styling even better; }
你可以使用 CSS 的级联和覆盖原则来设置所有元素的样式。
很酷,不是吗?
这看起来像是使用此选择器的最佳方法。
我无法想象除此之外还有很多用途,除了使查看大量相同类型的标签不那么重复/单调之外。
这太棒了,很多教程都过于复杂地围绕着 nth-child。
但是。如果我在我的网站中请求 jQuery,那么 nth-child 就能工作,无需其他操作,我说的对吗?
干杯
不,jQuery 不会“修复”CSS 文件中的任何内容。如果你想以安全的方式使用它,对于支持 jQuery 但不支持 CSS3 的浏览器,那么你必须在 jQuery 中而不是在 CSS 中进行操作。例如
另见
https://api.jqueryjs.cn/nth-child-selector/
和
你也可以让它应用类,只是为了 IE 或不支持此功能的浏览器。
例如
$("tr:nth-child(odd)").addClass("nth-child-odd");
我正在使用 jQuery 和 CSS3 选择器。nth-child 非常强大。
感谢你的精彩教程。
我今天正在为一个项目设计皮肤,这将非常有用。你太棒了!
感谢分享!从你的文章中学到了很多!
如果你想无选择地获取另一个元素内的所有元素,可以使用
element > :nth-child(blah){}
例如,我正在编写一个网站,将来将由不需要了解 CSS 的人更新,为了使图片和文本在覆盖层中美观,我需要设置除关闭按钮和图片之外的所有元素的特定边距。幸运的是,这些是每个覆盖层中的前两个元素,因此我可以使用
div.overlay > :nth-child(n+3){margin:0 10px 5px;}
感谢你让我想到使用 nth-child!
非常感谢这篇文章,我意识到了!!
这是极好的信息,我立即在 Twitter 上分享了它,让其他人知道。谢谢
这是如此棒的 CSS,我简直不敢相信 IE 不支持它。我的意思是,我理解为什么它可能不会以相同的方式呈现边距和填充(仅举几例),但它确实很糟糕,因为它不支持这种技术。如果我能够将它用于网站结构,我的生活将会轻松很多……
无论如何,谢谢 :)
当你使用 JavaScript 来实现效果时,测试页面并不是那么有用。有人可能会认为它会在 Internet Explorer 中(使用纯 CSS)工作。
最好通过 JavaScript 交替使用真实的 CSS(对于 MooTools 来说是
setStyle(s)
,我不知道 jQuery 中对应的函数,但它应该是.css(...)
或类似的东西),而不是直接使用 JavaScript。解决 IE 问题的渐进增强(至少对于布局而言)方法是使用 :nth-child(1n) 以及其他 :nth-child。这样,每个子元素都会获得在支持 :nth-child 的浏览器中所需的代码,对于不支持它的浏览器,只需确保回退不会破坏布局。
如果要在表格中的一组行上设置交替的背景颜色,该怎么办?
我有一整页的行,我想让它们五开五关(五行浅灰色背景,五行白色背景,在整页上交替)。
我不明白加减法如何解决这个问题。
嗨,Joshua,
我会将每 5 个作为一个组进行选择,如下所示
ul li:nth-child(10n-5),
ul li:nth-child(10n-6),
ul li:nth-child(10n-7),
ul li:nth-child(10n-8),
ul li:nth-child(10n-9) {
color: #ccc;
}
你只需要想一想,你实际上是在对每 10 个项目进行分组(5开 + 5关)
我的天哪,Chris,你为什么要用如此复杂的方式解释这么简单的事情……XD
2n 只表示你以 2 为一组选择元素,3n 以 3 为一组选择元素,依此类推。
你添加或减去的数字仅仅表示你想从哪里开始。
例如:2 + 3n =“以 3 为一组选择元素,从第二个开始”。
就是这样,三句话。耶哈!
然而,我更惊讶于那些评论说这是高等代数的人。如果基本的加法是高等数学,那么我们对教育体系做了什么……(现在我要去房间最黑暗的角落,为人类的未来哭泣XD)
通常我喜欢另一种解释,但你在这里听起来像个混蛋。随意重新发布你的解释,但不要用这种语气。
有没有办法选择所有第(例如)5 个之后的子元素?所以如果我们有 10 个子元素,选择第 6-10 个。
看看这篇文章:https://css-tricks.org.cn/useful-nth-child-recipies/
嗨,我真的很喜欢这篇文章和其他许多文章,我遇到了一种情况,我想像这样选择列表中的元素。
对于 1 2 3 4 - 我使用了默认样式
对于 1 2 3 4 - 我使用了 li:nth-child(3n-1):hover a{}
对于 1 2 3 4 - 我使用了 li:nth-child(3n-3):hover a{}
除了默认样式之外,你有什么建议可以用来选择第一组元素吗?
似乎颜色没有出现在文章中,所以我需要重新措辞。
对于1、4,在1 2 3 4 5 6 中 - 我使用了默认样式
对于2、5,在1 2 3 4 5 6 中 - 我使用了li:nth-child(3n-1):hover a{}
对于3、6,在1 2 3 4 5 6中 - 我使用了li:nth-child(3n-3):hover a{}
除了默认样式之外,你有什么建议可以用来选择第一组元素吗?
解释得非常好。我真的很感谢nth-child测试页面。谢谢。
嗨,Chris,
非常感谢你如此精彩的解释!
极好的例子。现在我遇到了问题,希望这能帮助我。
基于你的https://css-tricks.org.cn/dont-overthink-it-grids/,正在制作一个网格系统,
我的问题是,在特定的宽度下,我想删除一些div,并让它们的宽度为100%。
我之前是通过js来实现的,计算了每行有多少个div,但我希望只通过css来实现。
col = 6 或 8,所有宽度为50%
col = 5 — 只有第5个宽度为100%,其他所有宽度为50%
col = 3 — 只有第3个宽度为100%,其他所有宽度为50%
这很难匹配,因为3n会弄乱6、8和5的行。
我无法理解这一点。
有人能帮忙吗?
我可以尝试另一种非常简单的解释吗?不考虑数学,Xn+Y意味着使用每个第X个元素,并从第Y个位置开始选择。例如,6n+3意味着使用每个第6个元素,并从第3个元素开始。
很棒的解释,谢谢!
仅供参考,最近发生的事件让我阅读了关于个人学习风格的资料。这是一项相当的研究。总的来说,研究人员从许多方面衡量学习偏好。例如,Felder-Silverman 模型有一个视觉-语言维度,反映了学习者对图片或文字的记忆能力。虽然似乎总体上人们对图片的理解能力略好,但这并非普遍现象。我是一个视觉学习者(抱歉!)。我轻度自闭症的伴侣则非常擅长语言。