我有一堆元素的类名红色,但我似乎不能选择class="red"使用以下CSS规则的第一个元素:

.home .red:第一个孩子{ 边框:1px纯红色; } < div class = "家" > < span >等等> < /跨度 < p class = "红色" >第一个< / p > < p class = "红色" >第二< / p > < p class = "红色" > < / p >第三 < p class = "红色" >第四< / p > < / div >

这个选择器出了什么问题,我如何纠正它,以类红色为目标的第一个孩子?


当前回答

你可以使用n -of-type(1),但要确定网站不需要支持IE7等,如果是这种情况,使用jQuery添加主体类,然后通过IE7主体类找到元素,然后元素名称,然后添加第n个子样式。

其他回答

总之,在阅读了这所有的页面和其他的以及大量的文档之后。总结如下:

对于第一个/最后一个子代:现在可以安全使用(所有现代浏览器都支持) :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="red">first</p>
  <p class="red">second</p>
  <p class="red">third</p>
  <p class="red">fourth</p>
</div>

这是你的工作

.home span + .red{
      border:3px solid green;
    }

这里有一个来自SnoopCode的CSS参考。

你可以使用first-of-type或n -of-type(1)

r { 颜色:绿色; } /* .red:n -of-type(1) */ r: first-of-type { 颜色:红色; } < div class = "家" > < span >等等> < /跨度 < p class = "红色" >第一个< / p > < p class = "红色" >第二< / p > < p class = "红色" > < / p >第三 < p class = "红色" >第四< / p > < / div >

我使用下面的CSS有一个背景图像列表ul li

#footer .module:nth-of-type(1)>.menu>li:nth-of-type(1){ background-position: center; background-image: url(http://monagentvoyagessuperprix.j3.voyagesendirect.com/images/stories/images_monagentvoyagessuperprix/layout/icon-home.png); background-repeat: no-repeat; } <footer id="footer"> <div class="module"> <ul class="menu "> <li class="level1 item308 active current"></li> <li> </li> </ul> </div> <div class="module"> <ul class="menu "><li></li> <li></li> </ul> </div> <div class="module"> <ul class="menu "> <li></li> <li></li> </ul> </div> </footer>

正确答案是:

.red:first-child, :not(.red) + .red { border:5px solid red }

第一部分:如果元素是父元素的第一个,并且类为“red”,它将得到border。 第二部分:If "。红色“元素不是其父元素的第一个,而是紧跟着一个没有类的元素”。红色”,它也应该配得上说边界的荣誉。

不然就是没发生。

菲利普·多布梅尔的回答,虽然被接受,但并不正确-见附件小提琴。 BoltClock的答案可以工作,但不必要地定义和覆盖样式 (特别是一个问题,否则它将继承一个不同的边界-你不想声明other to border:none)

编辑: 如果你有“红色”后面的非红色几次,每个“第一个”红色将得到边界。为了防止这种情况,我们需要使用BoltClock的答案。看到小提琴