Селекторы CSS: тег, класс и id

Селектор - это часть CSS-правила перед фигурными скобками: она говорит браузеру, к каким именно элементам применить стиль. Три базовых способа выбрать элемент - по названию тега, по классу (атрибут class) и по id (атрибут id). У каждого своя область действия: тег красит всех сразу, класс - группу похожих элементов, id - один конкретный.

Попробуй прямо в этом окне: у всех трёх абзацев тег одинаковый - p, но выглядят они по-разному, потому что к ним по очереди подключаются более сильные селекторы. Третий абзац стал tomato, хотя под него подходят все три правила сразу - почему победил именно id, разберём подробно в отдельном уроке про каскад и специфичность, а пока запомним сам факт: id сильнее класса, класс сильнее тега.

Селектор по тегу

Самый простой селектор - это просто название тега без всяких значков: p, h1, a. В спецификации CSS его называют «селектор типа», но в обычной речи чаще говорят «селектор по тегу» - это одно и то же. Такой селектор выбирает вообще все элементы этого тега на странице, где бы они ни находились.

p { color: tomato; } - все абзацы на странице станут tomato.

Ожидание, что p { color: tomato; } покрасит только «тот самый» один абзац - на деле правило применится к каждому <p> на странице, включая те, что появятся в других местах документа.

Селектор по классу

Селектор по классу пишут с точкой перед именем: .note. Он выбирает все элементы, у которых в HTML-атрибуте class указано это имя - неважно, какой у них тег. Один и тот же класс можно повесить на сколько угодно разных элементов, а у одного элемента может быть сразу несколько классов через пробел: class="note important".

<p class="note">Текст</p> и правило .note { color: dodgerblue; } - сработает для любого тега с этим классом.

<p class=".note">Текст</p> - точку по ошибке поставили прямо в HTML-атрибуте; браузер ищет класс с именем «.note» (вместе с точкой), а не «note», поэтому селектор .note такой элемент не найдёт. Точка нужна только в CSS-селекторе, в самом атрибуте class пишут просто имя без точки.

Селектор по id

Селектор по id пишут с решёткой перед именем: #intro. По правилам HTML значение id должно быть уникальным на странице - то есть у каждого элемента свой, не повторяющийся id, в отличие от класса, который специально придуман для переиспользования на многих элементах.

<p id="intro">Текст</p> и правило #intro { color: tomato; } - обращение к одному конкретному элементу.

<p id="intro">Первый</p> <p id="intro">Второй</p> - id повторили на двух элементах. CSS-правило по #intro всё равно покрасит оба (браузер не откажется применять стиль), но с точки зрения HTML это невалидная разметка, и другие инструменты - например, JavaScript-метод getElementById - будут видеть только первый такой элемент.

Из истории Все три способа выбрать элемент - по тегу, по классу и по id - не появились постепенно, а были в CSS с самого первого дня: уже в спецификации CSS1 от декабря 1996 года есть ровно те же примеры, что и сейчас - H1 { color: blue } для тега, .pastoral { color: green } для класса и #z98y { letter-spacing: 0.3em } для id. За тридцать лет сам синтаксис этих трёх селекторов не изменился ни на символ. Источник: w3.org - спецификация CSS1, 1996.

Частые ошибки новичков

ОшибкаЧто происходитКак исправить
Ждать, что селектор по тегу затронет только один элемент Селектор по тегу красит вообще все элементы этого тега на странице Использовать класс или id, если нужен только один или несколько конкретных элементов
Ставить точку внутри самого атрибута class в HTML, например class=".note" Браузер ищет класс с именем ".note" вместе с точкой, а не "note" - селектор .note такой элемент не найдёт Точку писать только в CSS-селекторе; в HTML-атрибуте class - только имя, без точки
Дублировать один и тот же id на нескольких элементах страницы CSS-правило по этому id всё равно применится ко всем совпадающим элементам, но это невалидный HTML, а JavaScript и другие инструменты увидят только первый из них Давать каждому id уникальное значение; для повторяющегося оформления использовать class
Путать # в CSS-селекторе с # в адресе ссылки вроде #faq Это разные вещи: в CSS # выбирает элемент по id для стилей, а в ссылке # прокручивает страницу к элементу с таким же id - хотя оба и правда завязаны на один и тот же атрибут id Помнить, что это два разных применения одного и того же id, а не одна и та же функция

Шпаргалка

ТерминЗначение
СелекторЧасть правила перед { } - определяет, к каким элементам применится стиль
Селектор по тегуПросто имя тега, например p - выбирает все элементы с этим тегом
Селектор по классуТочка перед именем класса, например .note - выбирает все элементы с этим классом
Селектор по idРешётка перед именем id, например #intro - выбирает один элемент с этим id
Приоритетid сильнее класса, класс сильнее тега - подробно про специфичность будет отдельный урок

Коротко: отвечаем на вопросы

Может ли элемент иметь сразу несколько классов?

Да, классы просто перечисляют через пробел в одном атрибуте: class="note important". Элемент получит стили от обоих классов сразу.

Обязательно ли на странице должен быть хотя бы один id?

Нет, id нужен не всегда - только когда действительно нужно обратиться к одному конкретному элементу, например для стилей, скрипта или ссылки-якоря вида #faq.

Что сильнее при конфликте правил - класс или id?

Id сильнее класса, а класс сильнее обычного селектора по тегу. Это часть более широкой темы под названием специфичность - ей будет посвящён отдельный урок в этой же группе.

Можно ли использовать одинаковое имя для класса и для id на одной странице?

Технически да - class="note" и id="note" не конфликтуют друг с другом, потому что это разные атрибуты. Но лучше так не делать: путаница в коде почти гарантирована, когда потом придётся вспоминать, какой из селекторов - .note или #note - использован в конкретном правиле.

Категория
css
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×