262 votes

Comment puis-je sélectionner le dernier élément avec une classe spécifique, et non le dernier enfant à l'intérieur du parent ?

<div class="commentList">
   <article class="comment " id="com21"></article>
   <article class="comment " id="com20"></article>
   <article class="comment " id="com19"></article>
   <div class="something"> hello </div>
</div>

Je veux sélectionner #com19 ?

.comment {
    width:470px;
    border-bottom:1px dotted #f0f0f0;
    margin-bottom:10px;
}

.comment:last-child {
    border-bottom:none;
    margin-bottom:0;
}

Cela ne fonctionne pas tant que j'ai un autre div.something comme dernier enfant de la liste des commentaires. Est-il possible d'utiliser le sélecteur last-child dans ce cas pour sélectionner la dernière apparition de article.comment ?

jsFiddle

0 votes

297voto

Chris Points 3992

:last-child ne fonctionne que lorsque l'élément en question est le dernier enfant du conteneur, et non le dernier d'un type d'élément spécifique. Pour cela, il faut :last-of-type

http://jsfiddle.net/C23g6/3/

Selon le commentaire de @BoltClock, cela ne vérifie que le dernier numéro de téléphone de l'entreprise. article et non le dernier élément dont la classe est .comment .

body {
  background: black;
}

.comment {
  width: 470px;
  border-bottom: 1px dotted #f0f0f0;
  margin-bottom: 10px;
}

.comment:last-of-type {
  border-bottom: none;
  margin-bottom: 0;
}

<div class="commentList">
  <article class="comment " id="com21"></article>

  <article class="comment " id="com20"></article>

  <article class="comment " id="com19"></article>

  <div class="something"> hello </div>
</div>

222 votes

Cependant, il ne tient pas compte de la classe, mais uniquement du type. Par conséquent, si vous avez d'autres articles avec la même classe, vous obtiendrez des résultats inattendus.

1 votes

Il fonctionne correctement. Cependant, si nous avons besoin qu'ils réduisent les éléments par classe, cela ne fonctionne plus. jsfiddle.net/aliemreeee/a4H7f/2

23 votes

Sur la base de ces réponses, je présume qu'il n'y a aucun moyen de sélectionner last-of-class .

17voto

hurrtz Points 364

Je suppose que la réponse la plus correcte est : Utiliser :nth-child (ou, dans ce cas précis, son homologue :nth-last-child ). La plupart des gens ne connaissent ce sélecteur que par son premier argument, qui permet de sélectionner une plage d'éléments sur la base d'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 : .commentList .comment:nth-last-child(1 of .comment)

Mais être techniquement correct ne signifie pas que vous pouvez l'utiliser, car ce sélecteur n'est pour l'instant implémenté que dans Safari.

Pour en savoir plus :

8voto

Ozzy Points 4358

Si vous faites flotter les éléments, vous pouvez inverser l'ordre.

c'est-à-dire float: right; au lieu de float: left;

Et ensuite, utilisez cette méthode pour sélectionner le premier enfant d'une classe.

/* 1: Apply style to ALL instances */
#header .some-class {
  padding-right: 0;
}
/* 2: Remove style from ALL instances except FIRST instance */
#header .some-class~.some-class {
  padding-right: 20px;
}

Il s'agit en fait d'appliquer la classe à la DERNIÈRE instance seulement parce que l'ordre est maintenant inversé.

Voici un exemple concret pour vous :

<!doctype html>
<head><title>CSS Test</title>
<style type="text/css">
.some-class { margin: 0; padding: 0 20px; list-style-type: square; }
.lfloat { float: left; display: block; }
.rfloat { float: right; display: block; }
/* apply style to last instance only */
#header .some-class {
  border: 1px solid red;
  padding-right: 0;
}
#header .some-class~.some-class {
  border: 0;
  padding-right: 20px;
}
</style>
</head>
<body>
<div id="header">
  <img src="some_image" title="Logo" class="lfloat no-border"/>
  <ul class="some-class rfloat">
    <li>List 1-1</li>
    <li>List 1-2</li>
    <li>List 1-3</li>
  </ul>
  <ul class="some-class rfloat">
    <li>List 2-1</li>
    <li>List 2-2</li>
    <li>List 2-3</li>
  </ul>
  <ul class="some-class rfloat">
    <li>List 3-1</li>
    <li>List 3-2</li>
    <li>List 3-3</li>
  </ul>
  <img src="some_other_img" title="Icon" class="rfloat no-border"/>
</div>
</body>
</html>

0 votes

Notez cependant que cela ne fonctionnera pas si les éléments flottants sont poussés sur la ligne suivante (c'est-à-dire s'il n'y a pas assez d'espace horizontal pour flotter à droite ou à gauche).

0 votes

.some-class~.some-class fonctionne très bien pour moi lorsque seulement 2 éléments sont répétés.

7voto

A Friend Points 631

Il y a quelque chose qui devrait être commenté ici et qui a fonctionné pour moi :

Utilisez :last-child plusieurs fois aux endroits nécessaires pour qu'il obtienne toujours le dernier des derniers.

Prenons l'exemple suivant :

.page.one .page-container .comment:last-child {
  color: red;
}
.page.two .page-container:last-child .comment:last-child {
  color: blue;
}

<p> When you use .comment:last-child </p>
<p> you only get the last comment in both parents </p>

<div class="page one">
  <div class="page-container">
    <p class="comment"> Something </p>
    <p class="comment"> Something </p>
  </div>

  <div class="page-container">
    <p class="comment"> Something </p>
    <p class="comment"> Something </p>
  </div>
</div>

<p> When you use .page-container:last-child .comment:last-child </p>
<p> you get the last page-container's, last comment </p>

<div class="page two">
  <div class="page-container">
    <p class="comment"> Something </p>
    <p class="comment"> Something </p>
  </div>

  <div class="page-container">
    <p class="comment"> Something </p>
    <p class="comment"> Something </p>
  </div>
</div>

1voto

lsblsb Points 602

Que pensez-vous de cette solution ?

div.commentList > article.comment:not(:last-child):last-of-type
{
    color:red; /*or whatever...*/
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X