Css каждый пятый элемент. Как работает nth-child — Веб-стандарты

Псевдокласс first-child в CSS используется для выбора первого элемента в контейнере. При этом конкретный тип элемента не учитывается, значение имеет лишь его позиция относительно родителя. Существуют некоторые тонкости в работе этого селектора, которые необходимо понимать для правильного использования.

CSS-псевдоклассы

Наряду с идентификаторами, классами, тегами и атрибутами псевдоклассы являются одним из видов CSS-селекторов. Их особенность в том, что они не могут быть установлены непосредственно в HTML.

Примерами псевдоклассов являются "первая строка в контейнере", "первая буква в слове", "первый дочерний элемент у родителя". Браузер может обнаружить подобные элементы только после того, как он проанализировал страницу и составил DOM-дерево, а в ряде случаев только после отрисовки.

Наличие в CSS подобного механизма позволяет определять оформление, не привязанное к HTML-коду, что открывает большие возможности для дизайна.

Выбор первого элемента

Псевдокласс first-child в CSS отвечает за выбор самого первого элемента в родительском контейнере. Текстовые узлы при этом игнорируются, в счет идут только полноценные теги.

Найдем первые элементы в двух простых HTML-структурах.

  • Первый пункт
  • Второй пункт
  • Третий пункт

Есть только два способа прожить жизнь. Первый - будто чудес не существует. Второй - будто кругом одни чудеса. Альберт Эйнштейн

В результате выбраны будут первый пункт списка и тег, определяющий жирное начертание шрифта.

  • Первый пункт
  • два способа

    Синтаксис

    Все псевдоклассы в CSS определяются по определенному шаблону. Сначала указывается основной селектор, затем искомый псевдокласс, отделенный двоеточием.

    B:first-child { text-decoration: underline; }

    Такое правило подчеркнет текст первого элемента b внутри каждого контейнера.

    • Все хотят изменить мир сам. Лев Толстой
    • Тот, кто умеет, тот делает, кто не умеет - тот учит других. Бернард Шоу

    На скриншоте очевидно, что выделились только элементы, соответствующие одновременно селектору тега b и селектору псевдокласса:first-child. Стиль был применен внутри каждого контейнера, в данном случае внутри всех пунктов списка.

    Помимо тега, в качестве основного можно использовать любой другой селектор CSS, например:

    Class:first-child {} :first-child {} *:first-child {}

    Типичные ошибки

    Псевдокласс первого элемента first-child в CSS выбирает строго тег, находящийся на первом месте в родительском контейнере. Даже если элемент полностью соответствует селектору, но не является первым потомком, он не будет выбран.

    Для примера возьмем предыдущий список цитат и перенесем авторов в начало.

    • Лев Толстой Все хотят изменить мир, но никто не хочет измениться сам.
    • Бернард Шоу Тот, кто умеет, тот делает, кто не умеет - тот учит других.

    Несмотря на то что селектор элемента остался прежним, CSS-стиль не применился, так как первым элементом в контейнере теперь является i.

    Еще одной ошибкой является игнорирование Это такой же HTML-элемент, как и прочие. Если он окажется в контейнере перед искомым блоком, то селектор CSS first-child не сработает.

    Учет типа элемента

    Чтобы избежать подобных ситуаций, можно использовать псевдокласс first-of-type. Он работает так же, как селектор CSS first-child, но учитывает тип элемента.

    B:first-of-type { text-decoration: underline; }

    Теперь при подсчете учитываются только элементы, соответствующие селектору b.

    Выбор последнего элемента

    Существует также псевдокласс last-child, который работает аналогично селектору CSS first-child, но начинает счет элементов с конца контейнера.

    Существует такой селектор, точнее псевдокласс, называемый:nth-child . Вот пример его использования:

    UL LI:nth-child(3n+3) { color:#CCC; }

    Что делает CSS-код, приведенный выше? Он выбирает каждый третий элемент внутри маркированного списка: это 3-й, 6-й, 9-й, 12-й и т.д. Давайте посмотрим, как именно работает это выражение и что еще можно сделать с помощью:nth-child .

    Всё зависит от того, что находится между скобками. Селектор:nth-child принимает два ключевых слова: even и odd . Тут всё просто: even выбирает чётные элементы, такие как 2-ой, 4-ый, 6-ой и т.д., а odd выбирает нечётные элементы, такие как 1-й, 3-й, 5-й и т.д.

    Как видно из первого примера, :nth-child также принимает в качестве параметра выражения. В том числе и простейшие уравнения, иначе говоря, просто числа. Если поставить их в скобки, будет выбран только один элемент с соответствующим номером. Например, вот как выбрать только пятый элемент:

    UL LI:nth-child(5) { color:#CCC; }

    Однако давайте вернемся к 3n+3 из первого примера. Как он работает и почему выбирается каждый третий элемент? Весь фокус в понимании переменной n и приведенного алгебраического уравнения. Подумайте об n , как о начинающемся с нуля множестве целых чисел. Потом дополните уравнение. Так 3n это 3×n , а все уравнение вместе это (3×n)+3 . Теперь, подставляя вместо n числа больше или равные нулю, мы получим:

    • (3 × 0) + 3 = 3 = 3-й элемент
    • (3 × 1) + 3 = 6 = 6-й элемент
    • (3 × 2) + 3 = 9 = 9-й элемент и т.д.

    А как насчёт:nth-child(2n+1) ?

    • (2 × 0) + 1 = 1 = 1-й элемент
    • (2 × 1) + 1 = 3 = 3-й элемент
    • (2 × 2) + 1 = 5 = 5-й элемент и т.д.

    Так, стоп! Это ведь то же самое, что и odd . Тогда, возможно, не стоит использовать это выражение? Но разве в этом случае мы не подвергаем наш первый пример излишнему усложнению? Что, если вместо 3n+3 мы запишем 3n+0 или ещё проще 3n ?

    • (3 × 0) = 0 = ничего нет
    • (3 × 1) = 3 = 3-й элемент
    • (3 × 2) = 6 = 6-й элемент
    • (3 × 3) = 9 = 9-й элемент и т.д.

    Итак, как вы можете видеть, результат получится такой же, а значит, нет необходимости в +3 . Мы можем использовать и отрицательные значения n , с таким же успехом, как и вычитание в уравнениях. Например, 4n-1:

    • (4 × 0) – 1 = –1 = ничего нет
    • (4 × 1) – 1 = 3 = 3-й элемент
    • (4 × 2) – 1 = 7 = 7-й элемент и т.д.

    Использование -n может показаться странным - ведь если конечный результат отрицательный, то никакие элементы в выборку не попадут. Но если дополнить уравнение и снова сделать результат положительным, то выборка окажется довольно интересной: при помощи неё можно будет получить первые n элементов, например так: -n+3:

    • –0 + 3 = 3 = 3-й элемент
    • –1 + 3 = 2 = 2-й элемент
    • –2 + 3 = 1 = 1-й элемент
    • –3 + 3 = 0 = ничего нет и т.д.

    На SitePoint есть хороший справочник с милой табличкой , которую я бесстыдно опубликую здесь:

    n 2n+1 4n+1 4n+4 4n 5n-2 -n+3
    0 1 1 4 3
    1 3 5 8 4 3 2
    2 5 9 12 8 8 1
    3 7 13 16 12 13
    4 9 17 20 16 18
    5 11 21 24 20 23

    Поддержка браузерами

    Селектор:nth-child - один из немногих CSS-селекторов, который почти полностью поддерживается в современных браузерах и абсолютно не поддерживается в IE, даже в IE8. Поэтому когда дело доходит до его использования, и конечный результат сделан по технологии прогрессивного улучшения - вы можете смело использовать его для некоторых оформительских элементов, вроде расцветки строк таблицы. Однако не стоит применять его в более серьезных случаях. Например, полагаться на него в раскладке сайта или удалять правое поле из каждого третьего блока в сетке три на три, чтобы они вошли в ряд.

    Я приветствую вас на своем блоге. Хотел бы сегодня написать на тему, как выбрать в css первый элемент родителя, потому что это позволяет использовать меньше стилевых классов.

    Псевдоклассы:first-child и first-of-type в чем разница?

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

    Это абзац

    Это абзац

    Это абзац

    Это абзац

    Это абзац

    Допустим, имеем такую разметку. Цель – обратиться к первому абзацу и стилизовать его отдельно от других без дописывания ему классов. Это можно сделать так:

    #wrapper p:first-child{ Color: red; }

    Цвет первого абзаца станет красным, можете проверить.

    #wrapper p:first-of-type{ color: red; }

    Произойдет то же самое. Так в чем же разница? А она заключается в том, что псевдокласс first-of-type ищет и находит первый элемент родителя, учитывая его тип, а first-child ничего не ищет – он просто берет первый попавшийся элемент родителя и если это абзац, то применяет к нему стили. Если нет, то ничего не выберется и не применится.

    Это абзац

    Это абзац

    Это абзац

    Это абзац

    Это абзац

    А теперь подумайте: сработает ли в этом случае first-of-type ? Да, потому что он учитывает тип элемента и выберет именно первый абзац, а не первый из вообще всех элементов. А first-child сработает? Попробуйте. Ничего не получится, потому что абзац не стоит первым элементом в родителе.

    Лично я не сразу понял разницу между этими псевдоклассами и какое-то время путался, но сейчас, я надеюсь, нормально вам объяснил.

    Еще важная деталь

    Отсчет элементов идет именно от родительского элемента, поэтому если вы указали так:

    Li:first-of-type{ … }

    То выбран будет первые пункты списков в теге body (то есть на всей странице). Таким образом, в любом списке первый пункт будет оформляться по-другому.
    Если же написать так:

    #sidebar li:first-of-type{ … }

    То выбраны будут только первые пункты списков в сайдбаре, то есть боковой колонке на нашем сайте.

    Используя различные селекторы, о которых я написал , вы можете дотянуться практически до любого элемента на веб-странице.

    Кстати, я забыл упомянуть о противоположных псевдоклассах – last-child (и last-of-type соответственно). Они позволяют выбрать последний элемент из родительского контейнера.

    Где можно использовать на практике

    Говорится об этих псевдоклассах потому, что они активно используются при верстке с помощью css. Вот есть у вас на странице, например, блок похожих записей, или комментариев, или еще чего. И у вас возникла идея как-то по особенному оформить его первый элемент. А может, последний. Да и вообще любой можно.

    Вам всего лишь нужно узнать название блока, в котором хранится нужный элемент. Допустим, имеем дело с популярными записями. Родительский контейнер имеет класс popular. Тогда пишем так:

    Popular li:first-of-type{ Padding-top: 20px; }

    Все, первый пункт списка в нем получил отступ сверху, а можно дописать в стили все, что вам захочется.

    Вот еще такой пример. У меня в теге body всего три одинаковых серых блока.
    Напишем так:

    Div:first-of-type{ transform: rotate(7deg); } div:last-of-type{ transform: rotate(-7deg); }

    Первый блок получил наклон вправо, а последний – влево.

    И это лишь примеры того, где и как могут применяться наши псевдоклассы.

    Итог

    Вот такая у меня получилась сегодня статья. Важно понять саму суть выбора элементов, и вы сможете без проблем использовать эти приемы в своей работе.

    В CSS существует селектор, если быть более точным, псевдо-селектор, называемый nth-child. Пример его использования:

    Ul li:nth-child(3n+3) { color: #ccc; }

    Вышеприведённый CSS делает следующее: применяет стиля для каждого третьего элемента ненумерованного списка. А именно 3-го, 6-го, 9-го, 12-го и т.д. Но как это работает? А также какую выгоду можно извлечь используя nth-child ?

    Основной смысл заключается в выражении в скобках. nth-child принимает два ключевых слова: even (чётный) и odd (нечётный). Смысл их абсолютно ясен. Even выбирает чётные элементы (2, 4, 6), odd - нечётные (1, 3, 5).

    Как показано в примере выше, nth-child может обрабатывать выражения. Какое самое простое возможное выражение? Просто число. Если вы напишите какое-нибудь число в скобках, то будет выбран один единственный элемент. Например, выберем пятый элемент списка:

    Ul li:nth-child(5) { color: #ccc; }

    Вернёмся к нашему первому примеру, в котором мы использовали выражение (3n+3). Как он работает? Почему он выбирает каждый третий элемент? Вся суть в переменной n. Она принимает целые значения от нуля и больше. Давайте рассмотрим подробнее:

    (3 x 0) + 3 = 3 = 3-ий элемент (3 x 1) + 3 = 6 = 6-ой элемент (3 x 2) + 3 = 9 = 9-ый элемент и т.д.

    Теперь попробуем следующее выражение: nth-child(2n+1) :

    (2 x 0) + 1 = 1 = 1-ый элемент (2 x 1) + 1 = 3 = 3-ий элемент (2 x 2) + 1 = 5 = 5-ый элемент и т.д.

    В итоге получили тоже самое что и в случае с odd , таким образом нет нужды часто использовать такое выражение. Более того, наш первый пример тоже можно упростить и использовать вместо оригинального выражения (3n+3), выражение (3n):

    (3 x 0) + 0 = 0 = нет соответствия (3 x 1) + 0 = 3 = 3-ий элемент (3 x 2) + 0 = 6 = 6-ой элемент и т.д.

    Как видите, результат тот же, но не надо писать "+3". Также мы можем использовать отрицательные значения в выражении. Например, 4n-1:

    (4 x 0) - 1 = -1 = нет соответствия (4 x 1) - 1 = 3 = 3-ий элемент (4 x 2) - 1 = 7 = 7-ой элемент и т.д.

    Использование отрицательных значений для коэффициента при n, выглядит слегка странно, потому что в случае отрицательного результата не будет найдено соответствие. Вам надо будет постоянно изменять выражение, чтобы добавить положительных элементов. Как оказалось, этот подход очень удобен для выбора первых n элементов. Рассмотрим пример с "-n+3":

    0 + 3 = 3 = 3ий элемент -1 + 3 = 2 = 2-ой элемент -2 + 3 = 1 = 1-ый элемент -3 + 3 = 0 = нет соответствия

    Кроссбраузерность

    nth-child является одним из тех самых несчастных атрибутов, которые являются полностью кроссбраузерными, за исключением абсолютного нуля в IE, даже 8-ой версии. Поэтому, когда речь заходит о его использовании, то если ожидаемый результат - это в некотором роде визуальный эффект (например раскраска строк некой таблицы), то это идеальный подход. Но, вероятно, не стоит использовать его для чего-то более важного, что может повлиять, например, на корректность вёрстки.

    Конечно, если вы используете jQuery, то вам не стоит переживать по этому поводу, так как jQuery работает даже в Internet Explorer.

    Ну и напоследок

    Вы можете поиграть с различными выражениями для селектора на



    Понравилась статья? Поделиться с друзьями: