Что такое селектор 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 + B | B идет сразу после A, родитель общий |
| Общий родственный | A ~ B | B идет где-то после 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) выбирает пункты списка, которые непосредственно содержат активную ссылку.