Подтвердить что ты не робот

Nth-child не отвечает на класс

Можно ли использовать псевдоселектор nth-child для работы с определенным классом?

См. этот пример: http://jsfiddle.net/fZGvH/

Я хочу, чтобы второй DIV.red стал красным, но он не применяет цвет, как ожидалось.

Не только это, но когда вы укажете это, он изменяет 5-й DIV на красный:

div.red:nth-child(6)

Когда вы укажете это, он изменит 8-й DIV на красный:

div.red:nth-child(9)

Кажется, это один DIV. В примере есть только 8 тегов DIV, поэтому я не знаю, почему работает nth-child (9). Тестирование с использованием Firefox 3.6, но в моем фактическом производственном коде такая же проблема возникает в Chrome. Я не понимаю что-то о том, как это должно работать, было бы полезно разъяснить.

Кроме того, это изменит 6-й DIV на красный, но я действительно хочу, чтобы он изменил второй DIV.red на красный:

div.red:nth-of-type(6)

И я не понимаю, почему nth-child() и nth-of-type() отвечают по-разному, поскольку в документе всего восемь тегов одного и того же типа.

4b9b3361

Ответ 1

Нет способа фильтровать по классам в CSS, потому что нет селектора :nth-of-class(). Один из способов заключается в том, чтобы поместить ваши два разных типа div в свои собственные группы, а затем выбрать на основе этих групп. Например:

<div class="orange">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</div>

<div class="red">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</div>

С помощью этого селектора:

div.red div:nth-child(2) {
    background: red;
}

Относительно последнего вопроса:

И я не понимаю, почему nth-child() и nth-of-type() отвечают по-разному, поскольку в документе всего восемь тегов одного и того же типа.

Для кода, который вы там указываете, не должен быть любой разницей. Я тестировал его, и два псевдокласса работают должным образом. Но, в общем:

:nth-child() работает на полном уровне братьев и сестер без учета каких-либо других простых селекторов. Тогда, если n-й ребенок не относится к тому, что соответствует простым селекторам, ничего не сопоставляется.

:nth-of-type() работает на уровне братьев и сестер данного типа без учета других простых селекторов. Тогда, если n-й элемент, входящий в этот тип, не относится к тому, что соответствует простым селекторам, ничего не сопоставляется.

Ответ 2

Вы можете использовать общий комбинатор:

div,
div.red ~ div.red ~ div.red {
  background: gray;
}
div.red ~ div.red {
  background: red;
}

Это многословно, и вам нужно reset стили вернуться снова, но это может быть полезно в некоторых особых ситуациях.

Он может быть автоматизирован с помощью препроцессора CSS, и если я правильно понимаю gzip, поскольку вывод CSS просто повторяет тот же текст, размер файла gziped не должен быть ужасно большим, если вы его не используете много.

Ответ 3

Есть более простое решение, которое я нашел, чтобы работать с моим div без каких-либо специальных строк кода.

.red div:nth-child(6) {background-color:#ccc;}
.red div:nth-child(9) {background-color:#eee;}

работает просто отлично, без div впереди.

Ответ 4

<div class="alpha">
  <div class="beta"></div>
  <div class="beta"></div>
  <div class="beta"></div>
  <div class="beta"></div>
  <div class="beta"></div>
</div>

... если вы хотите сортировать div.beta на nth-child, вы должны установить по крайней мере width = auto на div.alpha, возможно, он работает.