CSS sélectionner tous les éléments enfant sauf les deux premiers et les deux derniers

je suis très curieux (c'est tout) de voir comment vous choisiriez tous les enfants d'un élément sauf les deux premiers et les deux derniers.

j'ai une méthode, mais c'est méchant et illisible. Il doit y avoir une méthode beaucoup plus claire qui n'a pas besoin de 8 pseudo-sélecteurs.

:not(:nth-child(1)):not(:nth-child(2)):not(:nth-last-child(1)):not(:nth-last-child(2)) {
    background: purple;
}

Oui, c'est assez horrible. Il sélectionne littéralement tous les éléments qui sont :pas le premier ou le deuxième Premier ou le dernier. Il doit y avoir une méthode qui utilise <!-Comme une demi-variable, au lieu de empilage de pseudo-sélecteurs.

j'ai pensé à un autre (toujours en désordre):

:not(:nth-child(-1n+2)):not(:nth-last-child(-1n+2)) {
    background: purple;
}
22
demandé sur BoltClock 2013-03-25 01:01:14

3 réponses

vous n'avez même pas besoin de :not(). :nth-child(n+3):nth-last-child(n+3) fonctionne très bien.

Check it out ici.

33
répondu spikyjt 2016-10-26 22:30:32

je ne vois pas d'autre option que d'utiliser :nth-child et :not(:nth-last-child).

ma version:hr:nth-child(n+3):not(:nth-last-child(-n+2))

DEMO

Selon :nth-child référence:

:nth-child la pseudo-classe CSS correspond à un élément qui a an+b-1 fratries avant lui dans l'arborescence des documents, pour une valeur positive ou zéro donnée pour n, et a un élément parent.

En d'autres termes, cette classe correspond à tous les enfants dont l'indice de chute dans l'ensemble { an + b; ∀n ∈ N }.

nth-child(n+3) correspond à tous les éléments, à partir de la troisième.

:nth-last-child fonctionne similaire, mais de la fin de la collection d'éléments, donc :nth-last-child(-n+3) correspond à seulement 2 éléments à partir de la fin de la collecte. En raison de :not ces 2 éléments sont exclus du sélecteur.

20
répondu MarcinJuraszek 2013-03-24 21:24:41

Vous pouvez simplement mettre votre violet à tous les éléments, puis l'enlever des 3 éléments indésirables:

element { background: purple }
element:first-child, element:nth-child(2), element:last-child, element:nth-last-child(2) {
   background: none; /* or whatever you want as background for those */
}

Thats imho beaucoup plus facile à lire

3
répondu darthmaim 2013-03-24 21:22:03