Comment puis-je sélectionner tous les enfants d'un élément à l'exception du dernier enfant?


371

Comment pourrais-je sélectionner tout sauf le dernier enfant à l'aide des sélecteurs CSS3?

Par exemple, pour obtenir uniquement le dernier enfant serait div:nth-last-child(1).

Réponses:


690

Vous pouvez utiliser la pseudo-classe de négation:not() contre la :last-childpseudo-classe . Étant introduit CSS Selectors Level 3, il ne fonctionne pas dans IE8 ou ci-dessous:

:not(:last-child) { /* styles */ }

ceci est utilisé tel quel? Sans rien avant le premier colon?
johny pourquoi

vous ajouteriez ceci à votre sélecteur de base normal ( divdans l'exemple OP)
Dallas

2
Pour ceux qui utilisent SASS, vous pouvez utiliser l' &:not(:last-child) { /* styles * }intérieur de l'élément que vous souhaitez affecter.
Martin James

100

Faites simple:

Vous pouvez appliquer votre style à tous les div et réinitialiser le dernier avec : last-child :

par exemple en CSS :

.yourclass{
    border: 1px solid blue;
}
.yourclass:last-child{
    border: 0;
}

ou dans SCSS :

.yourclass{
    border: 1px solid rgba(255, 255, 255, 1);
    &:last-child{
        border: 0;
    }
}
  • facile à lire / à retenir
  • rapide à exécuter
  • compatible avec le navigateur (IE9 + car il est toujours CSS3)

6
Pour moi au moins, cela a une mauvaise odeur de code. Vous appliquez sciemment une règle css à un élément que vous ne voulez pas, puis essayez de créer un autre calque pour l'annuler. Pour moi, c'est une mauvaise odeur de code. Je crains que ce type de codage css puisse conduire à de plus en plus difficile à maintenir css. En d'autres termes, vous créez un code de spaghetti css.
Alexander Bird

1
cela pourrait également fonctionner, mais le problème est que lorsque vous avez de nombreux styles CSS comme (bordure, couleur, taille de police, etc.), vous devrez réinitialiser le style CSS sur: last-child. Donc, la solution appropriée utilise: pas (: dernier enfant)
davecar21

33

La solution de Nick Craver fonctionne mais vous pouvez également l'utiliser:

:nth-last-child(n+2) { /* Your code here */ }

Chris Coyier de CSS Tricks a fait un bon : nième testeur pour cela.


Mozilla a une bonne définition de : n-dernier-enfant
Clint Pachl

1
Certaines personnes disent que le :notpseudo coûte très cher. Il pourrait donc être judicieux d'essayer de l'éviter autant que possible.
Neurotransmetteur

22

Quand IE9 arrivera, ce sera plus facile. Cependant, la plupart du temps, vous pouvez basculer le problème sur celui qui requiert: premier enfant et styliser le côté opposé de l'élément (IE7 +).



1

pour trouver des éléments du dernier, utilisez

<style>
ul li:nth-last-of-type(3n){ color:#a94442}  /**/
</style>

1

La solution de Nick Craver m'a donné ce dont j'avais besoin mais pour le rendre explicite pour ceux qui utilisent CSS-in-JS:

const styles = {
  yourClass: {
    /* Styles for all elements with this class */
    '&:not(:last-child)': {
      /* Styles for all EXCEPT the last element with this class */
    },
  },
};

1
.nav-menu li:not(:last-child){
    // write some style here
}

ce code doit appliquer le style à tous

  • sauf le dernier enfant

  • En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
    Licensed under cc by-sa 3.0 with attribution required.