使用 CSS3,我们拥有位置伪类选择器,可以帮助我们在没有其他区分特征的情况下选择特定元素,而这些元素仅仅是在 DOM 中相对于其兄弟元素的位置。
:first-child
:last-child
:nth-child
:nth-last-child
:first-of-type
:last-of-type
:nth-of-type
:nth-last-of-type
:only-child
:only-of-type
我们还获得了一些特定于文本的伪元素,以帮助满足我们的排版需求。
::first-letter
::first-line
这是一个很好的开始,但如果我们能够将整个“:nth”的概念扩展到这些排版选择器,那将非常有用。让我来说服你。
::nth-line() / ::last-line / ::nth-last-line()
我们已经有了::first-line
,所以为了完整起见,让我们添加::nth-line()
、::last-line
和::nth-last-line()
。
有了这些,我们可以选择一首诗的前两行来突出显示。
article.poem p:first-child::nth-line(-n+2) {
font-variant-caps: small-caps;
color: red;
}

或者我们可以淡出段落的结尾。
article.poem p:last-child::nth-last-line(3) {
color: hsla(26, 5%, 25%, 1);
font-size: 70%;
}
article.poem p:last-child::nth-last-line(2) {
color: hsla(26, 5%, 50%, 1);
font-size: 60%;
}
article.poem p:last-child::nth-last-line(1) {
color: hsla(26, 5%, 75%, 1);
font-size: 50%
}

如果允许我们在这些行伪元素上使用生成内容,我们可以实现类似于行号的功能,而无需诉诸于侵入性标记。
pre::nth-line(n)::before {
content: counter(line) ". ";
color: #999;
}

::nth-word() / ::first-word / ::last-word / ::nth-last-word()
我们目前没有任何基于单词的伪元素。不过我们有word-spacing
,这值得注意。
一个用例类似于使用::first-letter
进行首字母大写,只是对整个单词进行操作。
article p::first-word {
float: left;
font-size: 300%;
margin: 0 10px 10px 0;
}

与上面“淡出”行类似,我们可以使用::nth-last-word(n)
逐个单词淡出段落。
::nth-letter() / ::last-letter() / ::nth-last-letter()
我们已经有了::first-letter
,它得到了相当不错的使用,那么为什么不将其完整化呢?
在所有这些“新”选择器中,::nth-letter
可能是最有用的。例如,Lettering.js 为我们用包装字母,以便我们可以选择单个字母。使用
::nth-letter
,这将完全没有必要。
请看这个例子

h1.fancy::nth-letter(n) {
display: inline-block;
padding: 20px 10px;
}
h1.fancy::nth-letter(odd) {
transform: skewY(15deg);
background: url(light-red-pattern.png);
}
h1.fancy::nth-letter(even) {
transform: skewY(-15deg);
background: url(dark-red-pattern.png);
}
h1.fancy::nth-word(n) {
margin-right: 20px;
}
h1.fancy::last-word {
margin-right: 0;
}
查看Lettering.js上的所有示例——所有这些都是对这一需求的良好示例。
另一个单词/字母组合示例是正式的“信件”,例如
Dear Emily,
yadda yadda yadda.
Love, Chris.
也许这封“信件”是由数据库中的动态内容生成的,但我们希望确保开头和结尾行的正确大小写和样式。
.letter p:first-child::nth-word(-n+2)::nth-letter(1),
.letter p:last-child:nth-word(-n+2):nth-letter(1) {
text-transform: uppercase;
}
完整集合
因此,如果我们得到所有这些,完整集合将是
:first-child :first-of-type :only-child
:last-child :last-of-type :only-of-type
:nth-child :nth-of-type
:nth-last-child :nth-last-of-type
::first-letter ::first-line ::first-word
::last-letter ::last-line ::last-word
::nth-letter ::nth-line ::nth-word
::nth-last-letter ::nth-last-line ::nth-last-word
再次强调,这只是美好的愿望。如果有人可以让我在他们面前展示这一点并对此做些什么,我会的。我还会根据收到的反馈(正面或负面)更新此内容。
作为记录,这不是一个新的请求。Anne van Kesteren 在 2003 年就呼吁过。
好主意,Chris!
如何处理“first-sentence、last-sentence、nth-sentence 和 nth-last-sentence”?
很酷的想法!但是,您将如何准确地确定什么是句子呢?直到句号为止的所有文本?
例如
企鹅先生忘记了在圣奥古斯丁的鞋子。
我还没有考虑太久,但乍一看,它似乎很难变得足够智能以至于有用。
是的。。。我考虑过。在某些时候,您可以使用以下方法:句号后跟空格,然后是大写字母。但是,这会将您的示例分成三句话。也许它会将“.”解释为句子的结尾,而 . 解释为其他任何内容?
糟糕。。。它确实按字面意思理解了。应该是:
o
嗯。。。仍然不起作用。这次我在字符之间添加空格:& # x 2 E ;
句号是王者!:D
句子不也以问号和感叹号结尾吗?
好吧,它们稍微容易处理一些,因为您不太可能像句号那样在句子的中间遇到它们。
如果假设句号、感叹号和问号代表句子的结尾,并且如果句子中存在特殊情况,则需要进行编码,那会怎么样?
企鹅先生忘记了在圣.奥古斯丁的鞋子。
好吧,那并没有很好地呈现出来——尽管在预览中看起来不错。
句号可以用 & # 46; 进行编码。
那就是我之前用
& #x2E;
试图表达的意思。或者正则表达式选择器,允许您选择任何您喜欢的文本(定义您自己的“句子”)。
爱死你了。
让我们 :nth() 所有东西!
http://memegenerator.net/cache/instances/400x/10/10783/11042610.jpg
太棒了,我工作时都笑喷了 :)
很有道理。我很想看到更多这样的强大工具被构建到 CSS 中。
很棒的想法,Chris :)
如果获得足够的响应,您会对此做些什么吗?您可以将其提交给 CSS 工作组以供规范考虑/纳入吗?
好吧,Microsoft Word 似乎在这方面做得很好。词语识别、片段等。我相信可以创建一个算法来相当准确地确定这一点。
顺便说一句,文章很棒。里面有很多好主意。
哇,好主意。
我想要的圣诞礼物是父选择器;x < y。
但是,是的,这些将使我们能够更好地控制样式,所以我完全赞成!
如果你查看CSS 4 规范草案,父选择器已经在考虑之中了。
太棒了!:)
那不等于,例如 <> 选择器呢?
我希望至少其中一些功能能够尽快实现。仅
::nth-line
就足以用于行号显示。即使是不带表现性标记的非侵入式解决方案现在仍然需要一点 JavaScript 来与行关联。我几乎可以肯定这些选择器(或功能类似的选择器)将被添加到 CSS4 中。
我冒昧地将此内容发布到了 CSS 工作组的邮件列表。
让我们看看是否有人会关注它,特别是 CSS 4 选择器编辑 Fantasai(Elika Etemad)。
与其使用大量的选择器,为什么不采用更多程序化的方式呢?
::nth-child()
::nth-line()
::nth-word()
::nth-letter()
然后允许对 first、last 和模式进行数字指定
::nth-line(0) — 第一行
::nth-word(-1) — 最后一个单词
::nth-letter(5n) — 每 5 个字母
我赞同你的观点,先生。
我可以在今年的圣诞愿望清单上添加这些吗?!更好的是,让我们投票选 Chris 成为下一任 WC3 主席!说正经的,这确实解决了我的组织发布的所有内容中印刷品和网页之间的差距。任何将传统(和久经考验的)印刷排版技术应用于新媒体的做法,对每个人都有好处。
我想要一个 :mod-nth-child,以便可以指定模数,从而对每个第 3 个子元素或其他元素执行有趣的操作。
nth-child(3n) 不应该选择每个第三个子元素吗?如果你还没有阅读,可以看看这篇:https://css-tricks.org.cn/5452-how-nth-child-works/。当然,我可能完全误解了你的意思!
那个“按比例缩放”的例子看起来很棒!
对博客杂志狂热者非常有用!:D
第一个字母的功能会很棒!
我们已经有 first-letter 了。
很棒的技巧。很快就会开始使用。
谢谢 Chris。
这些不是技巧,只是美好的愿望。如果你尝试使用它们,它们将无法工作。
一个复杂之处在于,在某些语言/书写系统(例如泰语)中,单词不以空格区分,因此定义“第 n 个单词”并非易事。
一如既往的精彩阅读,Chris!
我在考虑 SitePoint 的“创建您自己的自定义 jQuery 选择器”(http://ow.ly/7fdQK)并尝试一下。是的,它不是我们想要的 CSS,但这可以算作一个开始吗?
再说一次,如果你考虑 LESS.js,他们添加了自己的“&:”,我认为这仅限于 .less 文件。所以这必须意味着可以使用与使“&:”成为可能的相同结构扩展 LESS.js 代码,只是这次关注这个问题?这可能是一种方法。:)
继续保持出色的工作!您之前关于 WordPress 的 Lynda 指南真的帮助了我,谢谢。
我只能说一个词,Chris
太酷了!
伙计,我几乎了解了所有关于 CSS3 新选择器的知识,但我从未想过你在这里提到的这些用法。此外,你的新建议非常有用和实用。
哇,太酷了。我只是知道 css3 非常强大。非常感谢分享。
其中有一些非常棒的想法,Chris。我最喜欢的例子是代码的行号显示,这通常是一件很麻烦的事情!
不错的列表!
我将在自己的 JavaScript 引擎(wjSelect)中支持一些这些 nth-everything 的东西。
非常喜欢 :nth-lat-word 样式选择器的想法,我最近正在创建一个“在底部淡出文本到阅读更多锚点”样式效果(而不是…)。最终使用了定位和渐变,在这种情况下效果还可以,但并不适用于所有情况。
我的咖啡因与睡眠比例不足以完全理解这些概念。但我可以肯定它很有趣。
等等……我刚才说了什么?
我最近也一直在思考类似的事情——说得很好,先生!
哇!我怀疑自己是否会想到这一点,但这些东西看起来确实很方便。现在我将在接下来的时间里研究 polyfills。
不错的列表。
太棒了,这对我很有用。
你提到的例子很棒,Chris……对我们肯定很有帮助。
想法不错,Chris……我正想着这对于博客文章摘要中的标题替换会是一个很棒的想法。事实上,你根本不需要编写任何标题,或者在你的标记中添加任何标题或 span 标签……只需让段落的第一个句子自动以你选择的样式突出显示,并链接到完整文章即可。
太棒了。你在哪里找到时间来想出这些对我们现在所处位置的绝妙改进?我无法跟上现有内容,更不用说将其扩展到新的领域了。
:after
和::after
有什么区别?你的帖子(这篇)表明一些选择器使用单个冒号,而另一些选择器使用双冒号。如果是这样,如何知道使用哪个以及用于什么?@aaron
在 CSS 中有伪类和伪元素。在 CSS2 中,这两种类型之间没有区别,但在 CSS3 中有区别。
为了使逻辑更加清晰,CSS 开发人员添加了一条规则,即伪元素使用双冒号,伪类使用单个冒号。
例如,一个元素是 ::first-letter。一个类是 ::first-child。
你应该这样理解
使用 ::first-letter,你可以获取第一个字母并在其周围添加一个 span。
注意:这在浏览器中不会发生。
span 是一个元素,所以是伪元素。
使用 :first-child,你有多个子元素。
使用 first-child,你可以为第一个子元素添加一个类。所以这是一个伪类。
那么
::after
和::before
不也是伪元素吗?我们通常不使用:after
和:before
吗?而且我以为伪元素的意思是假的元素,通过CSS创建的元素。从本质上讲,我可以这样理解:我创建一个新的元素,它只包含段落的第一字母,然后我为这个新元素设置样式。但是当我使用:first-child
时,我实际上是在选择HTML中已经存在的某个元素。DOM和HTML有什么区别?DOM的全称是什么?
伙计们,你们觉得AXR项目怎么样?这是一个小型幻灯片演示:http://goo.gl/8O6gK
我的直觉就像一个面对大蒜的吸血鬼(万圣节)……虽然它看起来有点令人兴奋,因为它能够以比我们现在更广泛的方式摆脱图像等。虽然乍一看,一些东西在被呈现为“更容易”时,似乎比html/css更复杂。
我们很乐意听到更多关于此事的意见,Jonathan。
我喜欢:nths。但那是因为我在乎。大多数最终用户不会拥有那种使用这些细微差别(需要一定的抽象和想象力才能有效地实现)会带来真正好处的心态,所以我不知道它们在优先级列表中的位置有多高。
以http://www.nthdegree.com/为例——请告诉我这是一个非常微妙的恶搞……我的眼睛比手工烧制的乐烧陶器还要呆滞。我正兴奋地吱吱叫着,期待着他们用::nth-last-letter做什么 :)
“don’t don’t?”那本意是说“don’t know”——看,语法检查器在列表中的位置要高得多 :)
很棒的想法——我同意Alex Mellor关于父选择器的价值。
我喜欢::first-word的潜力。
对我来说,这就像来自地狱的语言,我什么都不懂哈哈
Chris,感谢你在这方面的工作。
我刚刚注意到在第二个例子中存在`p:last-child::nth-last-child(3)`等。这难道不应该写成`p:last-child::nth-last-line(3)`吗?或者是我弄错重点了?
是的,那是错误的,现在已经修复了。
谢谢!太棒了!
非常棒的建议,可以添加到规范中。此外,如果nth-line是一个内联伪元素,这将使“多行填充文本”更容易实现。双赢!
附注。那些虚假的评论非常烦人。验证码能否帮助解决这个问题?
::nth-child()
::nth-line()
::nth-word()
::nth-letter()
last-line
last-child
last-word
以上所有都不适用于我,谁能帮我了解一下如何使用这些?
整篇文章都是关于这些东西还没有生效的。如果你真的需要这个功能,可以查看jQuery插件。
很明显,从所有这些评论来看,很多人都在想同样的事情。
希望至少其中一些想法能进入CSS4。
该死——我以为这些是真的,还尝试使用它们,直到我仔细阅读了它们只是实现可能想法的草稿。
这太棒了。糟糕的棒极了。感谢你发布这个,因为我一直想知道是否存在用于区分文本颜色的全局CSS命令。
当我们渴望地希望选择器时,不妨考虑一下
有时你可能希望将::character(‘@’)的颜色设置为不同,或者不在|上使用斜体,或者对数字字符使用不同的字体,或者将公司名称的所有实例设置为红色::word(‘Apple’),所有脏话都显示:none或任何其他内容!
我希望能够匹配文本节点内容的子部分。