Menu

Селекторы CSS: виды, комбинаторы и селекторы атрибутов

Селектор CSS выбирает элементы, к которым применяется правило. Разберем все виды селекторов, четыре комбинатора (потомка, дочерний, соседний и общий родственный), селекторы атрибутов, группировку и проверим селекторы вживую.

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

Что такое селектор CSS

Селектор это часть правила перед фигурными скобками. Он решает, к каким элементам применяются объявления.

p.note { color: #2563eb; }
/* selector: p.note    declaration: color: #2563eb */

Пять базовых селекторов покрывают большинство реальных таблиц стилей:

Виды селекторов коротко

СелекторПримерВыбирает
Универсальный*Все элементы
По типуpКаждый <p>
По классу.tipЭлементы с class="tip" (среди прочих классов)
По ID#main-titleЭлемент с id="main-title"
По атрибуту[type="email"]Элементы с подходящим атрибутом
Псевдоклассa:hover, li:first-childЭлементы в определенном состоянии или позиции
Псевдоэлементp::first-line, .x::beforeЧасть элемента
Группаh1, h2, h3Все, что подходит под любой из списка
Составнойp.tip<p>, у которого есть еще и класс

Классам и ID посвящена отдельная страница, селектор класса CSS. Псевдоклассы вроде :nth-child() и :not() разобраны на странице про псевдоклассы.

Комбинаторы: потомок и дочерний элемент

Комбинатор соединяет два селектора по их отношению в дереве HTML. Их четыре.

КомбинаторСинтаксисВыбирает B, когда
ПотомкаA B (пробел)B находится где угодно внутри A
ДочернийA > BРодитель B это A
СоседнийA + BB идет сразу после A, родитель общий
Общий родственныйA ~ BB идет где-то после A, родитель общий

Чаще всего путают пробел и >. Селектор потомка достает на любую глубину, дочерний селектор останавливается на одном уровне:

Родственные комбинаторы: + и ~

Родственные селекторы смотрят только вперед. Комбинатора «предыдущий сосед» нет, но это можно выразить через :has(): h2:has(+ p) выбирает h2, за которым сразу идет p.

Селекторы атрибутов

Квадратные скобки проверяют атрибуты и их значения:

СелекторВыбирает
[disabled]Есть атрибут, значение любое
[type="email"]Значение ровно email
[href^="https"]Значение начинается с https
[href$=".pdf"]Значение заканчивается на .pdf
[class*="icon"]Значение содержит icon в любом месте
[lang|="en"]Значение en или начинается с en-
[data-state="open" i]Точное совпадение без учета регистра

Селекторы по атрибутам data-* позволяют чисто оформлять состояние, которое задает JavaScript, не придумывая имена классов.

Проверьте любой селектор

Введите селектор в поле. Каждый подходящий элемент получит янтарную обводку, а ниже появится их количество.

Попробуйте #demo a, ul > li, h2 ~ *, a[href^="https"], li:not(.active).

Составной селектор и селектор потомка: пробел имеет значение

p.note и p .note различаются одним пробелом и означают разное.

Как браузер применяет селекторы

Когда несколько правил подходят к одному элементу и задают одно свойство, побеждает более специфичный селектор, а при равенстве более поздний. ID перевешивает любое число классов, а класс любое число селекторов типа; полная таблица специфичности есть на странице про !important.

У группы есть подвох: если в обычном списке хотя бы один селектор невалиден, отбрасывается все правило. В a, b:unknown { } не оформятся даже ссылки. Если обернуть список в :is(), он становится снисходительным: :is(a, b:unknown) все равно оформит ссылки.

Частые ошибки

  • Нет точки или решетки. tip { } выбирает элемент <tip>, а не class="tip". Пишите .tip.
  • Пробел в составном селекторе. p .note это не p.note.
  • Ожидание, что > достанет до внуков. Для любой глубины используйте пробел.
  • Одна опечатка ломает всю группу. В h1, h2:hovr, h3 ничего не оформится.
  • Слишком длинные селекторы. body div.wrapper ul li a трудно читать и трудно переопределить. Обычно хватает одного класса.

Часто задаваемые вопросы

Что такое селектор CSS?

Часть правила CSS перед {, которая указывает, к каким элементам применяются объявления. В p.note { color: blue; } селектор p.note выбирает каждый <p> с классом note.

Чем отличается пробел от > в селекторе CSS?

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

Что означает + в CSS?

+ это комбинатор соседнего элемента. h2 + p выбирает <p>, который идет сразу после <h2> с тем же родителем. ~ мягче: h2 ~ p выбирает все последующие <p> того же родителя.

Как выбрать элементы по атрибуту в CSS?

Запишите атрибут в квадратных скобках: [disabled] выбирает элементы, у которых он есть, [type="email"] точное значение, [href^="https"] значение, начинающееся со строки, [href$=".pdf"] заканчивающееся ею, а [class*="btn"] содержащее ее.

Может ли CSS выбрать родительский элемент?

Да, с помощью псевдокласса :has(), который поддерживают актуальные Chrome, Firefox и Safari. li:has(> a.active) выбирает пункты списка, которые непосредственно содержат активную ссылку.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ