Содержание

Псевдоклассы, псевдоэлементы — Изучение веб-разработки

  • Назад
  • Обзор: Building blocks
  • Далее

Следующий набор селекторов, который мы рассмотрим, относится к псевдоклассам и псевдоэлементам. Их очень много, и они часто служат довольно специфическим целям. После того как вы узнаете порядок их использования, просмотрите список — не найдётся ли в нём что-либо, что поможет решить стоящую перед вами задачу. Кроме того, будет полезным заглянуть на соответствующую каждому селектору страницу MDN, чтобы прояснить, как его обрабатывает браузер.

Необходимые условия: Базовая компьютерная грамотность, установка базового ПО, базовые знания о работе с файлами, основы HTML (изучите Введение в HTML) и понимание работы CSS (изучите Введение в CSS.)
Цель: Узнать о селекторах псевдокласса и псевдоэлемента.

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

Они обычно действуют так, как если бы вы применили класс к какой-то части вашего документа, что часто помогает сократить избыточные классы в разметке и даёт более гибкий, удобный в поддержке код.

Псевдоклассы — это ключевые слова, которые начинаются с двоеточия:

:pseudo-class-name

Простой пример псевдокласса

Давайте рассмотрим простой пример. Если бы мы хотели сделать шрифт первого абзаца статьи более крупным и жирным, мы могли бы добавить класс к этому абзацу, а затем добавить CSS к этому классу, как показано в первом примере ниже:

Однако поддержка может оказаться утомительной — что если новый абзац будет добавлен в верхнюю часть документа? Тогда нам нужно будет передвинуть класс к новому абзацу. Вместо добавления класса мы могли бы использовать селектор псевдокласса

:first-child — он всегда будет нацелен на первый дочерний элемент в статье, и нам больше не нужно будет редактировать HTML (к тому же это не всегда возможно, например, в случае если он генерируется CMS. )

Все псевдоклассы ведут себя подобным образом. Они нацелены на какой-то фрагмент вашего документа, находящийся в определённом состоянии, и ведут себя так, как если бы вы добавили класс в свой HTML. Рассмотрим некоторые другие примеры в MDN:

  • :last-child
  • :only-child
  • :invalid

Примечание : Правильно писать псевдоклассы и элементы без какого бы то ни было предшествующего им селектора элемента. В примере выше вы могли бы написать :first-child и правило было бы применено к любому элементу, оказавшемуся первым дочерним для <article>, не только к первому дочернему абзацу — :first-child равнозначно *:first-child. Однако обычно вы хотите большего контроля, поэтому вам нужен более специфичный селектор.

Псевдоклассы пользовательского действия

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

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

  • :hover — упоминался выше; он применяется только в том случае, если пользователь наводит указатель мыши на элемент, обычно на ссылку.
  • :focus — применяется только в том случае, если пользователь фокусируется на элементе, используя управление с клавиатуры.

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

::.

::pseudo-element-name

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

Например, если вы хотите выбрать первую строку абзаца, вы могли бы обернуть её в

<span> и использовать селектор элемента; однако это может не сработать, если количество слов, которые вы обернули, будет больше или меньше ширины родительского элемента. Поскольку мы, как правило, не знаем, сколько слов поместится в строке — т.к. их количество меняется, если меняется ширина экрана или размер шрифта — то надёжного решения при помощи HTML нет.

Селектор псевдоэлемента ::first-line сделает это наверняка — если количество слов увеличивается или уменьшается, он всё равно будет выбирать только первую строку.

Он действует так, как если бы <span> волшебным образом был обёрнут вокруг этой первой отформатированной строки и обновлялся бы каждый раз при изменении длины строки.

Вы можете видеть, что селектор выбирает первую строку обоих абзацев.

Если вы хотите сделать шрифт первой строки первого абзаца жирным, вы можете связать вместе селекторы :first-child и ::first-line. Попробуйте отредактировать предыдущий живой пример, чтобы использовалась следующая CSS. Мы говорим, что хотим выбрать первую строку первого элемента <p>, который находится внутри элемента <article>.

article p:first-child::first-line {
  font-size: 120%;
  font-weight: bold;
}

Существует пара специальных псевдоэлементов, которые используются вместе со свойством

content для вставки содержимого в документ с помощью CSS.

Вы можете использовать их для вставки строки текста, как в приведённом ниже живом примере. Попробуйте изменить текстовое значение свойства content и вы увидите, как изменится результат. Можете также изменить псевдоэлемент ::before на ::after и увидите, что текст вставлен в конце элемента, а не в начале.

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

Более корректным использованием этих псевдоэлементов является вставка значка, например маленькой стрелки, добавленной в приведённом ниже примере, которая является визуальным указателем, не предназначенным для зачитывания с помощью экранного диктора:

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

В следующем примере мы добавили пустую строку, используя псевдоэлемент ::before. Мы установили display: block, чтобы стилизовать его по ширине и высоте. Затем мы используем CSS, чтобы стилизовать его так же, как и любой другой элемент. Вы можете поиграть с CSS и изменить его внешний вид и поведение.

Использование псевдоэлементов ::before и ::after вместе со свойством content в CSS называется «генерируемым контентом» в CSS, и вы часто будете видеть, как этот метод используется для различных задач. Отличным примером является сайт CSS Arrow Please, который помогает вам генерировать стрелку с помощью CSS. Посмотрите на CSS, когда вы создадите свою стрелку, и вы увидите использование псевдо-элементов ::before и ::after. Всякий раз, когда вы будете видеть эти селекторы, смотрите на свойство

content, чтобы увидеть, что добавляется в документ..

Существует большое количество псевдоклассов и псевдоэлементов, и полезно иметь список, к которому можно обращаться. Ниже приведены таблицы, в которых они перечислены, со ссылками на их справочные страницы в MDN. Используйте эти таблицы как справочник, чтобы видеть массив доступных вам средств для нацеливания на элементы.

Псевдоклассы

Псевдоэлементы

  • Назад
  • Обзор: Building blocks
  • Далее
  1. Каскад и наследование
  2. Селекторы CSS
    • Селекторы типа, класса и ID
    • Селекторы атрибута
    • Псевдоклассы и псевдоэлементы
    • Комбинаторы
  3. Модель коробки
  4. Фон и границы
  5. Обработка разных направлений текста
  6. Переполнение содержимого
  7. Значения и единицы измерения
  8. Изменение размеров в CSS
  9. Элементы изображений, форм и медиа-элементы
  10. Стилизация таблиц
  11. Отладка CSS
  12. Организация вашей CSS

Last modified:

Мы видели в основном три типа селекторов CSS:

  • обычные, где р в CSS нацеливается на HTML-элементы <p>;
  • классы, где .intro в CSS нацеливается на элементы с атрибутом;
  • идентификаторы, где #logo в CSS нацеливается на элемент с атрибутом.

Ко всем этим селекторам могут прикрепляться псевдоклассы. Псевдокласс:

  • определяет конкретное состояние элемента;
  • это ключевое слово, которое начинается с двоеточия.

Синтаксис

Псевдокласс не может существовать сам по себе. Он должен быть прикреплён к селектору. Псевдокласс будет определять только определённое состояние этого селектора.

Синтаксис выглядит следующим образом:

селектор:псевдокласс { }

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

:hover

К примеру, типовым используемым псевдоклассом является :hover, который будет применять стиль, когда на целевой элемент наводится указатель мыши. Давайте проверим это на ссылках.

HTML

<p>Наведите курсор <a href="#">на эту ссылку</a> и увидите, как она становится красной.</p>

CSS

a { color: blue; }
a:hover { color: red; }

Первая строка в CSS определяет, что все элементы <a> должны выглядеть синими. Вторая строка определяет, что при наведении указателя мыши <a> должны выглядеть красными.

Вторая строка ориентирована на те же элементы HTML, но только, когда происходит что-то конкретное (в данном случае, наведение).

:visited

Этот псевдокласс нацеливается на ссылки, которые уже были посещены. По умолчанию ссылки отображаются синими и при посещении становятся фиолетовыми. Результаты Google работают так же.

HTML

<a href="https://www.google.com">Google</a>
<a href="https://twitter.com">Twitter</a>
<a href="https://www.facebook.com">Facebook</a>
<a href="https://www.mozilla.org">Mozilla</a>
<a href="http://marksheet.io/visited.html">MarkSheet</a>

CSS

a { color: dodgerblue; }
a:visited { color: rebeccapurple; }

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

:focus

Данный псевдокласс происходит, когда элемент HTML получает фокус. Это особенно полезно для полей форм.

.form-input { border: 2px solid grey; padding: 5px; }
.form-input:focus { background: lightyellow; border-color: blue; outline: none; }

Правило outline: none удаляет свечение вокруг поля.

:first-child и :last-child

Эти псевдоклассы связаны с иерархией в HTML. Они нацеливаются на элементы HTML в зависимости от порядка, в котором они появляются в коде.

HTML

<ul>
  <li>Один</li>
  <li>Два</li>
  <li>Три</li>
  <li>Четыре</li>
</ul>

CSS

li:first-child { background: greenyellow; }
li:last-child { background: lightsalmon; }

Как вы можете видеть, ни один стилевой класс не применяется к первому и последнему <li>. Их положение в иерархии определяется с помощью правил CSS.

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

:nth-child

Данный псевдокласс является глобальной версией :first-child и :last-child. С помощью :nth-child вы можете вычислить конкретный дочерний целевой элемент.

К примеру, если вы хотите нацелиться на второй дочерний элемент, то используйте :nth-child(2).

li:nth-child(2) { background: violet; }

odd и even

Кроме использования чисел, :nth-child поставляется с двумя ключевыми словами:

  • :nth-child(odd) нацелится на каждый нечётный элемент;
  • :nth-child(even) нацелится на каждый чётный элемент.
li:nth-child(odd) { background: gold; }

Счётчик n

Мощным аспектом :nth-child является то, что он может нацелиться на элементы, основываясь на расчётах с помощью ключевого слова n.

Значение n повышается от 0 до количества представленных дочерних элементов.

Что делать, если вы хотите нацелиться на каждый третий элемент?

li:nth-child(3n) { background: hotpink; }

В нашем случае n начинается с нуля и заканчивается шестью.

Компьютеры начинают отсчёт с нуля. И поскольку в нашем списке семь элементов, мы будем считать до шести, потому что 0-1-2-3-4-5-6 представляют семь пунктов.

Вы можете прочитать :nth-child(3n) как «нацелиться на каждый элемент, положение которого делится на 3». В нашем случае, это третий и шестой пункт списка:

  • 3 умножить на 0 равен нулю;
  • 3 умножить на 1 — третий пункт;
  • 3 умножить на 2 — шестой пункт.

n + 1

Что делать, если вы хотите нацелиться на первый пункт и каждый третий пункт после него?

li:nth-child(3n+1) { background: limegreen; }

3n + 1 состоит из двух частей:

  • 3n выбирает каждый третий пункт;
  • +1 смещает начало на 1.

Вот как были выполнены вычисления:

  • 3 умножить на 0 плюс 1 равно 1;
  • 3 умножить на 1 плюс 1 равно 4;
  • 3 умножить на 2 плюс 1 равно 7.

Счётчик n является очень гибким. Если вычисления делать сложно, то просто протестируйте, чтобы получить правильную выборку.

Другие псевдоклассы

Есть десятки доступных псевдоклассов, некоторые из них предназначены для очень специфичных состояний. Мы описали наиболее используемые из них.

См. также

  • :first-child и :last-child
  • :focus для полей формы
  • :focus на мобильных устройствах
  • :nth-child()
  • Виды ссылок
  • Всплывающая подсказка
  • Использование :hover
  • Нормальное позиционирование
  • Нумерованные списки
  • Переходы с помощью :hover
  • Подсветка строк и колонок таблицы
  • Псевдокласс :first-child
  • Псевдокласс :first-of-type
  • Псевдокласс :focus
  • Псевдокласс :focus-within
  • Псевдокласс :hover
  • Псевдокласс :last-child
  • Псевдокласс :nth-child
  • Псевдокласс :nth-last-child
  • Псевдокласс :visited
  • Работа с типографикой
  • Селекторы CSS
  • Сочетание с псевдоклассами

Селекторы, псевдоклассы и псевдоэлементы | CSS справочник

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

Селекторы

СелекторПримерОписание примера
Chrome

Firefox

Opera

Safari

IExplorer

Edge
.class.testВыбирает все элементы с классом test (class = «test»). ДаДаДаДаДаДа
#id#testВыбирает все элементы с id = «test». ДаДаДаДаДаДа
** Выбирает все элементы (универсальный селектор). Селектор также может выбрать все элементы внутри другого элемента. 4.02.09.63.17.012.0
elementh3 Выбирает все заголовки второго уровня — <h3>. ДаДаДаДаДаДа
selector,selectorh3, h4 Выбирает все элементы <h3> и <h4>. ДаДаДаДаДаДа
selector selectorh3 i Выбирает все элементы <i> внутри элементов <h3>. ДаДаДаДаДаДа
selector > selectorp > a Выбирает все дочерние элементы <a>, у которых родитель — элемент <p>. ДаДаДаДа7.012.0
selector + selectorh3 + p Выбирает все элементы <p>, которые расположены сразу же после элементов <h3>. ДаДаДаДа7.012.0
selector ~ selectorh3 ~ p Выбирает все элементы <p>, которые следуют сразу же за элементом <h3>, а также все элементы <p>, которые находятся на одном уровне вложенности. 4.03.59.63.27. 012.0
[attribute][title] Выбирает все элементы с атрибутом title. 4.02.09.63.17.012.0
[attribute = value][type=password] Выбирает все элементы с атрибутом type и значением «password» 4.02.09.63.17.012.0
[attribute=value][attribute2=value2][src=’logo.png’][alt=’image’] Выбирает все элементы, которые имеют указанные атрибуты (src и alt) со значениями этих атрибутов logo.png для первого и image для второго. 4.02.09.63.17.012.0
[attribute ~ = value][title ~ = home] Выбирает все элементы с атрибутом title, который содержит слово «home». 4.02.09.63.17.012.0
[attribute|= value][title | = home] Выбор всех элементов с атрибутом title, значение которого начинается с «home». = «http»] Выбирает каждый элемент <a>, содержащий атрибут href, значение которого начинается с «http». 4.03.59.63.27.012.0
[attribute$=value]a[href$= «.mp3»] Выбирает каждый элемент <a>, значение атрибута href которого заканчивается на «.mp3». 4.03.59.63.27.012.0
[attribute*=value][title*=»home»] Выбор всех элементов с атрибутом title, в значение которого содержится «home». 4.03.59.63.27.012.0

Псевдоэлементы

ПсевдоклассПримерОписание
Chrome

Firefox

Opera

Safari

IExplorer

Edge
::afterp::after Добавляет содержимое после каждого элемента <p>. 4.03.57.0*3.19.0*12.0
::beforep::before Добавляет содержимое перед каждым элементом <p>. 4.03.57.0*3.19.0*12.0
::first-letterp::first-letter Позволяет создавать инициал (буквицу) — стилизовать начальный символ каждого элемента <p>. 1.01.07.0*1.09.0*12.0
::first-linep::first-line Позволяет стилизовать первую строку каждого элемента <p>, которая будет отличаться от основного текста. 1.01.09.0*12.0
::selection::selection Позволяет добавлять тень к тексту, управлять цветом фона и цветом текста, выделенного пользователем 4.02.0
-moz-
10.13.19.012.0

Псевдоклассы

ПсевдоэлементПримерОписание
Chrome

Firefox

Opera

Safari

IExplorer

Edge
:activea:active Применяет стиль к активной ссылке. 4.02.09.63.17.012.0
:checkedinput:checked Применяется к элементам <input> (выбранные элементы type = «radio» или type = «checkbox») 4.03.59.63.29.012.0
:disabledinput:disabled Выбирает каждый отключенный элемент <input>. 4.03.59.63.29.012.0
:emptydiv:empty Выбирает каждый элемент <div>, который не содержит дочерних элементов (включая текст/ пробелы). 4.03.59.63.29.012.0
:enabledinput:enabled Применяется для выбора каждого элемента <input>, который не отключен. 4.03.59.63.29.012.0
:first-childh3:first-child Выбирает любой тег <h3>, который является первым дочерним тегом своего родителя. 4.03.09.63.17.012.0
:first-of-typep:first-of-type Выбор каждого элемента <p>, который является первым из элементов своего родительского элемента. 4.03.59.63.29.012. 0
:focusinput:focus Стилизует элемент <input>, который находится в фокусе. 4.02.09.63.18.012.0
:hovera:hover Стилизует ссылку (элемент <a>) при наведении указателя мыши. 4.02.09.63.17.012.0
:in-rangeinput:in-range Выбирает все элементы <input> со значением в указанном диапазоне. 10.028.011.05.2Нет13.0
:invalidinput:invalid Выбирает все элементы <input> в которых значение указано некорректно (не соответствует типу входных данных). 10.04.010.05.010.012.0
:lang(код языка)p:lang(es) Выбирает каждый элемент <p>, атрибут lang которого, содержит значение «es» (Español) 4. 02.09.63.18.012.0
:last-childh3:last-child Выбирает любой тег <h3>, который является последним дочерним элементом своего родителя. 4.03.59.63.29.012.0
:last-of-typep:last-of-type Выбор каждого элемента <p>, который является последним из элементов своего родительского элемента. 4.03.59.63.29.012.0
:linka:link Задаёт стиль всем ссылкам, по которым пользователь не произвёл переход (не посещенные ссылки). 4.02.09.63.17.012.0
:not(селектор):not(h3) Задаёт стиль всем элементам, которые не являются элементом <h3> 4.03.59.63.29.012.0
:nth-child(n)tr:nth-child(2) Выбирает каждый элемент <tr>, который является вторым дочерним элементом своего родительского элемента. 4.03.59.63.29.012.0
:nth-last-child(n)p:nth-last-child(2) Выбирает каждый элемент <li>, который является вторым дочерним элементом своего родительского элемента (считая от последнего дочернего элемента). 4.03.59.63.29.012.0
:nth-last-of-type(n)p:nth-last-of-type(2) Выбирает каждый элемент <p>, который является вторым дочерним элементом своего родительского элемента (считая от последнего дочернего элемента). 4.03.59.63.29.012.0
:nth-of-type(n)img:nth-of-type(2) Выбор каждого элемента <img>, который является вторым дочерним элементом своего родительского элемента. 4.03.59.63.29.012.0
:only-childp:only-child Выбор каждого элемента <p>, который является единственным дочерним элементом своего родительского элемента (нет других элементов). 4.03.59.63.29.012.0
:only-of-typep:only-of-type Выбор каждого элемента <p>, который является единственным элементом <p> своего родительского элемента (нет других элементов <p>). 4.03.59.63.29.012.0
:optionalinput:optional Выбирает все элементы <input>, у которых не задан атрибут required (который указывает, что пользователь обязательно должен выбрать/добавить значение перед отправкой формы). 10.04.010.05.010.012.0
:out-of-rangeinput:out-of-range Выбирает все элементы <input>, которые находятся за пределами указанного диапазона (атрибуты min и max). 10.028.011.05.2Нет13.0
:read-onlyinput:read-only Выбирает все элементы <input> для которых указан атрибут readonly (только для чтения). Да -moz-ДаДаНет13.0
:read-writeinput:read-write Выбирает все элементы <input> для которых не указан атрибут readonly (только для чтения). Да -moz-ДаДаНет13.0
:requiredinput:required Выбирает все элементы <input>, у которых задан атрибут required (который указывает, что пользователь обязательно должен выбрать/добавить значение перед отправкой формы). 10.04.010.05.010.012.0
:root:root Определяет корневой элемент документа. 4.03.59.63.29.012.0
:target:target Стилизует целевой элемент на странице (на который был произведён переход по якорной ссылке). 4.03.59. 63.29.012.0
:validinput:valid Выбирает все элементы <input> в которых значение указано корректно (соответствует типу входных данных). 10.04.010.05.010.012.0
:visiteda:visited Задаёт стиль всем ссылкам, по которым пользователь произвёл переход (посещенные ссылки). 4.02.09.63.17.012.0

псевдоклассов — CSS: Каскадные таблицы стилей

Псевдокласс CSS — это ключевое слово, добавляемое к селектору, которое определяет особое состояние выбранных элементов. Например, псевдокласс :hover можно использовать для выбора кнопки, когда указатель пользователя наводит на кнопку, и затем для этой выбранной кнопки можно задать стиль.

 /* Любая кнопка, над которой находится указатель пользователя */
кнопка:наведите {
  цвет синий;
}
 

Псевдокласс состоит из двоеточия ( : ), за которым следует имя псевдокласса (например, :hover ). Функциональный псевдокласс также содержит пару скобок для определения аргументов (например, :dir() ). Элемент, к которому прикреплен псевдокласс, определяется как элемент привязки (например, кнопка в случае button:hover ).

Псевдоклассы позволяют применить стиль к элементу не только по отношению к содержимому дерева документа, но и по отношению к внешним факторам, таким как история навигатора ( :visited , например), состояние его содержимого (например, :checked для определенных элементов формы) или положение мыши (например, :hover , которое позволяет узнать, находится ли мышь над элементом или нет).

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

Эти псевдоклассы позволяют выбирать элементы на основе их состояний отображения.

:полноэкранный режим

Соответствует элементу, который в данный момент находится в полноэкранном режиме.

:модальный

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

:картинка в картинке

Соответствует элементу, который в данный момент находится в режиме «картинка в картинке».

Эти псевдоклассы относятся к элементам формы и позволяют выбирать элементы на основе атрибутов HTML и состояния, в котором находится поле до и после взаимодействия.

:автозаполнение

Соответствует, когда было автоматически заполнено браузером.

:включено

Представляет элемент пользовательского интерфейса, находящийся во включенном состоянии.

:отключено

Представляет элемент пользовательского интерфейса, который находится в отключенном состоянии.

:только для чтения

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

: чтение-запись

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

: показан заполнитель

Соответствует элементу ввода, отображающему текст-заполнитель. Например, он будет соответствовать заполнитель атрибут в элементах и