Выберите каждый элемент N в CSS

Можно ли выбрать, скажем, каждый четвертый элемент в наборе элементов?

Пример: у меня есть 16 <div> элементов... Я мог бы написать что-то вроде.

div:nth-child(4),
div:nth-child(8),
div:nth-child(12),
div:nth-child(16)

Есть ли лучший способ сделать это?

Ответ 1

Как следует из названия, :nth-child() позволяет построить арифметическое выражение с использованием переменной n в дополнение к постоянным числам. Вы можете выполнить добавление (+), вычитание (-) и умножение коэффициентов (an где a - целое число, включая положительные числа, отрицательные числа и нуль).

Здесь вы можете переписать список селекторов выше:

div:nth-child(4n)

Для объяснения того, как работают эти арифметические выражения, см. мой ответ на этот вопрос, а также спецификации.

Обратите внимание, что этот ответ предполагает, что все дочерние элементы в одном и том же родительском элементе имеют один и тот же тип элемента, div. Если у вас есть другие элементы разных типов, такие как h1 или p, вам нужно будет использовать :nth-of-type() вместо :nth-child(), чтобы убедиться, что вы только считаете div элементами:

<body>
  <h1></h1>
  <div>1</div>  <div>2</div>
  <div>3</div>  <div>4</div>
  <h2></h2>
  <div>5</div>  <div>6</div>
  <div>7</div>  <div>8</div>
  <h2></h2>
  <div>9</div>  <div>10</div>
  <div>11</div> <div>12</div>
  <h2></h2>
  <div>13</div> <div>14</div>
  <div>15</div> <div>16</div>
</body>

Для всего остального (классы, атрибуты или любая их комбинация), где вы ищете n-й дочерний элемент, который соответствует произвольному селектору, вы не сможете сделать это с помощью чистого селектора CSS. См. Мой ответ на этот вопрос.


Между прочим, между 4n и 4n + 4 не существует большой разницы относительно :nth-child(). Если вы используете переменную n, она начинает отсчет в 0. Это то, что каждый селектор будет соответствовать:

:nth-child(4n)

4(0) = 0
4(1) = 4
4(2) = 8
4(3) = 12
4(4) = 16
...

:nth-child(4n+4)

4(0) + 4 = 0  + 4 = 4
4(1) + 4 = 4  + 4 = 8
4(2) + 4 = 8  + 4 = 12
4(3) + 4 = 12 + 4 = 16
4(4) + 4 = 16 + 4 = 20
...

Как вы можете видеть, оба селектора будут соответствовать тем же элементам, что и выше. В этом случае нет разницы.

Ответ 3

Попробуйте

div:nth-child(4n+4)

Ответ 4

Вам нужен правильный аргумент для псевдо-класса nth-child.

  • Аргумент должен быть в форме an + b для соответствия каждому дочернему элементу th начиная с b.

  • Оба a и b являются необязательными целыми числами, и оба могут быть нулевыми или отрицательными.

    • Если a равно нулю, то не существует "каждый a th child".
    • Если a отрицательно, то сопоставление выполняется назад, начиная с b.
    • Если b равно нулю или отрицательно, тогда можно написать эквивалентное выражение, используя положительный b, например. 4n+0 совпадает с 4n+4. Аналогично 4n-1 совпадает с 4n+3.

Примеры:

Выберите каждый 4-й ребенок (4, 8, 12,...)

li:nth-child(4n) {
  background: yellow;
}
<ol>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
</ol>