Селекторы по атрибутам

Предисловие

«Селекторы по атрибутам» это довольно интересная тема, которая открывает кучу возможностей во время верстки макета. Некоторые из таких селекторов я использую на практике. Это далеко не все интересные селекторы в css, и про некоторые из них я написал статьи ранее.

видео

Селекторы в CSS. Селекторы по атрибутам

Селектор по наличию атрибута [attr]

Это самый простой селектор. Для примера я возьму блок с дата-атрибутом надуманного плагина анимации появления элементов. Добавлю два элемента div в html разметку добавлю им стили для видимости:

html

<div class="block">первый</div>
<div class="block">второй</div>

CSS

.block {
  width: 100px;
  height: 100px;
  margin: 5px;
  background-color: tomato;
  display: flex;
  justify-content: center;
  align-items: center;
  font-family: Arial, Helvetica, sans-serif;
}
Два квадратных блока цвета "томат", в них написано "первый" и "второй" черным цветом
Внешний вид блоков по-умолчанию

Первому блоку добавлю атрибут data-animation-type

html

<div class="block" data-animation-type>первый</div>
<div class="block">второй</div>

Этому блоку будет добавлена анимация. Для того, что-бы получить именно этот блок, нужно прописать следующий селектор:

css

[data-animation-type] {}

Для видимости того, что работает этот селектор, я поменяю цвет текста на белый:

css

[data-animation-type] {
  color: white;
}
Два квадратных блока цвета "томат", на первом, с атрибутом, цвет текста "первый" белый, на втором цвет текста "второй" черный
У первого блока, с атрибутом, цвет текста белый

Но для анимации, конечно, будут другие стили, например время анимации

Селектор по наличию атрибута с точным значением [attr=value]

Допустим, у нас есть при блока с анимацией, и каждому из них нужно добавить разную анимацию: первый что-бы слева появился, второй сверху, ну а третий справа.

Три квадратных блока цвета томат с надписями: первый, второй, третий; у каждого стрелка с направлением анимации
Три блока по умолчанию

Для каждого элемента нужно добавить определённую анимацию. Можно добавить новый класс, а можно нашему атрибуту задать значение и по нему задать необходимое название анимации.

html

<div class="block" data-animation-type="left-toright">Первый</div>
<div class="block" data-animation-type="top-to-bottom">Второй</div>
<div class="block" data-animation-type>Третий</div>

Что-бы визуально было видно работу этого селектора, я второму блоку сделаю фоновый цвет немного темнее.

css

[data-animation-type="top-to-bottom"] {
  background-color: brown;
}
Три квадратных блока цвета томат с надписями: первый, второй, третий. Второй блок более темного фона
Второй блок стал более тёмного цвета

Селектор с одним из значений атрибута [attr~=value]

Следующий пример хорошим назвать трудно, но не получилось придумать что-то хорошее, так как в основном у классов может быть несколько значений, а у других атрибутов по одному. Но скажем так: атрибут data-animation-type можно немного сократить и положить в него несколько значений, первые значения оставлю как есть, но добавлю в него второе. Пусть по второму значению будет добавляться задержка анимации.

html

<div class="block" data-animation-type="left-toright 2">Первый</div>
<div class="block" data-animation-type="top-to-bottom 1">Второй</div>
<div class="block" data-animation-type="3">Третий</div>

Добавив второе значение, один из селекторов у нас перестал работать, а именно по точному значению атрибута:

Слева три блока томатного цвета с белыми надписями "один", "два", "три". Справа девтулз в котором видно css стили применившиеся ко второму блоку
Тут видно что селектор не работает

Но это можно поправить изменив селектор следующим образом:

css

[data-animation-type~="top-to-bottom"] {
  background-color: brown;
}

И наш второй блок вновь потемнел:

Три квадратных блока цвета томат с надписями: первый, второй, третий. Второй блок более темного фона
Второй блок стал более тёмного цвета

Второй блок вновь потемнел

[attr|=value] Обозначает элемент с именем атрибута attr.

Его значение при этом может быть или в точности равно value или может начинаться с value со сразу же следующим «-» (U+002D). Это может быть использовано когда язык описывается с подходом.

Где можно применить такой селектор? Например есть у нас лендинг с кучей разделов.

html

<section class="section block">Первый</section>
<section class="section-two block">Второй</section>
<section class="section_three block">Третий</section>
<section class="block section-four">Четвёртый</section>

У каждого раздела есть свой фоновый цвет, но есть и одинаковые правила.

css

section {
  width: 100px;
  height: 100px;
  margin: 5px;
  display: flex;
  justify-content: center;
  align-items: center;
  font-family: Arial, Helvetica, sans-serif;
}

.section {
  background-color: white;
}

.section-two {
  background-color: bisque;
}

.section_three {
  background-color: aquamarine;
}

.four-section {
  background-color: cadetblue;
}
Четыре квадратных блока с разным фоном
Четыре блока

Можно не плодить классы для каждого раздела или не писать одинаковые свойства для каждого раздела, так же не нужен и глобальный селектор, а просто выбрать все классы, которые начинаются, к примеру, на section- или равны section и добавить нужные правила:

html

<section class="section">Первый</section>
<section class="section-two">Второй</section>
<section class="section_three">Третий</section>
<section class="four-section">Четвёртый</section>

css

.section {
  background-color: white;
}

.section-two {
  background-color: bisque;
}

.section_three {
  background-color: aquamarine;
}

.four-section {
  background-color: cadetblue;
}

[class|="section"] {
  width: 100px;
  height: 100px;
  margin: 5px;
  display: flex;
  justify-content: center;
  align-items: center;
  font-family: Arial, Helvetica, sans-serif;
}

Но тут не стоит забывать, какие именно классы будут работать:

  • section_three не будет работать, так как после section вместо дефиса(-) нижнее подчеркивание(_)
  • four-section так же не будет работать: так как начинается класс совсем по-другому
Четыре блока с разным фоном, первые два квадратные
Видно что у третьего и четвёртого блока не работают селекторы

А остальные селекторы работают отлично!

[attr^=value] Обозначает элемент с именем атрибута attr значение которого начинается с value

Возьму два класса, которые будут стилизовать кнопку. У них будет много общих стилей, но что-то будет различаться:

css

.button-button {
  background-color: aliceblue;
}

.button-submit {
  background-color:burlywood;
}

html

<button class="button-button">button</button>
<button class="button-submit">submit</button>
Две стандартные кнопки с разным фоновым цветом
Вид двух кнопок с разным фоновым цветом

Для того, что бы прописать одинаковые стили нам потребуется вот такой селектор с правилами:

css

[class^="button"] {
  font-weight: 700;
  font-family: Arial, Helvetica, sans-serif;
  font-size: 20px;
  text-transform: uppercase;
  margin: 5px;
}
две кнопки с изменённым шрифтом и отступами
Двум кнопкам применились стили

[attr$=value] Обозначает элемент с именем атрибута attr чьё значение заканчивается на value.

Такой селектор использую на лендингах. Вот к примеру есть несколько заголовков в разных разделах. У всех есть много общих стилей, но и есть те, которые различаются. Ну, к примеру цвет текста.

html

<h2 class="block-1-heading">1-heading</h2>
<h2 class="block-2-heading">2-heading</h2>
<h2 class="block-3-heading">3-heading</h2>

css

.block-1-heading {
  color: tomato;
}

.block-2-heading {
  color: brown;
}

.block-3-heading {
  color: chocolate;
}
Три стандартных заголовка одного уровня с разным цветом текста
Три заголовка с разным цветом

Теперь, воспользовавшись, этим селектором можно прописать одинаковые стили для всех заголовков:

css

[class$="heading"] {
  margin: 0 0 1em;
  font-family: Arial, Helvetica, sans-serif;
  text-transform: uppercase;
}
Три заголовка с разным цветом текста и изменённым шрифтом и отступами
Ко всем заголовкам применились стили

[attr*=value] Обозначает элемент с именем атрибута attr чьё значение содержит по крайней мере одно вхождение строки value как подстроки.

Ну к этому тоже можно было что-то лучшее найти из практики, но приходится опять придумывать... Возьму три таких заголовка:

html

<h2 class="block-green-heading">green-heading</h2>
<h2 class="block-red-heading">red-heading</h2>
<h2 class="block-blue-heading">blue-heading</h2>

Возьму уже готовые стили:

css

[class$="heading"] {
  margin: 0 0 1em;
  font-family: Arial, Helvetica, sans-serif;
  text-transform: uppercase;
}

Теперь можно поменять цвета заголовкам:

css

[class*="green"] {
  color: green;
}

[class*="red"] {
  color: red;
}

[class*="blue"] {
  color: blue;
}
три заголовка с разным цветом текста
Все заголовки поменяли цвет текста

Специфичнось

По специфичности все селекторы по атрибутам равнозначны, то есть работать будет тот селектор, который ниже в вашем файле стилей)), а относительно других селекторов имеют такую же силу как и селекторы по классу.

Итог

Вообще css это огромное количество разновидностей селекторов, но и селекторы по атрибутам уже могут облегчить и разнообразить работу над проектом, сократить количество кода, да и просто сделать работу интереснее.

Объявление

Нравится фронтенд — попробуйте самые подробные интерактивные тренажёры от HTML Academy бесплатно. Подойдут и действующим разработчикам, чтобы подтянуть навыки вёрстки.