DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 $200 免费信用额度!
CSS 中的 :first-of-type
选择器允许您定位其容器中元素的第一个出现。它在 CSS 选择器级别 3 规范 中被定义为“结构伪类”,这意味着它用于根据其与父级和同级内容的关系对内容进行样式化。
假设我们有一篇文章,其中包含标题和多个段落
<article>
<h1>A Title</h1>
<p>Paragraph 1.</p>
<p>Paragraph 2.</p>
<p>Paragraph 3.</p>
</article>
我们希望使第一个段落更大,作为一种“引言”或介绍性段落。与其赋予它一个类,不如使用 :first-of-type
来选择它
p:first-of-type {
font-size: 1.25em;
}
使用 :first-of-type
与 :nth-child
非常相似,但存在一个关键区别:它不太具体。在上面的示例中,如果我们使用了 p:nth-child(1)
,则不会发生任何事情,因为段落不是其父元素(<article>
)的第一个子元素。这揭示了 :first-of-type
的强大功能:它定位特定类型的元素在特定排列中的目标与其相似的同级元素相关,而不是所有同级元素。
下面的更完整的示例演示了 :first-of-type
和相关伪类选择器 :last-of-type
的使用。
Check out this Pen!
其他资源
浏览器支持
Chrome | Safari | Firefox | Opera | IE | Android | iOS |
---|---|---|---|---|---|---|
有效 | 3.2+ | 有效 | 9.5+ | 9+ | 有效 | 有效 |
:first-of-type
在 CSS 选择器模块 3 中引入,这意味着旧版本的浏览器不支持它。但是,现代浏览器的支持非常出色,新的伪选择器在生产环境中被广泛使用。如果您需要较旧的浏览器支持,请 为 IE 使用 polyfill,或者以渐进增强的方式使用这些选择器,这是一种推荐的做法。
感谢您的这篇文章。我刚刚通过 Greg Rickaby 的首字母下降教程了解了伪类。我以前会手动在每个帖子的首字母添加 span 标签,但我想要一种简单的方法来做到这一点,这样可以避免我每次都必须手动添加的麻烦。所以我只是添加了一些 first-of-type CSS,它完美地起作用了。
但我担心浏览器兼容性。据我所知,这个伪类非常流行,在大多数浏览器中都能很好地工作,包括旧版本。似乎唯一令人担忧的是 IE8。IE9 是最新的吗?如果是这样,那么很多人可能仍在运行 IE8,对吧?
一些 Javascript 代码可以帮助让首字母下沉在所有浏览器中兼容吗?
谢谢!!
对于 IE 8,如果你使用 jQuery,你可以使用
嗨,
我在使用我的面包屑样式时,`first-of-type` 无法正常工作。
请看这里演示 http://jsfiddle.net/Lh4aq796/4/
除了 `:first-of-type` 和 `:first-of-type:before` 元素(最后两个样式),其他一切正常。
我阅读了几篇文章并尝试了所有技巧,但似乎都没有用。看起来 a 标签之间的 span 类会导致问题。请帮忙修复这个问题(HTML 标记是由 yoast seo 插件生成的)
请修改你的 CSS 代码……
#breadcrumbs {
margin-top: 20px;
margin-left: 20px;
font-size: 14px;
line-height: 30px;
color: #aaaaaa;
padding: 1px;
border: 1px solid #f0f0f0;
}
#breadcrumbs a {
display: block;
float: left;
background: #f0f0f0;
padding-right: 10px;
height: 30px;
margin-right: 31px;
position: relative;
text-decoration: none;
color: #aaaaaa;}
#breadcrumbs a:before {
content: “”;
display: block;
width: 0;
height: 0;
position: absolute;
top: 0;
left: -30px;
border: 15px solid transparent;
border-color: #f0f0f0;
border-left-color: transparent;
}
#breadcrumbs a:after {
content: “”;
display: block;
width: 0;
height: 0;
position: absolute;
top: 0;
right: -30px;
border: 15px solid transparent;
border-left-color: #f0f0f0;
}
#breadcrumbs a:hover {
background: #f36f21;
color: #fff;
text-decoration: none;}
#breadcrumbs a:hover:before {
border-color: #f36f21;
border-left-color: transparent;
}
#breadcrumbs a:hover:after {
border-left-color: #f36f21;
}
#breadcrumbs span span:first-of-type a {
padding-left: 15px;
}
#breadcrumbs span span:first-of-type a:before {
display: none;
}
哈哈。
我不确定我是否误解了它的工作原理,或者它是否按预期工作。
我正在尝试定位具有特定类的最后一个元素(请看 Codepen)。http://codepen.io/benratelade/pen/dGBYev
不幸的是,它不能那样工作;请看这个 SO 答案,了解原因和解决方法。
我正在尝试使用它来设置文章中第一个段落的样式。虽然我能够让它设置文章中第一个段落的样式,但我发现它也会应用到文章中任何子元素的第一个段落标签。
如何才能优化它,以便它忽略文章中子元素内部的任何 p 标签?
你也可以使用
来选择文章中任何 h1 标签后的第一个段落。
直到现在我才知道,你可以使用 + element-below 来选择另一个元素后的第一个元素。这种选择方式叫什么?我想了解更多关于它。谢谢!
非常感谢!这真的很好地解释了 `first-of-type` 选择器,我一直难以理解这个概念。做得好,现在我知道在哪里可以获得优质资源。这就像一个博客,我可以发布一段我无法理解的代码,然后大家一起尝试解决问题吗?这太棒了,我一直都在寻找这样的地方。非常感谢。
我在 Chrome 中遇到了一个问题,在撰写此评论时,该版本是当前版本,使用 CSS 属性选择器和 `first-of-type` 选择器在同一个选择器中没有找到任何匹配项,但使用属性选择器或 `first-of-type` 选择器都找到了匹配项。在使用这两种选择器时,交换它们的顺序并没有帮助。
这是我的选择器
div#receipt table[print] tbody tr[header]:first-of-type th span