HTML, CSS: важен ли порядок названий классов CSS в атрибуте «class» HTML-элементов
У HTML-элементов на HTML-странице может быть необязательный глобальный атрибут class
. Например:
<div class="имя-класса1 имя-класса2 имя-класса3">
Какой-то текст.
</div>
Здесь у HTML-элемента div
есть интересующий нас атрибут class
.
С точки зрения стандарта языка HTML
По действующему стандарту языка HTML атрибут class
HTML-элементов должен содержать значение, состоящее из набора (множества) названий (токенов) классов CSS, разделенных пробельными символами (символ пробела, символ горизонтальной табуляции, символы новой строки). В примере выше атрибут class
содержит значение-строку имя-класса1 имя-класса2 имя-класса3
, представляющее собой набор из трех названий классов CSS, разделенных символом пробела.
Понятие, о котором тут идет речь — набор из слов (токенов), разделенных пробельными символами (по-английски «set of space-separated tokens»). Само это понятие определено в стандарте языка HTML отдельно от определения атрибута class
.
В определении понятия «set of space-separated tokens» сказано, что это строка, содержащая ноль или более слов (токенов), разделенных пробельными символами. Из этого я сделал вывод, что атрибут class
по действующему стандарту HTML может не содержать ничего (содержать пустую строку). Также не будет нарушением действующего стандарта HTML, если этот атрибут будет содержать только пробельные символы (символ пробела, символ горизонтальной табуляции, символы новой строки).
Действующий стандарт HTML вообще практически не накладывает на набор названий классов CSS в атрибуте class
HTML-элементов каких-либо ограничений. Не накладывается ограничение на дублирование названий классов CSS внутри атрибута class
. Не накладывается каких-либо ограничений, касающихся порядка перечисления названий классов CSS внутри атрибута class
.
То есть с точки зрения действующего стандарта HTML (в отличие от стандарта CSS, о чем речь пойдет далее) название класса, перечисленное в наборе названий классов внутри атрибута class
HTML-элемента раньше (левее, выше), ничем не отличается от названия класса, перечисленного в том же наборе названий классов внутри атрибута class
HTML-элемента позже (правее, ниже).
В примере выше с точки зрения действующего стандарта HTML названия классов имя-класса1
, имя-класса2
и имя-класса3
в наборе названий имя-класса1 имя-класса2 имя-класса3
полностью равноправны, несмотря на то, что, к примеру, название имя-класса1
перечислено раньше (левее), чем имя-класса2
или имя-класса3
. То же самое касается названия имя-класса2
по сравнению с названием имя-класса3
.
Во что это выливается на практике?
Рассмотрим такой код на языке HTML (многоточием заменен неинтересный для предмета этой статьи код):
...
<head>
...
<style>
.имя-класса1 { color: green; }
.имя-класса2 { color: red; }
.имя-класса3 { border: 2px solid blue; }
</style>
</head>
<body>
<p class="имя-класса1 имя-класса2 имя-класса3">
Какой-то текст1.
</p>
<p class="имя-класса2 имя-класса1 имя-класса3">
Какой-то текст2.
</p>
</body>
...
В теле этой HTML-страницы есть два параграфа (HTML-элемент p
). Каждый из этих параграфов содержит атрибут class
с набором из одних и тех же трех названий классов CSS, только перечисленных в разном порядке.
Описание стилей в классе имя-класса3
не конфликтует с другими классами. А вот описания стилей в классах имя-класса1
и имя-класса2
конфликтуют друг с другом (приписывают разные значения одному и тому же свойству HTML-элемента).
В итоге при любой перестановке названий классов CSS в атрибуте class
HTML-элементов p
браузер отобразит параграфы одинаково, в данном случае — с синей границей и текстом красного цвета. Это подтверждает наши выводы, сделанные выше из определений действующего стандарта HTML.
Почему же в данном случае в конфликте описаний стилей в классах имя-класса1
и имя-класса2
«победил» класс имя-класса2
(текст в параграфах отразился красным цветом)? Потому что при определении классов CSS внутри HTML-элемента style
класс имя-класса2
описан позже (ниже), чем класс имя-класса1
. Внутри HTML-элемента style
действуют правила (стандарт) языка CSS. Это действие того самого «каскада», давшего первую букву аббревиатуре CSS (Cascading Style Sheets). Если менять местами определения классов CSS внутри HTML-элемента style
(или внутри файла с кодом на языке CSS, если определения стилей вынесены в отдельный файл или файлы), то отображение HTML-страницы в браузере будет изменяться.
Влияние правил языка CSS
Всегда ли порядок названий классов в атрибуте «class» HTML-элемента не влияет на отображение HTML-страницы?
С учетом вышеизложенного хочется ответить на этот вопрос утвердительно, но утвердительный ответ тут будет неправильным.
Дело в том, что в языке CSS можно определить селектор (отборщик) HTML-элементов так, что отбор HTML-элементов селектором будет зависеть от порядка перечисления названий классов CSS в атрибуте class
HTML-элементов. Это сделает порядок перечисления названий классов в атрибуте class
HTML-элементов значимым для отображения HTML-страницы в браузере.
Это не будет противоречить вышеописанным выводам, сделанным из определений в стандарте языка HTML, потому что в данном случае это будет действие стандарта CSS.
В качестве примера рассмотрим такой код на языке HTML:
...
<head>
...
<style>
[class^="имя-класса1 имя-класса2"] { color: green; }
[class^="имя-класса2 имя-класса1"] { color: red; }
.имя-класса3 { border: 2px solid blue; }
</style>
</head>
<body>
<p class="имя-класса1 имя-класса2 имя-класса3">
Какой-то текст1.
</p>
<p class="имя-класса2 имя-класса1 имя-класса3">
Какой-то текст2.
</p>
</body>
...
Это тот же код HTML, что и в первом примере, только здесь изменены два первых селектора внутри HTML-элемента style
. Даже описания стилей остались нетронутыми. Однако, теперь браузер отображает в первом параграфе текст зеленым цветом, а во втором параграфе — красным цветом.
В этом примере порядок названий классов внутри атрибута class
HTML-элементов стал значимым для отображения HTML-страницы в браузере, но это действие не правил языка HTML, а правил языка CSS.
Заключение
Итак, окончательный ответ на вопрос, заданный в заголовке этой статьи, должен звучать следующим образом.
Порядок названий классов CSS в атрибуте class
HTML-элементов на HTML-странице может влиять (может быть важным) на отображение этой HTML-страницы в браузере. Но следует понимать, что это влияние определяется не правилами (стандартом) языка HTML, а тем, как описаны стили для данной HTML-страницы с помощью языка CSS (они могут быть описаны в разных местах — внутри HTML-элемента style
, внутри внешнего файла (нескольких файлов) и так далее).