Вибір останнього довідника CSS: виберіть останній елемент конкретного класу, а не останню дочірню частину батька?


176
<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>

Я хочу вибрати #com19?

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

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

Це не працює, якщо у мене div.somethingв коментарі списку є ще одна фактична остання дитина. Чи можливо в цьому випадку використовувати селектор останньої дитини для вибору останньої появи article.comment?

jsFiddle

Відповіді:


229

:last-childпрацює лише тоді, коли розглянутий елемент є останньою дочіркою контейнера, а не останньою для конкретного типу елемента. Для цього ти хочеш:last-of-type

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

Відповідно до коментаря @ BoltClock, це лише перевірка останнього articleелемента, а не останнього елемента з класом .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>


146
Він не дивиться на клас, а лише на тип, тому якщо у вас трапляються не-статті з одним класом, ви отримаєте несподівані результати.
BoltClock

1
Працює правильно. Однак якщо нам вони потрібні, щоб звузити елементи за класом, це не спрацює знову. jsfiddle.net/aliemreeee/a4H7f/2
Алі Емре Çakmakoğlu

12
Грунтуючись на цих відповідях, я припускаю, що немає способу відбору last-of-class.
toobulkeh

14
не до CSS селектори рівень 4 прийнятий і реалізований в браузерах, де ви будете мати доступ до :nth-match(selector)і :nth-last-match(selector). Дивіться w3.org/TR/selectors4 для більш детальної інформації.
Кріс

1
А точніше, :nth-last-child(An+B of selector)як :nth-last-match()було відкинуто задовго до цього, але вони не покладалися на оновлення WD. Див stackoverflow.com/questions/21167159/css-nth-match-doesnt-work / ...
BoltClock

6

Якщо ви плаваєте елементи, ви можете змінити порядок

тобто float: right;замістьfloat: left;

А потім скористайтеся цим методом для вибору первістка класу.

/* 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;
}

Це насправді застосовується клас до ОСТАНОГО екземпляра лише тому, що він зараз у зворотному порядку.

Ось робочий приклад для вас:

<!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>

Зауважте, що це не спрацює, якщо плаваючі елементи будуть натиснуті на наступний рядок (тобто недостатньо горизонтального простору для плавання вправо / вліво)
Ozzy

.some-class~.some-classчудово працює для мене, коли повторюються лише 2 елементи.
Меломан

4

Я здогадуюсь, що найправильніша відповідь: Використовуйте :nth-child(або, в даному конкретному випадку, його аналог :nth-last-child). Більшість знає цього селектора лише за його першим аргументом, щоб захопити діапазон елементів на основі обчислення з n, але він може також взяти другий аргумент "[будь-якого CSS-селектора]".

Ваш сценарій може бути вирішений за допомогою цього селектора: .commentList .comment:nth-last-child(1 of .comment)

Але те, що технічно коректне, не означає, що ви можете використовувати його, оскільки цей селектор наразі реалізований лише в Safari.

Для подальшого читання:


1

Щось, на мою думку, слід прокоментувати тут, що працювало на мене:

Використовуйте :last-childкілька разів у потрібних місцях, щоб він завжди був останнім із останніх.

Візьмемо це для прикладу:

.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>


0

Що з цим рішенням?

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

@lsblsb, Ви використовуєте articleтут, так: not (: last-child) не потрібний для прикладу.
Евгеній Масленков

що робити, якщо елемент з класом somethingне існує в оригінальному HTML-коді і динамічно вставляється hover? Не вдасться це рішення провалити?
Fr0zenFyr

-1

якщо останній тип елемента також є статтею, last-of-typeне буде працювати, як очікувалося.

можливо я не дуже розумію, як це працює.

демонстрація

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.