<ul>
<li class="list">test1</li>
<li class="list">test2</li>
<li class="list">test3</li>
<li>test4</li>
</ul>
Comment sélectionner le "dernier enfant" avec le nom de la classe: list?
<style>
ul li.list:last-child{background-color:#000;}
</style>
Je sais que l'exemple ci-dessus ne fonctionne pas, mais y a-t-il quelque chose de similaire à cela qui fonctionne?
IMPORTANT:
a) Je ne peux pas utiliser ul li:nth-child(3)
, car il se peut que ce soit également à la quatrième ou à la cinquième place.
b) Pas de JavaScript.
Toute aide serait appréciée Merci!
Je vous suggère de tirer parti du fait que vous pouvez affecter plusieurs classes à un élément, comme ceci:
<ul>
<li class="list">test1</li>
<li class="list">test2</li>
<li class="list last">test3</li>
<li>test4</li>
</ul>
Le dernier élément a la classe list
comme ses frères mais aussi la classe last
que vous pouvez utiliser pour définir la propriété CSS de votre choix, comme ceci:
ul li.list {
color: #FF0000;
}
ul li.list.last {
background-color: #000;
}
Cela peut être fait en utilisant un sélecteur d'attribut.
[class~='list']:last-of-type {
background: #000;
}
Le class~
sélectionne un mot entier spécifique. Cela permet à votre élément de liste d'avoir plusieurs classes si nécessaire, dans un ordre différent. Il trouvera toujours la "liste" de classe exacte et appliquera le style à la dernière.
Voir un exemple de travail ici: http://codepen.io/chasebank/pen/ZYyeab
En savoir plus sur les sélecteurs d'attributs:
http://css-tricks.com/attribute-selectors/http://www.w3schools.com/css/css_attribute_selectors.asp
Vous pouvez utiliser le sélecteur de fratrie adjacent pour obtenir quelque chose de similaire, qui pourrait vous aider.
.list-item.other-class + .list-item:not(.other-class)
Va effectivement cibler l'élément immédiatement après le dernier élément avec la classe other-class
.
Lisez plus ici: https://css-tricks.com/almanac/selectors/a/adjacent-sibling/
C'est une réponse insolente, mais si vous êtes limité à CSS et capable d'inverser vos éléments dans le DOM, cela peut valoir la peine d'être envisagé. Il repose sur le fait que, bien qu’il n’existe aucun sélecteur pour l’élément last d’une classe spécifique, il est en réalité possible de styliser le first. L'astuce consiste ensuite à utiliser flexbox pour afficher les éléments dans l'ordre inverse.
ul {
display: flex;
flex-direction: column-reverse;
}
/* Apply desired style to all matching elements. */
ul > li.list {
background-color: #888;
}
/* Using a more specific selector, "unstyle" elements which are not the first. */
ul > li.list ~ li.list {
background-color: inherit;
}
<ul>
<li class="list">0</li>
<li>1</li>
<li class="list">2</li>
</ul>
<ul>
<li>0</li>
<li class="list">1</li>
<li class="list">2</li>
<li>3</li>
</ul>
Je suppose que la réponse la plus correcte est: Utilisez :nth-child
(Ou, dans ce cas précis, son pendant :nth-last-child
). La plupart ne connaissent ce sélecteur que par son premier argument pour saisir une plage d'éléments basée sur un calcul avec n, mais il peut également prendre un second argument "de [tout sélecteur CSS]".
Votre scénario pourrait être résolu avec ce sélecteur: li:nth-last-child(1 of .list)
Mais être techniquement correct ne signifie pas que vous puissiez l’utiliser, car ce sélecteur est à présent uniquement implémenté dans Safari.
Pour en savoir plus:
Vous ne pouvez pas cibler la dernière instance du nom de la classe dans votre liste sans JS.
Cependant, il se peut que vous ne manquiez pas totalement de chance, selon ce que vous souhaitez réaliser. Par exemple, en utilisant le sélecteur de fratrie suivant, j’ai ajouté un diviseur visuel après le dernier de vos .list
éléments ici: http://jsbin.com/vejixisudo/edit?html,css,output
Utilisez ce sélecteur: ul > li:last-of-type
. Ceci sélectionnera chaque dernier élément de la liste (<li>
) dans une liste non ordonnée (<ul>
).
Ventilation de la réponse: je ne sélectionne que l'enfant (>
) d’une liste non ordonnée (<ul>
) qui est le dernier enfant de son type (<li>
) de l'élément parent (<ul>
).
Vous pouvez utiliser un ID ou une classe pour restreindre le sélecteur à certaines listes non ordonnées. Par exemple: ul.my-class > li:last-of-type
choisira le dernier <li>
uniquement à partir des listes non ordonnées de cette classe
Bien que cela ne réponde pas directement à la question, il existe une forte probabilité que cette façon de penser atteigne le même objectif:
Disons que nous sommes allés cacher tous les éléments de la liste inférieurs à index 3
<ul>
<li>test1</li>
<li>test2</li>
<li class="hide">test3</li>
<li>test4</li>
<li>test5</li>
</ul>
li{ display:none; }
li.hide ~ li{ display:block; }
Cela éliminera la nécessité d'ajouter une classe hide
à tous les éléments devant être masqués. Il ne nous reste donc qu'une classe, hide
, qui les gouverne tous. maintenant, vous n'avez pas besoin d'utiliser le last-of-type
qui ne peut pas fonctionner avec les noms de classe. vous devez repenser votre approche de la classification des choses