Css not nth child: css selectors — CSS how to use pseudo-class :not with :nth-child
:not() — CSS | MDN
Отрицательный CSS псевдо-класс, :not(X)
— функция, принимающая простой селектор X в качестве аргумента. Он находит элементы, не соответствующие селектору. X не должен содержать других отрицательных селекторов.
- С этого псевдокласса можно написать бесполезные селекторы. Например,
:not(*)
найдёт любой элемент, являющийся не любым, то есть правило не применится ни к одному элементу. - Возможно переписать другие правила. Например
foo:not(bar)
найдёт тот же элемент, что и простойfoo
. Тем не менее специфичность первого выше. :not(foo){}
найдёт что угодно, что неfoo
, включая<html>
и<body>
.- Это селектор применяется только к одному элементу. Вы не можете использовать его, чтобы исключить всех родителей. Например,
body :not(table) a
<tr>
будет соответствовать:not()
части селектора.
:not(selector) { style properties }
p:not(.classy) { color: red; }
body :not(p) { color: green; }
CSS выше и HTML ниже…
<p>Некоторый текст.</p>
<p>Какой-то другой текст.</p>
<span>Ещё текст<span>
Выведет это:
Возможность | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Базовая поддержка | 1.0 | 1.0 (1.7 или ранее) | 9.0 | 9.5 | 3.2 |
Расширенные аргументы | Нет | Нет | Нет | Нет | Нет |
Возможность | Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
Базовая поддержка | 2.1 | 1. 0 (1) | 9.0 | 10.0 | 3.2 |
Расширенные аргументы | Нет | Нет | Нет | Нет | Нет |
CSS-селектор :not. Полезные примеры
В спецификации и блогах про селектор :not
обычно приводят какие-то искусственные примеры, которые хоть и объясняют синтаксис и принцип действия, но не несут никакой идеи о том, как получить пользу от нового селектора.
Например:
p:not(.classy) { color: red; }
Ну окей, думаю я, в моей практике не встречались такие ситуации. Обходились мы ведь как-то раньше без :not
. Приходилось немного переписать структуру селекторов или обнулить пару значений.
Пример 1. Элемент без класса
Селектор :not
может быть крайне полезен, когда нам нужно застилить контент сгенерированный пользователем (нет возможности расставить в нем классы), или когда у нас контента очень много и расставлять в нем классы слишком трудоёмко.
Например, мы хотим на сайте сделать красивые буллиты для ненумерованных списков ul li
. Мы пишем код:
ul li { }
В результате, наши красивые буллиты появляются не только в контенте, но и, например, в навигации, где тоже используются
.
Мы ограничиваем область действия селектора:
.content ul li { }
Навигацию мы спасли, но ненужные буллиты всё еще вылазят на слайдерах, списках новостей и других конструкциях внутри .content
, где тоже используются ul li
.
Далее у нас варианты:
1) обнулить мешающие стили в слайдерах и других местах. Но это противоречит «DRY» и является одним из признаков «вонючего» кода. К тому же не решает проблему раз и навсегда: добавите, например, аккордеон и списки в нем снова придется обнулять.
2) пойти от обратного и ставить класс всем спискам, которые нужно стилизовать:
. textlist li { }
Это добавляет лишней работы по расстановке классов в контенте. Иногда имеет смысл, но лишнюю работу никто не любит.
3) стилизовать только те ul li
, у которых нет никаких классов вообще:
ul:not([class]) li { }
Победа! Нам не нужно делать дополнительную работу по расстановке классов в контенте. А на слайдерах, аккордеонах и прочих конструкциях, которые не должны выглядеть как списки, но используют их в своей разметке, в 99% случаев уже будут свои классы, и наши стили их не затронут.
Этот прием — «выбирать только элементы без класса» — очень полезен для оформления пользовательского контента и его можно применять не только к спискам, но и для других случаев.
Пример 2. Изменение внешнего вида всех элементов, кроме наведенного
Пример
Такой эффект можно реализовать без :not
путем перезаписи значений. И это будет работать в бо́льшем количестве браузеров.
ul:hover li {
opacity:0. 5;
}
ul:hover li:hover {
opacity:1;
}
Но если придется обнулять слишком много свойств, то есть смысл использовать :not
.
ul:hover li:not(:hover) {
opacity:0.5;
}
Пример 3. Меню с разделителями между элементами
Как и в предыдущем примере, желаемого можно добиться несколькими способами.
Через перезапись свойств. Но тут два правила вместо одного, что не есть «DRY».
.menu-item:after {
content: ' | ';
}
.menu-item:last-child:after {
content: none;
}
Через :nth-last-child()
. Одно правило, но тяжело читается.
.menu-item:nth-last-child(n+2):after {
content: ' | ';
}
Через :not()
— самая короткая и понятная запись.
.menu-item:not(:last-child):after {
content: ' | ';
}
Пример 4. Debug css
Удобно для отладки и самоконтроля искать/подсвечивать картинки без alt, label без for и другие ошибки.
img:not([alt]),
label:not([for]),
input[type=submit]:not([value]) {
outline:2px solid red;
}
ul > *:not(li),
ol > *:not(li),
dl > *:not(dt):not(dd) {
outline:2px solid red;
}
Пример 5. Поля форм
Раньше текстовых полей форм было не много. Достаточно было написать:
select,
textarea,
[type="text"],
[type="password"] {
}
С появлением новых типов полей в HTML5 этот список увеличился:
select, textarea, [type="text"], [type="password"], [type="color"], [type="date"], [type="datetime"], [type="datetime-local"], [type="email"], [type="number"], [type="search"], [type="tel"], [type="time"], [type="url"], [type="month"], [type="week"] { }
Вместо перечисления 14 типов инпутов можно исключить 8 из них:
select,
textarea,
[type]:not([type="checkbox"]):not([type="radio"]):not([type="button"]):not([type="submit"]):not([type="reset"]):not([type="range"]):not([type="file"]):not([type="image"]) {
}
Ладно, этот пример не очень красив, и я рекомендую всё же первый вариант с перечислением, он работает с IE8+, а второй вариант с IE9+.
Поддержка
Следует заметить, что согласно спецификации в скобках селектора :not()
может стоять только простой селектор и в скобках нельзя использовать сам селектор :not()
. Если нужно исключить несколько элементов, :not()
можно повторить несолько раз, как в примере 5.
Если очень нужны CSS3-селекторы в браузерах, которые их не поддерживают, можно использовать полифил selectivizr.
Псевдоклассы CSS — Примеры
Помимо CSS селекторами рассмотрим псевдоклассы.a | :hover | { color: | #333333; } |
⇑ | ⇑ | ⇑ | ⇑ |
селектор | :псевдокласс | свойство | значение |
Псевдоклассы, применимые только к ссылкам
<style type="text/css"> a:link { color: blue; } /* не посещённые ссылки */ a:visited { color: green; } /* посещённые ссылки */ </style> <a href="#">анкор</a>анкор
Псевдоклассы, благодаря которым осуществляется динамическое изменение элемента
<style type="text/css"> div { width: 50%; } div:hover { width: 100%; } /* изменение происходит при наведении (увеличивается ширина блока) */ div:active { /* изменение происходит при нажатии (блок смещается вниз) */ position: relative; top: 10px; } </style> <div>содержимое</div>
навести мышку и нажать
Теперь вспомним о хэш-ссылках. Тег a также можно вынести за пределы div.
<style type="text/css"> div { width: 50%; } div:target { width: 100%; } /* при переходе на URL с символом # (http://shpargalkablog.ru/2012/02/psevdoklassy-css.html#target) */ </style> <div><a href="#target">нажать</a></div>
Для элементов формы, таких как input, select и textarea
Псевдокласс :focus также функционирует для других элементов, но нужны дополнительные атрибуты.<style type="text/css"> input { width: 50%; } input:focus { width: 100%; } /* изменение происходит при фокусе (увеличивается ширина блока) */ </style> <input type="text" placeholder="подсказка"/>
<style type="text/css"> input:valid { border: 3px groove green; } /* при соответствии указанному типу */ input:invalid { border: 3px groove red; } /* при несоответствии указанному типу */ </style> <input type="email"/><input type="url"/>
<style> input:in-range { border: 3px groove green; } /* в пределах диапазона допустимых значений */ input:out-of-range { border: 3px groove red; } /* за пределами диапазона допустимых значений */ </style> <input type="number" max="10" min="1" value="5"><input type="number" max="10" min="1" value="11">
<style type="text/css"> input[type="radio"] + label ~ input[type="checkbox"], input[type="radio"] + label ~ input[type="checkbox"] + label, input[type="radio"] + label ~ input[type="checkbox"] + label + br { display: none; } input[type="radio"]:checked + label ~ input[type="checkbox"], input[type="radio"]:checked + label ~ input[type="checkbox"] + label, input[type="radio"]:checked + label ~ input[type="checkbox"] + label + br { display: inline-block; } /* изменение видно при установлении галочки */ :default{ background: yellow; } /* выделенный по умолчанию элемент формы */ </style> <form> <input type="radio" name="odin"/> <label>пункт</label> <input type="checkbox"/> <label>подпункт</label> <input type="checkbox"/> <label>подпункт</label> <input type="radio" name="odin"/> <label>пункт</label> <button>Кнопка 1</button> </form>
выбрать пункт
подпункт
подпункт
выбрать пункт
Помимо :checked есть ещё :indeterminate. Но он может найти своё применение разве что с помощью jQuery (автор). А вместо остальных можно применить селектор с соответствующим атрибутом.
в теге есть атрибут | в теге отсутствует атрибут | описание атрибута | ||
---|---|---|---|---|
:read-only | [readonly] | :read-write | :not([readonly]) | не может изменяться пользователем |
:required | [required] | :optional | :not([required]) | обязательное для заполнения |
:disabled | [disabled] | :enabled | :not([disabled]) | недоступным для активации, не может получить фокус |
Структурные псевдоклассы
Пропускаю :root в связи с его заменой на html.
<style type="text/css"> b:nth-child(1) { color: red; } /* или */ b:first-child { color: red; } b:nth-child(4) { color: blue; } /* или */ b:nth-last-child(12) { color: blue; } b:nth-child(8) { background: green; display: inline-block; padding: 3px; } /* или */ b:empty { background: green; display: inline-block; padding: 3px; } b:nth-child(15) { color: orange; } /* или */ b:last-child { color: orange; } </style> <b>1</b> <b>2</b> <b>3</b> <b>4</b> <b>5</b> <b>6</b> <b>7</b> <b></b> <b>9</b> <b>10</b> <b>11</b> <b>12</b> <b>13</b> <b>14</b> <b>15</b>
1 2 3 4 5 6 7 9 10 11 12 13 14 15 стиль присваивается одному (порядковый номер в скобках :nth-child) из одинаковых тегов, :first-child — для первого из однородных тегов, :last-child — для последнего, :empty — для пустого.
<style type="text/css"> b:not(.izo) { color: red; } /* или */ b:not([title="без стиля"]) { color: red; } </style> <b>1</b> <b>2</b> <b title="без стиля">3</b> <b>4</b> <b>5</b> <b>6</b> <b>7</b> <b>8</b> <b>9</b> <b>10</b> <b>11</b> <b>12</b> <b>13</b> <b>14</b> <b>15</b>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 стиль присваивается всем элементам, кроме того, который содержит в первом случае или title=»без стиля» во втором.
<style type="text/css"> b:nth-child(n+9) { color: red; } b:nth-child(-n+5) { color: orange; } </style> <b>1</b> <b>2</b> <b>3</b> <b>4</b> <b>5</b> <b>6</b> <b>7</b> <b>8</b> <b>9</b> <b>10</b> <b>11</b> <b>12</b> <b>13</b> <b>14</b> <b>15</b>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 стиль присваивается всем после/до определённого номера.
<style type="text/css"> b:nth-child(4n) { color: red; } </style> <b>1</b> <b>2</b> <b>3</b> <b>4</b> <b>5</b> <b>6</b> <b>7</b> <b>8</b> <b>9</b> <b>10</b> <b>11</b> <b>12</b> <b>13</b> <b>14</b> <b>15</b>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 стиль присваивается элементам, чередующимся на 4, другими словами 4, 4*2, 4*3 …
<style type="text/css"> b:nth-child(4n+5) { color: red; } </style> <b>1</b> <b>2</b> <b>3</b> <b>4</b> <b>5</b> <b>6</b> <b>7</b> <b>8</b> <b>9</b> <b>10</b> <b>11</b> <b>12</b> <b>13</b> <b>14</b> <b>15</b>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 стиль присваивается элементам, чередующимся на 4, но начинающимся спустя 5 цифр, а именно 5, 5+4, 5+4*2, 5+4*3 . ..
<style type="text/css"> b:nth-child(4n-5) { color: red; } </style> <b>1</b> <b>2</b> <b>3</b> <b>4</b> <b>5</b> <b>6</b> <b>7</b> <b>8</b> <b>9</b> <b>10</b> <b>11</b> <b>12</b> <b>13</b> <b>14</b> <b>15</b>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 сразу перейдём к расчётам, а именно 4-5 (отрицательное число пропускается), 5-4*2, 5-4*3, 5-4*4 …
<style type="text/css"> b:nth-child(even) { color: red; } b:nth-child(odd) { color: blue; } </style> <b>1</b> <b>2</b> <b>3</b> <b>4</b> <b>5</b> <b>6</b> <b>7</b> <b>8</b> <b>9</b> <b>10</b> <b>11</b> <b>12</b> <b>13</b> <b>14</b> <b>15</b>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 стиль применим ко всем чётным/нечётным.
Чтобы не утруждать себя подсчётами, можно воспользоваться nth-child tester page.
:nth-last-child действует аналогично, только подсчёт ведёт от последнего элемента.
<style type="text/css"> b:nth-of-type(3n) { color: red; } </style> <b>1</b> <span>☆</span> <b>2</b> <span>☆</span> <b>3</b> <span>☆</span> <b>4</b> <span>☆</span> <b>5</b> <span>☆</span> <b>6</b> <span>☆</span> <b>7</b> <span>☆</span> <b>8</b>
1 ☆ 2 ☆ 3 ☆ 4 ☆ 5 ☆ 6 ☆ 7 ☆ 8 нужно выбрать цифры, заключённые в тег b, и среди них присвоить стиль только цифрам, заключённые в тег b и идущим через 3. То есть :nth-of-type осуществляет выборку элементов из указанного типа (их в примере выше 8).
<style type="text/css"> b:nth-child(3n) { color: red; } </style> <b>1</b> <span>☆</span> <b>2</b> <span>☆</span> <b>3</b> <span>☆</span> <b>4</b> <span>☆</span> <b>5</b> <span>☆</span> <b>6</b> <span>☆</span> <b>7</b> <span>☆</span> <b>8</b>
1 ☆ 2 ☆ 3 ☆ 4 ☆ 5 ☆ 6 ☆ 7 ☆ 8 :nth-child берёт в расчёт все 15 элементов, но стиль присваивает в том случае, когда порядковая цифра и тег, в данном случае b, совпадают. То есть он выбрал бы и звезду между цифрами 3 и 4, если бы она была заключена в тег b.
:nth-last-of-type действует аналогично :nth-of-type, только подсчёт ведёт от последнего элемента.
<style type="text/css"> b:only-child { color: red; } </style> ☆ <span><b>1.1</b> <b>1.2</b></span> ☆ <span><b>2.1</b></span> ☆ <span><b>3.1</b> <b>3.2</b></span> ☆
☆ 1.1 1.2 ☆ 2.1 ☆ 3.1 3.2 ☆ стиль действует, когда в родителе присутствует только один элемент. То есть в теге span содержится лишь один тег b.
Разницу между :first-child (см. первый пример Структурных псевдоклассов) и :first-of-type, :last-child и :last-of-type, :only-child и :only-of-type в отображении браузерами я не увидела.
Языковой псевдокласс
<style type="text/css"> :lang(en){ font-style: italic; } </style> <span lang="en"> ru - Russian; en - English; de - German; fr - French; it - Italian </span>
ru — Russian; en — English; de — German; fr — French; it — Italian для слов на английском языке будет присвоен наклонный стиль. Для большинства браузеров требуется атрибут lang.
: first-child,: last-child,: nth-child и: not (: nth-child)
Селектор : nth-child
одновременно мощный и простой в использовании. Это позволяет нам нацеливать определенные элементы на основе их порядка по отношению друг к другу. Мы можем нацеливаться на что-то простое, например, 4-го ребенка, или что-то более сложное, например, на каждого 5-го ребенка, начиная со 2-го (2, 7, 12, 17,…). Зная основы, вы сможете писать мощный, быстрый, эффективный, расширяемый и умный CSS.
Использование селектора : nth-child
часто помогает избавиться от необходимости в таких классах, как .товар - последний
или . товар - чистый
. Если вам нужно стилизовать итеративным способом, вы можете сохранить все стили, содержащиеся в вашем CSS, вместо добавления дополнительных классов в ваш HTML.
Лучше всего то, что селектор : nth-child
был добавлен в CSS3 и поддерживается во всех основных браузерах. Это означает, что мы можем использовать его, не опасаясь проблем с поддержкой браузера.
Вот структура селектора : nth-child
: an + b
- (a) — Целое число, которое обеспечивает контекст для итерации (n)
- (п) — Буква «н» буквально
- (+/-) — Может быть «+» или «-» для построения селектора
- (b) — целое число, обеспечивающее контекст в начальной точке
Вот пример реального селектора : nth-child
: 3n — 2
- а = 3
- п = п
- +/- = —
- b = 2
Давайте повеселимся!
К настоящему времени вы, возможно, уже думаете о некоторых интересных вещах, которые можно сделать с помощью селектора: nth-child, но если нет, я собрал несколько примеров.Они начинаются с базовых, но становятся более сложными.
: первенец
Позволяет нам выбрать первого брата или сестру в группе
: последний ребенок
Позволяет нам нацеливаться на последнего брата или сестру в группе
: nth-ребенок (3n)
Позволяет нам ориентироваться на каждого третьего брата или сестру в группе
: n-й ребенок (n + 2)
Позволяет нам нацеливаться на всех братьев и сестер в группе, начиная со второго брата
: nth-ребенок (3n + 2)
Позволяет нам нацеливаться на каждого третьего брата в группе, начиная со второго брата
: эн-ребенок (-n)
Позволяет нам настроить таргетинг на всех братьев и сестер в группе, начиная с 0-го места и работая в обратном направлении (это не нацелено на каких-либо братьев и сестер, поскольку вы не можете работать в обратном направлении с 0-го места, поскольку нет -1-го брата)
: nth-ребенок (-n + 9)
Позволяет нам нацеливаться на каждого брата или сестру в группе, начиная с 9-го места и работая в обратном направлении
: nth-ребенок (-3n + 9)
Позволяет нам нацеливаться на каждого третьего брата или сестру в группе, начиная с 9-го места и работая в обратном направлении.
: not (: nth-child (4n))
Позволяет нам нацеливаться на каждого брата или сестру, который не является 4-м братом в группе
Использование селектора : nth-child
может поднять ваш CSS на новый уровень.Это помогает вам писать организованный, эффективный и расширяемый код.
Если вам нужно больше, вы можете прочитать спецификацию, узнать больше из MDN или поэкспериментировать с собственными рецептами.
: нет () | CSS-уловки
Свойство : not ()
в CSS является псевдоклассом отрицания и принимает в качестве аргумента простой селектор или список селекторов. Он соответствует элементу, который не представлен аргументом. Переданный аргумент не может содержать дополнительных селекторов или селекторов псевдоэлементов.
Возможность использовать список селекторов в качестве аргумента считается экспериментальной, хотя на момент написания этой статьи она поддерживалась постоянно, включая Safari (с 2015 года), Firefox (с декабря 2020 года) и Chrome (с января 2021 года).
/ * аргумент X можно заменить любыми простыми селекторами * /
: not (X) {
стоимость имущества;
}
В этом примере у нас есть неупорядоченный список с одним классом на
:
-
-
-
Наш CSS выберет все
элементов , за исключением элемента (ов) с классом .разные
.
/ * Стилизуйте все, кроме класса .different * /
li: not (.different) {
размер шрифта: 3em;
}
Вы также можете сделать то же самое, используя псевдоклассы, которые считаются простым селектором.
p: not (: nth-child (2n + 1)) {
размер шрифта: 3em;
}
Однако, если мы используем селектор псевдоэлементов в качестве аргумента, он не даст ожидаемого результата.
: not (:: first-line) {/ * :: first-line - это селектор псевдоэлементов, а не простой селектор * /
цвет белый;
}
Комплексные селекторы
/ * выбрать все , которые не являются потомками * /
p: not (article *) {
}
Визуальный пример
Визуальное представление различных вариантов использования: not ()
Специфичность
Специфика псевдокласса : not
— это специфика его аргумента.Псевдокласс : not ()
не добавляет специфичности селектора, в отличие от других псевдоклассов.
Отрицания не могут быть вложенными, поэтому : not (: not (...))
никогда не допускается. Авторы также должны отметить, что, поскольку псевдоэлементы не считаются простым селектором, они не могут служить аргументом для : not (X)
. Будьте внимательны при использовании селекторов атрибутов, поскольку некоторые из них не так широко поддерживаются, как другие. Допускается объединение : не
селекторов с другими : не
селекторов.
Поддержка браузера
Псевдокласс : not ()
был обновлен в спецификации CSS Selectors Level 4, чтобы разрешить список аргументов. В CSS Selectors Level 3 он мог принимать только один простой селектор. В результате поддержка браузером немного разделена между черновиками Уровня 3 и Уровня 4.
Простые селекторы
IE | Edge | Firefox | Chrome | Safari | Opera | |
---|---|---|---|---|---|---|
9+ | Все | Все | Все | Все | 1+ | Все |
Android Chrome | Android Firefox | Браузер Android | iOS Safari | Opera Mobile | |
---|---|---|---|---|---|
Все | Все | Все | Все | Все | Все |
Списки выбора
Настольный ПК
Chrome | Firefox | IE | Edge | Safari |
---|---|---|---|---|
88 | 84 | Нет | 88 | 88 | 9 Мобильный |
Android Chrome | Android Firefox | Android | iOS Safari | |
88 | 85 | 81 | 9. 0-9,2 |
Дополнительная информация
Введение в селектор CSS nth-child | Мэтью Кроак
odd Используя nth-child (odd)
, вы можете применить CSS к каждому нечетному дочернему элементу. Если бы вы переписали приведенный выше CSS, чтобы повлиять на каждый нечетный элемент, тег p для Келли, Стэнли, Майкла и так далее стал бы красным.
даже
И наоборот, nth-child (even)
применил бы CSS к Creed, Oscar, Jim и т. Д.
формула (
an + b ) Помимо того, что значение n может быть любым числом, вы также можете использовать формулу. nth-child (3n)
повлияет на каждый третий дочерний элемент. nth-child (3n + 1)
будет применяться к каждому третьему элементу, начиная с первого. Умножение и деление не поддерживаются в формулах nth-child (n)
. Давайте разберем этот формат формулы и посмотрим, что означает каждая часть для nth-child
.
a представляет размер цикла. Если a равно 3, это означает, что CSS применяется к каждому третьему элементу. См. Ниже p: nth-child (3n)
.
n — это счетчик, используемый для определения того, на какой из родственных элементов в группе повлияет воздействие. Сам по себе он относится к каждому дочернему элементу. p: nth-child (n)
будет выбирать каждые p
. Это немного избыточно, так как вы можете просто использовать p
отдельно.
b представляет значение смещения.Если вы посмотрите на предыдущий пример nth-child (3n + 1)
, CSS будет применяться к каждому третьему элементу, изначально смещенному на единицу. Таким образом, для p: nth-child (3n + 1)
будет затронут первый тег p
, а затем — каждый третий тег. Смотри ниже.
Вы также можете использовать вычитание. В nth-child (3n-1)
цикл равен 3, а n является счетчиком, что означает, что будет затронут каждый третий тег p
.Но когда смещение равно -1, что по существу составляет 3n + (- 1)
, вы должны начать свой цикл с одного элемента перед первым тегом p
. Смотри ниже.
Теперь, когда вы понимаете формульную опцию для nth-child
, давайте проверим обратную операцию, отрицательный дочерний диапазон .
: nth-child () | Codrops
: nth-child ()
— это селектор псевдокласса CSS , который позволяет вам выбирать элементы на основе их индекса (исходного порядка) внутри их контейнера.
Вы можете передать положительное число в качестве аргумента функции : nth-child ()
, которая выберет один элемент, индекс внутри его родительского элемента совпадает с аргументом : nth-child ()
. Например, li: nth-child (3)
выберет элемент списка со значением индекса 3 ; то есть он выберет третий элемент списка.
Вы также можете передать одно из двух заранее определенных ключевых слов: , четное, и , нечетное, . li: nth-child (even)
выберет все элементы списка с четными индексными номерами (2, 4, 6, 8 и т. Д.), А li: nth-child (odd)
выберет все элементы списка с нечетными порядковые номера (1, 3, 5, 7 и т. д.).
: nth-child ()
также позволяет вам выбрать один или несколько элементов с помощью формулы (или уравнения) — a n + b — которая передается ему в качестве аргумента. Синтаксис: : nth-child ( a n + b )
, где вы заменяете a и b собственными целыми значениями, так что после n заменяется положительными числами (0, 1, 2, 3 и т. Д.), полученное число — это индекс элемента, который вы хотите выбрать. Например, : nth-child (3n + 1)
выберет 1-го (3 * 0 +1 = 1) ребенка, 4-го (3 * 1 +1 = 4) ребенка, 7-го (3 * 2 +1 = 7 ) ребенок и т. д. и т. д.
Что делает : nth-child ( a n + b )
, так это делит дочерние элементы контейнера на a элементов (последняя группа принимает остаток), а затем выбирает b -й элемент каждой группы.Итак, li: nth-child (3n + 1)
разделит элементы списка на 3 группы, поместит остальные элементы в четвертую группу (если количество элементов не делится на 3), и тогда он будет соответствовать первый элемент в каждой группе.
Например, на следующем изображении показан результат выбора li: nth-child (3n + 1)
в списке элементов. В списке 10 элементов, и у нас a = 3 , поэтому 10 элементов будут разделены на 3. 10/3 = 3 + 1, поэтому останется один элемент, который будет сгруппирован в последнюю группу. собственное.Затем для каждой из четырех групп будет выбран первый элемент. На следующем изображении соответствующие элементы имеют фон цвета хаки.
: nth-child (3n + 1)
. Элементы разделены на 3 группы (черная рамка), и вы можете видеть, как сопоставляется первый элемент в каждой группе, включая дополнительную группу с остальными элементами. Когда вы передаете формулу в : nth-child ()
, браузер будет перебирать все дочерние элементы контейнера, а затем выбирать те, которые соответствуют формуле.Список элементов обрабатывается как элементы массива, где каждый элемент имеет индекс, который может совпадать или не совпадать с результатом формулы.
Общая информация и примечания
Выполнение вычислений для : nth-child
может сбивать с толку и обескураживать. Кроме того, возможность визуализировать результаты и визуально выбирать элементы обычно намного проще, чем выполнять математические вычисления самостоятельно. Из-за этого были разработаны несколько действительно хороших инструментов, которые помогут вам визуализировать : nth-child
.Для этого можно использовать следующие инструменты:
Как и другие селекторы псевдоклассов, селектор : nth-child ()
может быть связан с другими селекторами, такими как : hover
, и псевдоэлементами, такими как :: after
, среди прочих. Например, следующее правило предоставит стили наведения для элементов, соответствующих формуле в : nth-child ()
:
li: nth-child (2n + 3) :: after { / * здесь стили * / } tr: nth-child (даже): hover { цвет фона: светло-голубой; }
Существует селектор псевдокласса, функциональность которого аналогична таковому у : nth-child ()
, этот селектор — селектор : nth-last-child ()
. : nth-last-child ()
похож на : nth-child
, за исключением того, что вместо итерации по элементам от первого вниз, он начинает итерацию с последнего элемента вверх.
: nth-child ()
также похож на : nth-of-type ()
, за исключением того, что последний более конкретен — он выбирает элементы на основе заданной формулы , только если элемент имеет определенный тип . Вы можете узнать больше об этом в записи : nth-of-type ()
.
Сравнение псевдоклассов CSS: nth-child vs nth-of-type
Введение
CSS имеет ряд псевдоклассов, которые помогут вам легко стилизовать ваше приложение. Наличие большого количества вариантов может быть отличным, но также может сбивать с толку понимание того, какой псевдокласс использовать и что он на самом деле делает. Здесь мы рассмотрим псевдоклассы CSS nth-child
и nth-of-type
, чтобы лучше понять, когда использовать каждый из них и в чем разница.
Псевдоклассы CSS nth-child
и nth-of-type
интересны по сравнению с другими типами псевдоклассов, потому что они выбирают элементы на основе их положения в DOM. В то время как некоторые псевдоклассы выбирают конкретное состояние элемента (например, псевдоклассы hover, active, target), nth-child
и nth-of-type
больше связаны со структурой вашей разметки.
Предварительные требования
Настройка HTML
Чтобы понять разницу между nth-child
и nth-of-type
, давайте сначала создадим наш HTML, чтобы знать, что мы будем стилизовать.
Допустим, у нас есть раздел на нашей веб-странице, который содержит элементы заголовка ( ,
) и абзаца (
).
<статья>
Вот заголовок
Я - абзац со всевозможной информацией.
Давайте добавим еще один абзац для развлечения.
йадда йадда йадда
бла-бла-бла
йадда йадда йадда
Вот подзаголовок
бла-бла-бла
И, может быть, еще один.
Эта разметка будет выглядеть примерно так:
Всего у нас есть
элемент в качестве родительского и девять дочерних элементов: один , один
и семь
тегов.
nth-child
и nth-of-type
Синтаксис Есть несколько вариантов того, какие значения можно передать псевдоклассам nth-child
и nth-of-type
.Здесь используется nth-child
, но его также можно заменить на nth-of-type
.
-
: nth-child (2n + 3)
: для этого параметра требуются математические вычисления. Цифры на ваше усмотрение; этоn
, который будет отличаться. Это возьмет выбранные вами элементы, установитn
на 0 для начала и будет увеличиваться оттуда. Таким образом, аналогично циклудля
в JavaScript, он будет перебирать выбранные вами элементы, обновляя значениеn
:2 (0) +3 = 3
,2 (1) +3 = 5
,2 (2) +3 = 7
и так далее. Результатом этого будет выбор третьего, пятого, седьмого и т. Д. Элементов. -
: nth-child (odd / even)
: строкиodd
илиeven
могут быть переданы для выбора доступных нечетных и четных элементов. -
: nth-child (3n)
: вы также можете передать число с переменнойn
, которая выберет этот интервал вхождения выбранного элемента. Если передано3
, он выберет третий, шестой, девятый и т. Д. Элементы. -
: nth-child (3)
: если вы просто передадите число (безn
), он выберет именно этот элемент из DOM. При передаче3
будет выбран только третий соответствующий элемент.
Использование CSS
nth-child
Псевдо-класс Псевдокласс nth-child
имеет два важных компонента, которые следует учитывать:
- выбранные элементы, к которым будет применен псевдокласс.
- значение, переданное псевдоклассу.
Если мы перейдем к нашей таблице стилей CSS для примера HTML выше, мы можем выбрать наши элементы абзаца и сделать цвет шрифта бордовым
следующим образом:
артикул п {
цвет: бордовый;
}
Допустим, мы хотим, чтобы все остальные элементы абзаца были желтоватого цвета. Мы можем применить псевдокласс nth-child
, чтобы применить новый цвет только к каждому другому дочернему элементу, являющемуся абзацем.
article p: nth-child (odd) {
цвет: золотарник;
}
Теперь наши абзацы меняют цвет, но вы заметили, что произошло после подзаголовка? Бордовый цвет был повторен, а затем снова стал желтым.Давайте посмотрим, почему это произошло.
Определение, какие элементы выбраны с помощью
nth-child
В нашем примере выше абзацы, которые соответствуют стилю p: nth-child (odd)
, должны соответствовать следующим требованиям в следующем порядке:
- они являются нечетным потомком родительского элемента
- они являются элементом абзаца
Определение четности или нечетности дочернего элемента — это , а не для конкретного типа. Это означает, что проверка нечетности / четности просматривает всех дочерних элементов в родительском элементе того, что выбирается (элементы абзаца), а затем ищет все абзацы, которые считаются нечетными элементами.
Абзацы, к которым применен желтый стиль шрифта, являются «нечетными» дочерними элементами и являются элементами абзаца (
). Это объясняет, почему абзац после подзаголовка в конечном итоге становится бордовым цветом по умолчанию — на самом деле это «четный» дочерний элемент.
Использование CSS
nth-of-type
Псевдокласс nth-of-type
очень похож на псевдокласс nth-child
. Основное отличие состоит в том, что он специально рассматривает тип выбираемого элемента перед проверкой любой другой логики.
Давайте воспользуемся вышеприведенным примером, но вместо этого применим nth-of-type
.
<статья>
Вот заголовок
Я - абзац со всевозможной информацией.
Давайте добавим еще один абзац для развлечения.
йадда йадда йадда
бла-бла-бла
йадда йадда йадда
Вот подзаголовок
бла-бла-бла
И, может быть, еще один.
артикул п {
цвет: бордовый;
}
article p: nth-of-type (odd) {
цвет: золотарник;
}
Цвет по умолчанию по-прежнему темно-бордовый, но теперь мы выбираем только нечетные элементы абзаца.
Стили теперь применяются, если элемент соответствует следующему требованию:
- Элемент — это абзац с родительским элементом article.
- Из выбранных выше абзацев выбираются только нечетные.
Если мы снова посмотрим на это с аннотациями, станет немного яснее, как они выбираются.
Заголовки ( ,
) вообще не рассматриваются с nth-of-type
, потому что мы выбираем по типу элемента. В этом случае нас интересуют только элементы
.
Используете ли вы nth-child
или nth-of-type
, в конечном итоге будет зависеть от вашей цели стилизации.
Как правило, если вы хотите выбрать интервал селектора независимо от типа элемента, используйте nth-child
. Однако, если вы хотите выбрать только определенный тип и применить оттуда выбор интервала, используйте nth-of-type
.
Заключение
Селекторы nth-child
и nth-of-type
имеют отличную поддержку браузера. Проверьте nth-child и nth-of-type на CanIUse.com для получения более подробной информации.
Для более полного обзора языка разметки HTML5 ознакомьтесь с нашей серией статей «Как создать веб-сайт в HTML».
Селекторы псевдоклассов — Мастерская по макету CSS
Селектор псевдокласса действует так, как если бы вы добавили класс к элементу в вашей разметке.
Мастерская по макету CSS: селекторы псевдоклассов
youtube.com/embed/Uoja3bFoq98?» frameborder=»0″ allowfullscreen=»»/>
Вы, вероятно, знакомы как минимум с двумя селекторами псевдокласса, теми, которые мы используем для выбора состояний ссылки.
a: ссылка {}
а: посетил {}
Эти селекторы работают так, как если бы они добавляли класс в зависимости от состояния ссылки. В этом случае независимо от того, посещена ли ссылка или нет.
Другие псевдоклассы, которые мы могли бы использовать для ссылки, на самом деле динамических псевдоклассов . Они применяются в зависимости от того, что происходит в документе. Ссылка, на которую наведен курсор, добавлена вкладка или активирована.
a: hover {}
a: active {}
a: focus {}
Чтобы использовать псевдокласс, мы добавляем его к элементу, на который хотим нацелиться, с помощью двоеточия :
.
У нас есть еще несколько полезных псевдоклассов, с которыми можно поиграть.
: первенец
Назначьте элемент, если он является первым дочерним элементом родительского элемента.
Селектор first-child
был частью CSS2.1. В этом примере у нас есть набор абзацев.
Абзац первый.
Абзац второй
Чтобы применить CSS только к первому абзацу внутри оболочки
, мы используем селектор first-child.
.wrapper p: first-child {}
Это работает, только если есть элемент абзаца как первый элемент непосредственно внутри этого контейнера. Если мы добавим здесь заголовок первого уровня, то селектор first-child
больше не будет выбирать абзац.
: последний ребенок
Целевой элемент, если он является последним дочерним элементом родительского элемента.
Спецификация Selectors Level 3 принесла нам несколько новых селекторов псевдокласса. Селектор last-child похож на first-child, за исключением того, что он нацелен на последнего дочернего элемента родителя.
.wrapper p: last-child {}
Это может быть полезно для таких вещей, как удаление нижней границы из списка или поля из последнего элемента.
: ребенок
Выберите несколько элементов в соответствии с их положением в дереве документа.
Селектор nth-child действительно очень полезен. Простым примером является использование этого селектора для чередования строк таблицы.
<таблица>
Имя
Любимый цвет
Любимое животное
Рэйчел
Фиолетовый
Кот
Джо
Розовый
Альбатрос
Элоиза
Зеленый
Слаг
Мы можем применить CSS к нечетным строкам с помощью следующего селектора.
tr: nth-child (odd) {}
Или четных строк:
tr: nth-child (even) {}
Эти ключевые слова — не единственный способ использовать nth-child. Мы можем настроить таргетинг на конкретную строку. Этот селектор только выберет строку 2.
tr: nth-child (2) {}
Значение ключевого слова odd равно этому селектору, в котором мы выбираем первый элемент и каждый второй элемент после него.
tr: nth-child (2n + 1) td {}
Есть несколько отличных ресурсов, которые помогут вам понять, как работает nth-child.Вместо того, чтобы воспроизводить все это, взгляните на:
: n-й тип
Выберите несколько элементов в соответствии с их положением в дереве документа, НО только те элементы, которые совпадают с типом, к которому применяется правило.
После того, как вы разобрались с тем, как работает nth-child, вы можете использовать тот же синтаксис для nth-of-type
. Этот селектор выбирает только те элементы, которые относятся к тому же типу, что и элемент, к которому он применяется.
В моем примере ниже показаны заголовки и абзацы.
Чтобы применить CSS ко всем остальным абзацам, но игнорировать заголовки, я мог бы использовать следующий селектор.
p: nth-of-type (odd) {}
: только ребенок
Псевдокласс only-child
будет соответствовать, если элемент является единственным дочерним элементом родительского элемента — например, список с одним элементом списка.
li: только ребенок {}
Это может быть полезным селектором при проектировании переменного количества контента, поступающего из CMS.
: пусто
пустой псевдокласс
будет соответствовать, если элемент полностью пуст или содержит только HTML-комментарий.
п: пусто {}
Не будет совпадать, если внутри элемента есть пробелы.
пустой псевдокласс
будет соответствовать первым двум, но не последнему абзацу.
: не
Псевдокласс , а не
позволяет вам что-то делать, если селектор не совпадает.Селектор, который вы хотите исключить, находится внутри круглых скобок. В приведенном ниже примере мы делаем шрифт жирным, если он не находится внутри td
с классом animal
.
td: not (.animal) {
font-weight: жирный;
}
nth-ребенок против nth-of-типа
Селекторы nth-child ()
и nth-of-type ()
являются «структурными» псевдоклассами, которые позволяют нам выбирать элементы на основе информации в дереве документа, которая обычно не может быть представлена другие простые селекторы.
В случае nth-child ()
и nth-of-type ()
дополнительная информация — это позиция элемента в дереве документа по отношению к его родителю и братьям и сестрам. Хотя эти два псевдокласса очень похожи, они работают по-разному.
Как работает
nth-child ()
Псевдокласс nth-child ()
используется для сопоставления элемента на основе числа, которое представляет позицию элемента среди его братьев и сестер.Более конкретно, число представляет количество братьев и сестер, которые существуют перед элементом в дереве документа (минус 1).
Это число выражается как функция, an + b
, где n
— это индекс, а a
и b
— любые передаваемые нами целые числа. Например, чтобы выбрать каждый элемент, мы могли бы написать любое из следующего —
: nth-child (1n + 0) {/ * стили * /}
: nth-child (n + 0) {/ * стили * /}
: nth-child (1n) {/ * стили * /}
В дополнение к этой функции мы можем передать одно целое число e. грамм. : nth-child (1)
или используйте одно из заданных ключевых слов, нечетное
или четное
. Эти ключевые слова являются альтернативой написанию функциональной записи для выбора каждого нечетного или четного элемента.
: nth-child (odd) {/ * стили для нечетных элементов * /}
: nth-child (2n + 1) {/ * стили для нечетных элементов * /}
: nth-child (even) {/ * стили для четных элементов * /}
: nth-child (2n + 0) {/ * стили для четных элементов * /}
При использовании : nth-child ()
отдельно, достаточно просто предсказать, какой элемент будет выбран.Например, используя эту разметку —
Это абзац .
Это абзац .
Это абзац .
Это разделитель .
Это разделитель .
Это абзац .
Это абзац .
Это разделитель .
Это абзац .
Это разделитель .
Если бы мы хотели выбрать пятый элемент, div, мы могли бы просто написать следующее —
.example: nth-child (5) {background: # ffdb3a; }
Однако могут возникнуть непредвиденные результаты, если существует несколько типов элементов, и нам нужно объединить псевдокласс : nth-child ()
с селекторами типа или класса.Например, чтобы снова выбрать тот же самый элемент div, у нас может возникнуть соблазн написать следующее —
.example div: nth-child (2) {background: # ffdb3a; }
Примечание — работать не будет
Причина, по которой это не сработает, заключается в том, что элемент, на который нацелен селектор, на самом деле не существует. Используя указанный выше селектор, пользовательский агент выполнит следующие шаги —
- Выберите все дочерние элементы
. Пример
- Найдите второй элемент в этом списке, независимо от типа
- Проверить, является ли этот элемент типом
div
Поскольку второй элемент в дереве документа является абзацем, а не блоком div, ничего не выделяется. Если бы мы хотели выбрать второй элемент div, нам пришлось бы использовать псевдокласс nth-of-type ()
.
Как работает
nth-of-type ()
Работает Псевдокласс nth-of-type ()
, например nth-child ()
, используется для сопоставления элемента на основе числа. Это число, однако, представляет позицию элемента в пределах только тех из его братьев и сестер, которые относятся к тому же типу элемента .
Это число также может быть выражено как функция или с помощью ключевых слов четный
или нечетный
.Используя пример разметки выше, мы можем выделить все нечетные абзацы, написав —
.example p: nth-of-type (odd) {background: # ffdb3a; }
Когда мы используем этот селектор, пользовательский агент выполняет следующие шаги —
- Выберите все дочерние элементы
. Example
, которые имеют тип p
- Создать новый список только из этих элементов
- Выберите нечетные числа из этого списка
Из-за этого теперь мы можем выбрать второй div, пятый дочерний элемент . например
—
.example div: nth-of-type (2) {/ * стили * /}
Другие псевдоклассы «nth»
Помимо nth-child ()
и nth-of-type ()
, есть ряд других структурных псевдоклассов, которые мы можем использовать для выбора элементов на основе их положения в пределах их братьев и сестер. Подобно nth-child ()
и nth-of-type ()
, они делятся на две группы: те, которые не зависят от типа , например nth-child ()
, и те, которые являются зависящий от типа , например nth-of-type ()
.
nth-child () nth-of-type () nth-последний-ребенок () nth-последний-тип () первенец () первоклассный () последний ребенок () последний тип () только ребенок () только тип ()
Отсчет от конца —
nth-last-child ()
vs nth-last-of-type ()
Эти псевдоклассы работают как nth-child ()
и nth-of-type ()
, но они начинают отсчет с последнего элемента в группе братьев и сестер вместо первого.
.example: nth-last-child (1) {background: # a6cae7; }
.example p: nth-last-of-type (1) {фон: # ffdb3a; }
Первый элемент —
первый ребенок ()
против первый ребенок ()
Псевдоклассы first-child ()
и first-of-type ()
выбирают первый элемент. Их можно представить как использующие псевдоклассы nth-child ()
и nth-of-type ()
, но просто передавая значение 1.
.example: first-child () {/ * стили * /}
.example: nth-child (1) {/ * стили * /} / * то же, что и выше * /
.example: first-of-type () {/ * стили * /}
.example: nth-of-type (1) {/ * стили * /} / * такие же, как указано выше * /
Последний элемент —
last-child ()
vs last-of-type ()
Это противоположность псевдоклассам first-child ()
и first-of-type ()
. Их можно рассматривать как использование псевдоклассов nth-last-child ()
и nth-last-of-type ()
, но с передачей значения 1.
.example: last-child () {/ * стили * /}
.example: nth-last-child (1) {/ * стили * /} / * такие же, как указано выше * /
.example: last-of-type () {/ * стили * /}
.example: nth-last-of-type (1) {/ * стили * /} / * такие же, как указано выше * /
The Only Element —
only-child ()
против only-of-type ()
Наконец, эти псевдоклассы выберут единственный дочерний элемент. Для only-child ()
элемент должен быть буквально единственным дочерним элементом своего родителя, независимо от типа.Для only-of-type ()
элемент должен быть только единственным дочерним элементом своего типа.
.example: only-child () {/ * стили * /}
.example p: only-of-type () {/ * стили * /}
.