not: seletor do primeiro filho

811

Eu tenho uma divtag contendo várias ultags.

Eu sou capaz de definir propriedades CSS apenas para a primeira ultag:

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

No entanto, minhas tentativas a seguir para definir propriedades CSS para cada outra ultag, exceto a primeira, não funcionam:

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

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

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

Como posso escrever em CSS: "cada elemento, exceto o primeiro"?

Oto Shavadze
fonte

Respostas:

1415

Uma das versões que você postou realmente funciona para todos os navegadores modernos (onde os seletores de CSS nível 3 são suportados ):

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

Se você precisar oferecer suporte a navegadores herdados ou se estiver prejudicado pela limitação:not do seletor (ele aceita apenas um seletor simples como argumento), poderá usar outra técnica:

Defina uma regra que tenha escopo maior do que o pretendido e, em seguida, "revogue" condicionalmente, limitando o escopo ao que você pretende:

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

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

Ao limitar o escopo, use o valor padrão para cada atributo CSS que você está configurando.

Jon
fonte
você sabe exatamente em quais versões isso não é suportado?
21914 Simon_Weaver
9
@ Simon_Weaver: Na prática, tudo menos o IE <9 suporta isso. Um ótimo recurso para obter esse tipo de informação é caniuse.com .
Jon
2
Hmm .. atente para as restrições da primeira solução: caniuse.com/#feat=css-not-sel-list A segunda parecia mais razoável para mim. Obrigado!
iorrah
@iorrah, seu link caniuse é para uma lista de seletores e, sim, o suporte ainda é muito limitado. O OP não está usando uma lista de seletores. Então, acho que https://caniuse.com/#feat=css-sel3 é mais apropriado com grande suporte além dos dias do IE8.
secretwep 13/01
Isso funciona mesmo sem o elemento div no início no chrome.
Achraf JEDAY 22/01
158

Esta solução CSS2 ("qualquer ulapós a outra ul") também funciona e é suportada por mais navegadores.

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

Ao contrário :note :nth-sibling, o selector de irmão adjacente é suportado por IE 7 +.

Se o JavaScript alterar essas propriedades após o carregamento da página, observe alguns erros conhecidos nas implementações do IE7 e IE8 . Veja este link .

Para qualquer página estática da web, isso deve funcionar perfeitamente.

Alex Quinn
fonte
4
@ Steven: Esse link quirksmode diz que deve funcionar no IE7, mas apenas estaticamente. Se o seu JS colocar outro elemento na frente dele, ele pode não ser atualizado corretamente. Foi esse o problema que você viu?
Alex Quinn
pode ser interessante notar que em uma sequência de elementos como: ul ul div ul(onde esses elementos são irmãos), apenas o segundo ul será selecionado, pois o último não possui um ulanterior a si próprio
Brian H.
79

Como :notnão é aceito pelo IE6-8 , sugiro o seguinte:

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

Então você escolhe cada ulelemento pai, exceto o primeiro .

Consulte o artigo "Útil: Receitas da nona criança" de Chris Coyer para obter mais nth-child exemplos .

ed1nh0
fonte
quem ainda usa o IE6-8 em 2019?
Oldboy
15
Considerando que a resposta foi de 2013?
aasukisuki
18
div li~li {
    color: red;
}

Suporta IE7

zloctb
fonte
14

not(:first-child)parece não funcionar mais. Pelo menos com as versões mais recentes do Chrome e Firefox.

Em vez disso, tente o seguinte:

ul:not(:first-of-type) {}
Vinny Troia
fonte
6
Ambos trabalham, mas têm um significado diferente. ul:not(:first-child)significa literalmente "qualquer ulelemento que não seja o primeiro filho de seu pai", portanto, ele não corresponderá nem ao primeiro ulse for precedido por outro elemento ( p, cabeçalho etc.). Pelo contrário, ul:not(:first-of-type)significa "qualquer ulelemento, exceto o 1º ulno contêiner". Você está certo de que o OP provavelmente precisava do último comportamento, mas sua explicação é bastante enganadora.
Ilya Streltsyn
9

Você pode usar qualquer seletor com 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)){}
Nasser Ali Karimi
fonte
4

Não tive sorte com algumas das opções acima,

Este foi o único que realmente funcionou para mim

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

Isso funcionou para mim quando eu estava tentando fazer com que o primeiro botão exibido na página não fosse afetado por uma opção de margem esquerda.

esta foi a opção que tentei primeiro, mas não funcionou

ul:not(:first-child)

newtron54
fonte
4

Você pode usar o seletor com o :notseguinte, você pode usar qualquer seletor dentro do:not()

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

você também pode usar :notsem o seletor principal.

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

Mais exemplos

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*/
}
Nasser Ali Karimi
fonte
0

Como eu usei ul:not(:first-child)é uma solução perfeita.

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

Por que isso é perfeito porque, usando ul:not(:first-child), podemos aplicar CSS em elementos internos. Como li, img, span, atags etc.

Mas quando usadas outras soluções:

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

e

div li~li {
    color: red;
}

e

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

e

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

Eles restringem apenas o nível ul do CSS. Suponha que não possamos aplicar CSS licomo `div ul + ul li '.

Para elementos de nível interno, a primeira solução funciona perfeitamente.

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

e assim por diante ...

Gufran Hasan
fonte