关于nth-child的疑惑
由 Ghostzhang 发表于
今天在CSS森林群有同学问了个问题:
👤 ζ”綉;財ヾ: nth-child 怎么选前三个
👤 Davin: :nth-child(-n+3)
👤 鬼-CSSForest: +4
正好很久没写代码了,也想试试回答下这个问题,于是就搜索了下,于是就找到了 W3School的CSS3 :nth-child() 选择器,看到了这样一个代码:
p:nth-child(-n+3){
background:#ff0000;
}
感觉有点奇怪,我原本以为应该会是前三个段落被选中,像这样:
一定是哪里不对了。来看看它的说明:
:nth-child(n) 选择器匹配属于其父元素的第 N 个子元素,不论元素的类型。 n 可以是数字、关键词或公式。
伪类:nth-clild(an+b)匹配在文档树中前面有an+b-1个兄弟元素的元素,此时n大于或等于0,并且该元素具有父元素。简而言之,该选择器匹配多个位置满足an+b的子元素。
span:nth-child(-n+3) 匹配前三个子元素中的span元素。
注意到一个特点——“具有父元素”,于是我们给这个例子中的<p>加个父元素试试:
element:nth-child(an + b) { /*规则*/ }
成功。也就是说nth-child从最大的父元素”body”开始,匹配“an+b”个元素,如果里面包含”element”,则对其应用样式规则。
以上,如果你想更可控的应用到“element”元素上,可以试试:
p:nth-of-type(-n+3){
background:#ff0000;
}
最后,在Useful :nth-child Recipes中的例子由于都是使用li,所以很容易就忽略了上面出现的问题,也是提个醒吧。
感谢CSS森林群里热情的同学。
👤 Davin: 前 3 个不是 -n+3 么? 怎么来个 +4 除非 有个不一样的 在前3个里面
👤 鬼-CSSForest: http://codepen.io/ghostzhang/pen/dobKaq
👤 Davin: 你把 h1 去了啊
👤 鬼-CSSForest: 把它变成子元素就可以了。
👤 Davin: 嗯 兄弟元素有不一样的不对了
👤 鬼-CSSForest: 也就是说(an+b)是直接取元素,而跟伪类前的element无关 嗯嗯
👤 Aoteman-大白: 本来就没关系呀 nth-child 不会在乎前面是什么标签
👤 鬼-CSSForest: 很容易误解啊,p:nth-child(-n+3) 不会理解成前三个p吗? 反正我是误解了
👤 Aoteman-大白: 那是你用少了,用多了就知道 nth-child 压根就不在乎 前面用的是什么,前面的p 选择就是 把p的 所有兄弟元素算成一个集合。
👤 鬼-CSSForest: 学到了
👤 鬼-CSSForest: 用li应该不会遇到这个问题,所以也容易被忽略
👤 诺兰德: 怪不得没注意,是这个问题
👤 鬼-CSSForest: 又一篇blog了~
👤 Davin: 理是这么个理 但人家说这些元素要有父元素
👤 鬼-CSSForest: body 哈哈
👤 Davin: 哈哈哈
👤 Aoteman-大白: 元素会有父元素的。因为有body和html
👤 Davin: you win
👤 Aoteman-大白: 记得提及我~求在高大上的blog里面露脸