不是:第一个孩子选择器


810

我有一个div包含多个ul标签的标签。

ul只能为第一个标记设置CSS属性:

div ul:first-child {
    background-color: #900;
}

但是,我以下尝试为ul除第一个标签之外的其他每个标签设置CSS属性不起作用:

div ul:not:first-child {
    background-color: #900;
}

div ul:not(:first-child) {
    background-color: #900;
}

div ul:first-child:after {
    background-color: #900;
}

如何在CSS中编写“除第一个元素外的每个元素”?

Answers:


1413

一个您发布的版本的实际工作为所有现代浏览器(如CSS选择3级支持):

div ul:not(:first-child) {
    background-color: #900;
}

如果您需要支持旧版浏览器,或者由于:not选择器的限制(仅接受一个简单的选择器作为参数)而受到阻碍,则可以使用另一种技术:

定义一个范围比您想要的更大的规则,然后有条件地“撤销”它,将其范围限制为您想要的:

div ul {
    background-color: #900;  /* applies to every ul */
}

div ul:first-child {
    background-color: transparent; /* limits the scope of the previous rule */
}

限制范围时,请为您设置的每个CSS属性使用默认值


您是否确切知道不支持哪个版本?
Simon_Weaver

9
@Simon_Weaver:实际上,除了IE <9之外的所有东西都支持它。caniuse.com是获得此类信息的绝佳资源。
2014年

2
嗯..注意第一个解决方案的限制:caniuse.com/#feat=css-not-sel-list第二个听起来对我来说更合理。谢谢!
iorrah

@iorrah,您的caniuse链接用于选择器列表,是的,支持仍然非常有限。OP未使用选择器列表。因此,我认为https://caniuse.com/#feat=css-sel3在IE8以后的日子里,如果有强大的支持,它会更合适。
secretwep

即使chrome开头没有div元素,此方法也可以工作。
Achraf JEDAY

157

这个CSS2解决方案(“ ul另一个ul”)也可以使用,并且得到更多浏览器的支持。

div ul + ul {
  background-color: #900;
}

不同于:not:nth-sibling,IE7 +支持相邻的兄弟选择器

如果您在页面加载后用JavaScript更改了这些属性,则应查看IE7IE8实现中的一些已知错误。 请参阅此链接

对于任何静态网页,这应该都能正常工作。


4
@Leven:那个quirksmode链接说它应该在IE7中工作,但是只能是静态的。如果您的JS在其前面放置了另一个元素,则可能无法正确更新。那是您看到的问题吗?
亚历克斯奎因

可能值得注意的是,在一系列元素(例如:ul ul div ul这些元素是同级元素)中,将仅选择第二个ul,因为最后一个ul ul本身没有其前一个字符
Brian H.

79

由于IE6-8:not不接受,因此我建议您这样做:

div ul:nth-child(n+2) {
    background-color: #900;
}

因此,您可以选择ul其父元素中的每个元素(第一个元素除外)

有关更多示例,请参阅Chris Coyer的“有用的第n个孩子的食谱”一文。nth-child


谁仍然在2019年仍在使用IE6-8?
oldboy

14
考虑到答案是从2013年开始的?
aasukisuki


14

not(:first-child)似乎不再起作用。至少使用更新版本的Chrome和Firefox。

相反,请尝试以下操作:

ul:not(:first-of-type) {}

6
它们都起作用,但是它们具有不同的含义。ul:not(:first-child)字面意思是“ ul不是其父级的第一个子元素的任何元素”,因此,ul如果第一个元素前面有另一个元素(p,标题等),则它甚至不会匹配第一个。相反,ul:not(:first-of-type)是指“ 容器中ul除第1个元素之外的任何元素ul”。您认为OP可能需要后一种行为是正确的,但是您的解释颇具误导性。
Ilya Streltsyn

9

您可以将任何选择器用于 not

p:not(:first-child){}
p:not(:first-of-type){}
p:not(:checked){}
p:not(:last-child){}
p:not(:last-of-type){}
p:not(:first-of-type){}
p:not(:nth-last-of-type(2)){}
p:not(nth-last-child(2)){}
p:not(:nth-child(2)){}

4

以上这些我没有运气,

这是唯一真正为我工作的人

ul:not(:first-of-type) {}

当我尝试使页面上显示的第一个按钮不受左空白选项影响时,这对我有用。

这是我首先尝试的选项,但是没有用

ul:not(:first-child)


4

您可以将选择器与:not波纹管一起使用,也可以在内部使用任何选择器:not()

any_CSS_selector:not(any_other_CSS_selector){
    /*YOUR STYLE*/
}

您也可以:not不使用父选择器。

   :not(:nth-child(2)){
        /*YOUR STYLE*/
   }

更多例子

any_CSS_selector:not(:first-child){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:first-of-type){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:checked){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:last-child){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:last-of-type){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:first-of-type){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:nth-last-of-type(2)){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:nth-last-child(2)){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:nth-child(2)){
    /*YOUR STYLE*/
}

0

如我所用,这ul:not(:first-child)是一个完美的解决方案。

div ul:not(:first-child) {
    background-color: #900;
}

为什么如此完美,因为通过使用ul:not(:first-child),我们可以将CSS应用于内部元素。像li, img, span, a标签等

但是,当使用其他解决方案时:

div ul + ul {
  background-color: #900;
}

div li~li {
    color: red;
}

ul:not(:first-of-type) {}

div ul:nth-child(n+2) {
    background-color: #900;
}

这些仅限制ul级CSS。假设我们不能将CSS应用于li`div ul + ul li'。

对于内部层元素,第一个解决方案可以完美地工作。

div ul:not(:first-child) li{
        background-color: #900;
    }

等等 ...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.