Селектор класса
Селектор класса это точка и имя класса. Он оформляет все элементы, в атрибуте class которых есть это имя, независимо от типа элемента.
Точка есть только в CSS. В HTML атрибут записывается как class="badge", без точки. Регистр в именах классов важен: .Badge не совпадает с class="badge".
Несколько классов у одного элемента
У элемента может быть сколько угодно классов через пробел. Каждый приносит свои правила, и так из маленьких частей собираются варианты:
.btn.danger, без пробела, выбирает элементы, у которых есть оба класса. У последнего span есть danger, но нет btn, поэтому правило с цепочкой его пропускает.
Варианты селектора класса
| Селектор | Выбирает |
|---|---|
.note | Любой элемент с классом note |
p.note | Только элементы <p> с классом note |
.btn.primary | Элементы, у которых есть и btn, и primary |
.card .title | .title где угодно внутри .card |
.card > .title | .title, родитель которого .card |
.a, .b | Элементы с a или b |
Разница между пробелом и его отсутствием вместе с другими комбинаторами разобрана на странице про селекторы CSS.
Селектор ID
Селектор ID это решетка и id: #site-header оформляет элемент с id="site-header". Id должен быть уникальным на странице, поэтому селектор ID выбирает ровно один элемент.
Id нужны не только для стилей: href="#details" прокручивает к элементу, <label for="email"> указывает на id поля ввода, а JavaScript находит элемент через document.getElementById('details'). Обычно id дают элементу именно поэтому; для оформления класс подходит лучше.
Класс или ID
Класс .name | ID #name | |
|---|---|---|
| На странице | Много элементов | Один элемент |
| У элемента | Несколько, через пробел | Один |
| Специфичность | (0,1,0) | (1,0,0) |
Цель ссылки (#name в URL) | Нет | Да |
| Лучше всего для | Оформления | Якорей, label, привязки JavaScript |
Разница в специфичности и есть практическая причина оформлять через классы. Один ID сильнее любого числа классов, поэтому правило с ID можно перебить только другим ID, встроенным стилем или !important:
Добавление и удаление классов через JavaScript
Классы это обычный способ для JavaScript изменить внешний вид: CSS описывает состояния, а скрипт только переключает их.
У classList есть также add, remove, contains и replace. Не присваивайте className напрямую: это заменяет все классы, которые были у элемента.
Как называть классы
- Буквы, цифры, дефисы и подчеркивания безопасны:
card,card-title,card__title,is-open. - Не начинайте селектор с цифры или с дефиса и цифры.
.2colневалиден в CSS. Начинайте с буквы (.cols-2) или экранируйте цифру (.\32 col). - Называйте по назначению, а не по виду:
.errorпереживет редизайн,.red-textнет. - В больших проектах помогает соглашение об именах. BEM записывает
block__element--modifier, например.card__title--large.
Частые ошибки
- Точка в HTML.
class=".badge"никогда не совпадет с.badge. - Два атрибута
class.<p class="a" class="b">оставляет толькоa. Пишитеclass="a b". - Пробел там, где нужны оба класса.
.btn .primaryищет вложенный элемент;.btn.primaryэто тот же элемент. - Повторный id. Дубли id ломают
getElementById, ссылки-якоря и связь с label, даже если CSS вроде бы работает. - Оформление всего через id. Из-за их специфичности последующие переопределения мучительны; используйте классы.
Часто задаваемые вопросы
Как выбрать класс в CSS?
Напишите точку и имя класса: .card { ... } оформляет каждый элемент с class="card". Точка пишется только в CSS; в HTML-атрибуте ее нет.
Чем класс отличается от id в CSS?
Класс можно назначить любому числу элементов, и у элемента их может быть несколько; id должен быть уникальным на странице, и у элемента он максимум один. В CSS специфичность #id намного выше, чем у .class, поэтому правила по ID труднее переопределить.
Как дать элементу два класса?
Разделите имена пробелом в одном атрибуте: class="btn primary". Два атрибута class на элементе не работают; браузер оставляет только первый.
Как выбрать элемент, у которого два класса?
Соедините селекторы классов без пробела: .btn.primary выбирает элементы, у которых есть оба класса. С пробелом .btn .primary означает элемент .primary внутри элемента .btn.
Может ли имя класса CSS начинаться с цифры?
В HTML может, но селектор не может начинаться с неэкранированной цифры, поэтому .1col невалиден в CSS. Экранируйте цифру (.\31 col) или, что лучше, начинайте имена классов с буквы.