我有一堆元素的类名红色,但我似乎不能选择class="red"使用以下CSS规则的第一个元素:
.home .red:第一个孩子{
边框:1px纯红色;
}
< div class = "家" >
< span >等等> < /跨度
< p class = "红色" >第一个< / p >
< p class = "红色" >第二< / p >
< p class = "红色" > < / p >第三
< p class = "红色" >第四< / p >
< / div >
这个选择器出了什么问题,我如何纠正它,以类红色为目标的第一个孩子?
正确答案是:
.red:first-child, :not(.red) + .red { border:5px solid red }
第一部分:如果元素是父元素的第一个,并且类为“red”,它将得到border。
第二部分:If "。红色“元素不是其父元素的第一个,而是紧跟着一个没有类的元素”。红色”,它也应该配得上说边界的荣誉。
不然就是没发生。
菲利普·多布梅尔的回答,虽然被接受,但并不正确-见附件小提琴。
BoltClock的答案可以工作,但不必要地定义和覆盖样式
(特别是一个问题,否则它将继承一个不同的边界-你不想声明other to border:none)
编辑:
如果你有“红色”后面的非红色几次,每个“第一个”红色将得到边界。为了防止这种情况,我们需要使用BoltClock的答案。看到小提琴
总之,在阅读了这所有的页面和其他的以及大量的文档之后。总结如下:
对于第一个/最后一个子代:现在可以安全使用(所有现代浏览器都支持)
:n -child()现在也可以安全使用(所有现代浏览器都支持)。但要小心,它甚至计算兄弟姐妹!因此,下面的代码将无法正常工作:
/*选择display_class类的前2个元素
*但这行不通,因为第n个孩子甚至算兄弟姐妹
*包括第一个div skip_class
* /
.display_class: nth-child (n + 2) {
背景颜色:绿色;
}
< ul >
<li class="skip_class">test 1</li>
<li class="display_class">test 2应为绿色</li>
<li class="display_class">test 3应为绿色</li>
<li class="display_class">test 4</li>
< / ul >
目前,有一个选择器:n -child(-n+2 of .foo),它支持按类选择,但现代浏览器不支持,所以没有用。
所以,这给我们留下了Javascript解决方案(我们将修复上面的例子):
// Here we'll go through the elements with the targeted class
// and add our classmodifer to only the first 2 elements!
[...document.querySelectorAll('.display_class')].forEach((element,index) => {
if (index < 2) element.classList.add('display_class--green');
});
.display_class--green {
background-color:green;
}
<ul>
<li class="skip_class">test 1</li>
<li class="display_class">test 2 should be in green</li>
<li class="display_class">test 3 should be in green</li>
<li class="display_class">test 4</li>
</ul>
下面的代码肯定在任何地方都能正常工作。
它简单而简短。
<div class="home">
<span>blah</span>
<p class="blue"> first-blue </p>
<p class="blue"> second-blue </p>
<p class="blue"> third-blue </p>
<p class="red"> first-red </p>
<p class="red"> second-red </p>
<p class="red"> third-red </p>
<p class="red"> fourth-red </p>
<p class="pink"> first-pink </p>
<p class="pink"> second-pink </p>
<p class="red"> new-first-red </p>
<p class="red"> new-second-red </p>
</div>
我们可以选择第一个红色:
.home .red:not(.home .red ~ .red) {
background-color: blue;
}
如果你想选择new-first-red,你应该使用+而不是~。