Псевдоклассы определяют динамическое состояние элементов, которое изменяется с помощью действий пользователя, а также положение в дереве документа. Примером такого состояния служит текстовая ссылка, которая меняет свой цвет при наведении на неё курсора мыши. При использовании псевдоклассов браузер не перегружает текущий документ, поэтому с помощью псевдоклассов можно получить разные динамические эффекты на странице.
Вначале указывается селектор, к которому добавляется псевдокласс, затем следует двоеточие, после которого идёт имя псевдокласса. Допускается применять псевдоклассы к именам идентификаторов или классов, а также к контекстным селекторам. Если псевдокласс указывается без селектора впереди, то он будет применяться ко всем элементам документа.
Псевдоклассы пользовательского интерфейса
Подобно ссылкам существуют также некоторые псевдоклассы, связанные с состоянием элементов пользовательского интерфейса, в частности, внутри форм. Эти псевдоклассы включают в себя :enabled
, :disabled
, :checked
и :indeterminate
.
Псевдокласс :enabled
выбирает поля, которые включены и доступны для использования, а псевдокласс :disabled
выбирает поля, которые содержат привязанный к ним атрибут disabled
. Многие браузеры по умолчанию затемняют такие заблокированные поля для информирования пользователей о том, что поле не доступно для взаимодействия, однако их стиль может быть настроен по желанию через псевдокласс :disabled
.
input:enabled { .... }
input:disabled {
margin: 10px;
box-shadow: 0 0 10px rgba(0,0,0, 0.5);
}
Последние два элемента состояния интерфейса, псевдоклассы :checked
и :indeterminate
вращаются вокруг флажков и переключателей. Псевдокласс :checked
выбирает флажки или переключатели, которые, как вы можете ожидать, помечены. Когда ни один флажок или переключатель не помечен и не выбран, то он живёт в неопределённом состоянии, для которого может быть использован псевдокласс :indeterminate
для нацеливания на подобные элементы.
input:indeterminate { .... }
input:checked {
width: 3vh;
height: 3vh;
box-shadow: 0 0 10px rgba(0,0,0, 0.5);
}
Псевдоклассы, имеющие отношение к дереву документа
К этой группе относятся псевдоклассы, которые определяют положение элемента в дереве документа и применяют к нему стиль в зависимости от его статуса.
Эти псевдоклассы приходят в разных формах и размерах, каждый из которых обеспечивает свою собственную уникальную функцию. Некоторые псевдоклассы существуют уже дольше других, однако CSS3 принёс целый новый набор псевдоклассов в дополнение к существующим.
:first-child
, :last-child
и :only-child
Первые структурные псевдоклассы, которые вам скорее всего попадутся, это :first-child
, :last-child
и :only-child
. Псевдокласс :first-child
выберет элемент, если это первый ребёнок в родителе, в то время как псевдокласс :last-child
выберет элемент, если он последний в родителе. Эти псевдоклассы идеально подходят для выбора первого или последнего элемента в списке и др. Кроме того, :only-child
выберет элемент, если он является единственным элементом в родителе.
p b:first-child {
color: green;
text-transform: uppercase;
}
p b:last-child {
color: red;
text-transform: uppercase;
}
Душа моя озарена неземной радостью, как эти чудесные весенние утра, которыми я наслаждаюсь от всего сердца.
p b:only-child {
font-weight: 600;
color: hsl(190, 60%, 70%);
text-transform: uppercase;
}
Душа моя озарена неземной радостью, как эти чудесные весенние утра, которыми я наслаждаюсь от всего сердца.
:first-of-type
, :last-of-type
и :only-of-type
Нахождение первого, последнего и единственного ребёнка у родителя очень полезно и часто только это и требуется. Однако иногда вы хотите выбрать только первого, последнего или единственного ребёнка определённого типа элемента. К примеру, вы желаете выбрать только первый или последний абзац внутри статьи или, возможно, только изображение в статье. К счастью, в этом помогают псевдоклассы :first-of-type
, :last-of-type
и :only-of-type
.
Псевдокласс :first-of-type
выберет первый элемент своего типа внутри родителя, в то время как псевдокласс :last-of-type
выберет последний элемент этого типа внутри родителя. Псевдокласс :only-of-type
выберет элемент, если он является единственным такого типа в родителе.
div p:first-of-type {
color: green;
text-transform: uppercase;
}
div p:last-of-type {
color: red;
text-transform: uppercase;
}
div img:only-of-type {
border: thin solid #000;
}
Душа моя озарена неземной радостью, как эти чудесные весенние утра, которыми я наслаждаюсь от всего сердца. Я совсем один и блаженствую в здешнем краю, словно созданном для таких, как я.
Я так счастлив, мой друг, так упоен ощущением покоя, что искусство мое страдает от этого. Ни одного штриха не мог бы я сделать, а никогда не был таким большим художником, как в эти минуты.
Когда от милой моей долины поднимается пар и полдневное солнце стоит над непроницаемой чащей темного леса и лишь редкий луч проскальзывает в его святая святых, а я лежу в высокой траве у быстрого ручья и, прильнув к земле, вижу тысячи всевозможных былинок и чувствую, как близок моему сердцу крошечный мирок, что снует между стебельками, наблюдаю эти неисчислимые, непостижимые разновидности червяков и мошек и чувствую близость всемогущего, создавшего нас по своему подобию, веяние вселюбящего, судившего нам парить в вечном блаженстве, когда взор мой туманится и все вокруг меня и небо надо мной запечатлены в моей душе, точно образ возлюбленной, - тогда, дорогой друг, меня часто томит мысль: "Ах!
Как бы выразить, как бы вдохнуть в рисунок то, что так полно, так трепетно живет во мне, запечатлеть отражение моей души, как душа моя - отражение предвечного бога!
В приведённом выше примере псевдоклассы div p:first-of-type
и div p:last-of-type
выберут, соответственно, первый и последний абзацы в статье, независимо от того, являются ли они на самом деле первыми или последними детьми в статье. Селектор div img:only-of-type
определяет изображение, как единственное изображение появляющееся в статье.
:nth-child(n)
, :nth-last-child(n)
, :nth-of-type(n)
и :nth-last-of-type(n)
Наконец, есть несколько псевдоклассов структуры и положения, которые выбирают элементы, основанные на номере или алгебраическом выражении. Эти псевдоклассы включают в себя :nth-child(n)
, :nth-last-child(n)
, :nth-of-type(n)
и :nth-last-of-type(n)
. Все эти уникальные псевдоклассы начинаются с nth
и принимают число или выражение внутри круглых скобок, которое обозначается символом n
.
Число или выражение, которое находится в круглых скобках точно определяет, какой элемент или элементы, должны быть выбраны. Использование конкретного числа вычислит отдельный элемент с начала или с конца дерева документа, а затем выберет его. Использование выражения - вычислит множество элементов с начала или с конца дерева документа и выберет их группу или повторения.
Так же в каестве значения могут выступать ключевые слова odd - нечётные номера элементов и even - чётные номера элементов.
Пример использования :nth
- селекторов
№ |
Фио |
Дата |
1 |
Иванов Иван |
2015.10.09 |
2 |
Петров Пётр |
1985.11.25 |
3 |
Сидоров Сидр |
2000.03.11 |
4 |
Максимов Максим |
1999.06.30 |
5 |
Зайцев Андрей |
1990.08.07 |
Использование чисел и выражений в псевдоклассах
Как уже упоминалось, использование конкретного числа в псевдоклассе вычисляет с начала или с конца дерева документа и выбирает один соответствующий элемент. Например, селектор li:nth-child(4)
выберет четвёртый пункт в списке. Подсчёт начинается с первого пункта списка и увеличивается на единицу для каждого пункта списка, пока, наконец, не обнаружит четвёртый пункт и выберет его. При указании конкретного числа оно должно быть положительным.
Выражения для псевдоклассов бывают в формате an
, an+b
, an-b
, n+b
, -n+b
и -an+b
. То же самое выражение может быть переведено и читаться как (a*n)±b
. Переменная a
обозначает множитель, с учётом которого будут вычисляться элементы, в то время как переменная b
обозначает, откуда будет начинаться или происходить отсчёт.
Например, селектор li:nth-child(3n)
будет определять каждый третий элемент пункта списка. Использование этого выражения соответствует 3×0, 3×1, 3×2 и так далее. Как вы можете видеть, результаты этого выражения выбирают третий, шестой и каждый элемент кратный трём
Кроме того, в качестве значений могут быть использованы ключевые слова odd
и even
. Как и следовало ожидать, они будут выбирать, соответственно, нечётные или чётные элементы. Если ключевые слова не привлекают, то выражение 2n+1
выберет все нечётные элементы, а выражение 2n
выберет все чётные элементы.
Селектор li:nth-child(4n+7)
определит каждый четвёртый пункт списка, начиная с седьмого пункта. Опять же, использование этого выражения эквивалентно (4×0)+7, (4×1)+7, (4×2)+7 и так далее. Результаты этого выражения приведут к выбору седьмого, одиннадцатого, пятнадцатого и каждого четвёртого элемента.
При использовании аргумента n без числа впереди, переменная a расценивается как равная 1. Селектор li:nth-child(n+5)
выберет каждый пункт списка, начиная с пятого, оставив первые четыре пункта списка не выбранными. В выражении это разбирается как (1×0)+5, (1×1)+5, (1×2)+5 и так далее.
Для создания более сложных вещей могут быть задействованы отрицательные числа. Например, селектор li:nth-child(6n-4)
будет отсчитывать каждый шестой пункт списка, начиная с -4, выбрав второй, восьмой, четырнадцатый пункты списка и так далее. Тот же селектор li:nth-child(6n-4)
также может быть записан как li:nth-child(6n+2)
, без использования отрицательной переменной b
.
Отрицательная переменная или отрицательный аргумент n
должен сопровождаться положительной переменной b
. Когда аргументу n
предшествует отрицательная переменная a
, то переменная b
определяет, насколько высоко будет достигнут отсчёт. Например, селектор li:nth-child(-3n+12)
выберет каждый третий пункт списка в первых двенадцати пунктах. Селектор li:nth-child(-n+9)
выберет первые девять пунктов списка, так как переменная a
без заявленного числа по умолчанию равна -1.