Различия между :nth-child и :nth-of-type / Хабр
Допустим, есть такой HTML:<section>Следующий CSS будет делать одно и тоже:
<p>Little</p>
<p>Piggy</p> <!— Нужен этот элемент —>
</section>
p:nth-child(2) { color: red; }
p:nth-of-type(2) { color: red; }
Хотя, конечно, в этих селекторах, есть разница.
Псевдокласс :nth-child, означачает выбрать элемент, если:
- Этот элемент — параграф;
- Это второй элемент одного родителя.
- Выбрать второй параграф одного родителя.
<section>Теперь первый вариант не работает:
<h2>Words</h2>
<p>Little</p>
<p>Piggy</p> <!— Нужен этот элемент —></section>
p:nth-child(2) { color: red; } /* Не работает */Второй продолжает работать:
p:nth-of-type(2) { color: red; } /* Продолжает работать */Под «Не работает» я имею ввиду, что cелектор
:nth-child
выбирает слово «Little» вместо «Piggy». Потому что элемент выполняет оба условия: 1) Это второй элемент родительского элемента и 2) Это параграф. Под «Продолжает работать», я имею ввиду, что селектор продолжает выбираться «Piggy», потому что это второй параграф родительского элемента.Если добавить <h3>
после <h2>
, то селектор с :nth-child не выберет ничего, потому что параграф больше не является вторым элементом. Селектор с :nth-of-type
продолжит работать.
Мне кажется :nth-of-type
менее хрупкий и более полезный в целом, несмотря на это :nth-child
продолжает быть основным в работе. Как часто вы думаете «Я хочу выбрать второй элемент в родительском блоке, если это параграф». Возможно иногда, но чаще вы думаете «Выбрать второй параграф» или «выбрать каждую третью строку таблицы», для этих задач больше подходит :nth-of-type
(опять же, на мой взгляд).
Большинство ситуаций, когда я говорю «Почему мой селектор с :nth-child не работает?» случаются из за того, что я забываю про выборку тегов и нужный тег не оказывается по счету тем, который нужен. Поэтому, при использовании :nth-child
лучше указывать его от родителя и не использовать привязку к тегу.
dl :nth-child(2) { } /* Этот вариант лучше чем */Но, конечно, все зависит от конкретной ситуации.
dd:nth-child(2) { } /* этот */
Поддержка браузерами :nth-of-type
:nth-of-type
. Слышал, что из за редкого использования, но мне это кажется странным. Если вы хотите пойти этим путем, то вот плагин возвращающий поддержку назад.Использование селекторов first-of-type, first-child и nth-of-type
Довольно распространено создание особо внешнего вида для элемента, появляющегося впервые: выделение курсивом первого абзаца на странице, или, например, использование эффекта первой строки вступления. Обычно это задается с помощью применения идентификатора к нужному элементу. Но в этом подходе есть существенные недостатки: каждый раз при создании нового первого абзаца нужно не забыть применить идентификатор для достижения эффекта. Намного проще задать правило, которое будет срабатывать в подходящей ситуации, не зависимо от действий разработчика.
Если постараться сократить использование идентификаторов, классов и встроенного в HTML кода CSS, так как это зачастую неэффективно, то остаются два решения для создания особого внешнего вида у элементов, появляющихся впервые.
Псевдокласс first-child
Псевдокласс first-child (первенец) задает свойства первому элементу в данном случае. Например, чтобы выбрать первый элемент в теге body, если это абзац, можно использовать следующий код CSS:
body p:first-child { font-weight: 800; }
Вероятно, будет понятней, если прочитать этот селектор задом наперед: если первый элемент внутри тега body – это абзац, то делаем его шрифт жирным.
Хотя таким образом можно обратиться к первому абзацу, только если до него нет других элементов: если перед абзацем есть заголовок, то этот абзац уже не первый элемент в теге body и такой селектор его не выберет.
Псевдоклассы first-of-type и nth-of-type
Хотя такой подход встречается реже, лучшим и наиболее гибким решением будет использование псевдокласса first-of-type (первый этого типа) или nth-of-type (энный этого типа). Здесь все очень просто, эти псевдоклассы делают именно то, что можно ожидать, судя по их названию: обращаются к первому или энному элементу в данном случае. Таким образом, чтобы выбрать первый абзац на странице, как в примере выше, воспользуемся таким кодом CSS:
p:first-of-type { font-style: italic; }
Или таким:
p:nth-of-type(1) { font-style: italic; }
Число в круглых скобках в конце селектора указывает, какой элемент будет выбран: 1 означает первый подходящий элемент, 2 — второй и так далее. Также возможно поместить в круглые скобки формулу.
Использование псевдокласса first-of-type или nth-of-type в ситуации выше позволяет любому количеству элементов или содержимого находится перед абзацем и все равно будет выбран первый абзац. Конечно, можно задавать еще более точные условия и объединять эти псевдоклассы с другими:
article p:first-of-type:first-line { font-feature-settings:"smcp"; }
С помощью подходящих приставок производителей для свойства настроек особенностей шрифта объявление выше выберет первую строку первого абзаца на любой странице и отобразит ее в настоящих малых заглавных или капители.
Автор урока Dudley Storey
Перевод — Дежурка
Смотрите также:
- Использование селектора only-of-type
- Использование элементов блоков
- Использование множественных фоновых изображений в CSS3
Что такое CSS: Псевдо-класс первого типа
Иногда вы сталкиваетесь со сценарием, когда вы хотите настроить таргетинг на определенный тип элемента в группе из братьев и сестер , и вот где первый тип псевдокласс помогает вам, потому что он нацелен на первый элемент указанного типа и группу из братьев и сестер .
Допустим, у нас есть контейнер из div ; внутри контейнера есть много элементов p, некоторые из которых являются элементами h2. Но вам особенно нужно настроить таргетинг на первый элемент h2 в родственной группе. Вы можете быстро решить этот сценарий с помощью CSS first типа 9.0003 псевдокласс .
На приведенном выше рисунке показано, что внутри нашего контейнера у нас есть несколько элементов h2 и p, и с помощью первого в своем роде псевдокласса мы нацелились на первый элемент h2 из родственной группы и изменили цвет до синего.
Синтаксис CSS
Базовый синтаксис для псевдокласса первого типа CSS следующий:
:first-of-type { css объявления; }
Определение
Первый псевдокласс CSS типа соответствует первому элементу определенного типа из родственной группы.
Представьте себе сценарий, в котором у вас есть несколько вложенных контейнеров внутри основного контейнера, и каждый вложенный контейнер содержит элементы h2 и p. Но если вы особенно хотите настроить таргетинг на первый элемент h2 из каждого вложенного контейнера, то лучше всего для этого подойдет первый в своем роде псевдокласс .
Потому что CSS первый из типа псевдокласс соответствует первому конкретному типу элемента из группы братьев и сестер .
Как использовать CSS первого типа
При стилизации веб-страницы вы можете столкнуться со сценариями, когда вы хотите настроить первый элемент с похожим стилем CSS. Вы можете добиться этого с помощью первого в своем роде псевдокласса
Использование селектора первого типа CSS довольно просто, и вам нужно выбрать элемент HTML с помощью селектора тегов и добавить «» в конце выбранного селектора.
<Селектор тегов>:first-of-type { css объявления; }
Первый тип работает с селекторами элементов/тегов, такими как div, p, span и многими другими.
Предположим, у вас есть контейнер div . Внутри контейнера находятся 2 элемента p и по одному элементу h2 и h3.
<дел>Основной заголовок
Второй заголовок
Абзац
Абзац
И вы хотите стилизовать первый элемент p из группы братьев и сестер .
Вот как вы можете использовать первый-в-типе:-
p:первый-в-типе { цвет фона: аква; граница: 2px сплошной черный; ширина: подгонка содержимого; }
Выше мы выбираем первые p элементов из группы братьев и сестер , добавляем цвет рамки и фона и ограничиваем ширину элемента.
Выход:-
Вы можете видеть, что приведенный выше код стиля применяется только к первому абзацу на изображении ниже, потому что первый по типу выбирает только первый элемент из родственной группы.
Кроме того, вы можете комбинировать псевдокласс с селектором класса.
Как использовать вместе с селекторами классов
CSS first of type также можно комбинировать с селектором класса для выбора первого определенного типа элемента из группы родственных элементов . Вам просто нужно выбрать тип элемента с именем класса и добавить первый псевдокласс CSS
Пример. Использование селектора классов и псевдокласса
Допустим, у нас есть неупорядоченный список ul, который содержит несколько элементов списка с именем класса .first.
<ул>
заголовок
Абзац
Абзац
Чтобы выбрать первый элемент li, вы можете использовать CSS first-of-type, как показано ниже:
.first:first-of-type { цвет синий; граница: 2px сплошной черный; ширина: подгонка содержимого; }
В приведенном выше коде мы выбираем первый элемент li с помощью имени класса и селектора первого типа.
Вывод:-
Как использовать с CSS First Child of Type
Вы также можете стилизовать первый дочерний элемент родительского элемента с первым типом псевдокласс . Вы должны выбрать родителя и первого дочернего элемента, которому хотите придать стиль.
Пример. Оформление первого дочернего элемента Style в CSS
Допустим, у вас есть контейнер div с одним заголовком h3 и несколько div с заголовками h3 и тегами p.
<дел>Основной заголовок
<дел>Второй заголовок
Lorem ipsum dolor, sit amet consectetur adipisicing elit. диплом апериам аними в, долорум,