Селекторы CSS¶
Селекторы CSS — это шаблоны, используемые в каскадных таблицах стилей (CSS) для выбора одного или нескольких элементов HTML-документа, к которым применяются определённые стилевые правила. Селекторы определяют, какие именно элементы на веб-странице будут стилизованы, и являются основой для связывания структуры документа (HTML) с его визуальным представлением (CSS). Механизм селекторов реализован в соответствии со спецификацией W3C Selectors Level 3 (CSS3) и более поздними версиями.
¶История и развитие
Селекторы появились одновременно с первой версией CSS, предложенной Хоконом Виум Ли и Бертом Босом в 1996 году. В CSS1 были доступны простые селекторы: по типу элемента, по классу, по идентификатору, а также контекстные селекторы (потомков). Спецификация CSS2, опубликованная в 1998 году, расширила возможности за счёт селекторов атрибутов, псевдоклассов и псевдоэлементов. Ключевым этапом стала спецификация Selectors Level 3 (2009–2011 годы), которая ввела комбинаторы (соседние и дочерние селекторы), новые псевдоклассы (например, :nth-child()), а также селекторы по отрицанию (:not()). В 2018 году была опубликована спецификация Selectors Level 4, которая добавила псевдоклассы :is(), :where(), :has() и другие, а также расширила синтаксис псевдоэлементов.
¶Основные типы селекторов
Селекторы CSS классифицируются по способу сопоставления с элементами HTML. В современных браузерах поддерживаются все основные типы, описанные в спецификациях CSS3 и CSS4.
¶Селекторы по типу элемента (тегу)
Селектор по типу сопоставляется с именем HTML-тега. Например, селектор p выбирает все абзацы <p>, а div — все блоки <div>. Это самый простой и широко используемый тип.
``css p { color: red; } ``
¶Селекторы по классу
Селектор по классу выбирает элементы, у которых в атрибуте class указано соответствующее значение. В CSS класс обозначается точкой перед именем: .classname. Один элемент может иметь несколько классов, разделённых пробелами.
``css .highlight { background-color: yellow; } ``
¶Селекторы по идентификатору
Селектор по идентификатору выбирает элемент с указанным значением атрибута id. Идентификатор должен быть уникальным в пределах документа. В CSS обозначается символом решётки: #idname.
```css
¶header {
font-size: 24px; } ```
¶Селекторы атрибутов
Селекторы атрибутов позволяют выбирать элементы на основе наличия атрибута или его значения. Существует несколько вариантов синтаксиса:
[attr]— элемент имеет атрибутattr(любое значение).[attr="value"]— точное совпадение значения.[attr~="value"]— значение содержит словоvalueв списке, разделённом пробелами.[attr^="value"]— значение начинается сvalue.[attr$="value"]— значение заканчивается наvalue.[attr*="value"]— значение содержит подстрокуvalue.[attr|="value"]— значение равноvalueили начинается сvalue-.
Пример: ``css a[href^="https"] { color: green; } ``
¶Комбинаторы
Комбинаторы связывают несколько простых селекторов, указывая на отношения между элементами в DOM-дереве.
- Потомок (пробел) — выбирает элементы, являющиеся потомками (любого уровня вложенности) указанного родителя. Например,
div pвыбирает все<p>, находящиеся внутри<div>. - Дочерний (>) — выбирает только прямых потомков. Например,
ul > liвыбирает<li>, которые являются непосредственными детьми<ul>. - Соседний (+) — выбирает элемент, который непосредственно следует за указанным элементом. Например,
h2 + pвыбирает первый абзац после каждого заголовка<h2>. - Общий соседний (~) — выбирает все элементы, которые следуют за указанным элементом и имеют общего родителя. Например,
h2 ~ pвыбирает все абзацы, идущие после<h2>.
¶Псевдоклассы
Псевдоклассы определяют особое состояние элемента или его положение в структуре документа. Они начинаются с двоеточия (:). Основные группы:
- Динамические псевдоклассы:
:hover(при наведении мыши),:focus(при фокусе),:active(в момент активации),:visited(посещённая ссылка). - Структурные псевдоклассы:
:first-child,:last-child,:nth-child(n),:nth-of-type(n),:only-child,:empty. - Псевдоклассы состояния:
:enabled,:disabled,:checked,:required,:valid,:invalid(для элементов форм). - Псевдоклассы отрицания и логики:
:not(selector),:is(selector),:where(selector),:has(selector).
Пример: ``css li:nth-child(odd) { background-color: #f0f0f0; } ``
¶Псевдоэлементы
Псевдоэлементы позволяют стилизовать определённые части элемента или создавать виртуальные элементы, не существующие в DOM. Они обозначаются двойным двоеточием (::). Основные:
::before— вставляет контент перед содержимым элемента.::after— вставляет контент после содержимого элемента.::first-line— стилизует первую строку текста.::first-letter— стилизует первую букву.::selection— стилизует выделенный пользователем текст.
Пример: ``css p::first-letter { font-size: 2em; font-weight: bold; } ``
¶Специфичность и каскад
Специфичность (вес) селектора определяет, какое правило будет применено, если несколько правил конфликтуют. Расчёт специфичности производится по четырём уровням (в порядке убывания приоритета):
- Встроенные стили (атрибут
styleв HTML) — имеют наивысший приоритет. - Идентификаторы — каждый
#idдобавляет 0,1,0,0. - Классы, псевдоклассы, атрибуты — каждый
.class,:pseudo,[attr]добавляет 0,0,1,0. - Типы элементов и псевдоэлементы — каждый
tag,::pseudoдобавляет 0,0,0,1.
При равенстве специфичности применяется правило, объявленное позже в коде. Правило с !important переопределяет все обычные правила, но его использование не рекомендуется.
¶Производительность и оптимизация
Браузеры обрабатывают селекторы справа налево. Например, для селектора div p a браузер сначала находит все ссылки <a>, затем проверяет, находятся ли они внутри <p>, и только потом — внутри <div>. Поэтому для повышения производительности рекомендуется:
- Избегать слишком глубоких селекторов (более 3–4 уровней).
- Использовать селекторы по классам вместо длинных цепочек потомков.
- Избегать универсального селектора
*в комбинации с другими селекторами. - Предпочитать селекторы по ID и классу селекторам по тегу.
¶Применение в современных веб-технологиях
Селекторы CSS используются не только в классических таблицах стилей, но и в:
- JavaScript — методы
querySelector()иquerySelectorAll()принимают CSS-селекторы для поиска элементов в DOM. - Препроцессоры CSS (Sass, Less) — поддерживают вложенность селекторов и наследование.
- Фреймворки (React, Vue, Angular) — часто используют CSS-модули или CSS-in-JS, где селекторы применяются в ограниченной области видимости.
- Тестирование — инструменты вроде Selenium и Cypress используют CSS-селекторы для поиска элементов на странице.
¶Ограничения и особенности
- Селекторы не могут выбирать элементы на основе их содержимого (текста) или позиции относительно других элементов, не являющихся предками или соседями.
- Псевдокласс
:has()(CSS Selectors Level 4) позволяет выбирать родительский элемент, содержащий определённый дочерний элемент, но его поддержка в браузерах ограничена (по состоянию на 2024 год поддерживается в большинстве современных браузеров, кроме некоторых старых версий). - Селекторы не чувствительны к регистру для имён тегов HTML (в режиме без XHTML), но чувствительны для имён классов и идентификаторов.
¶Источники
- Спецификация W3C Selectors Level 3 (CSS3)
- Спецификация W3C Selectors Level 4 (CSS4)
- MDN Web Docs: CSS Selectors
- «CSS: The Definitive Guide» by Eric A. Meyer (O'Reilly Media)
- «CSS Pocket Reference» by Eric A. Meyer