Теперь CSS функция attr() поддерживает типы
attr() позволяет извлечь значение атрибута выбранного HTML элемента и использовать его в качестве значения CSS свойства.attr() обычно используется вместе со свойством content в псевдоэлементах для отображения значения атрибута на странице.
Функция attr() давно существует и широко используется в CSS. Однако она принимала только один аргумент: имя атрибута, значение которого требуется использовать.
Кроме того, значение, возвращаемое функцией attr(), всегда рассматривалось как строка, поэтому её можно было использовать только в свойствах, принимающих строковые значения. Например, свойство content, о котором говорилось ранее.
Новый синтаксис с типами
В последней редакции CSS спецификации функция attr() была обновлена и стала поддерживать типы. Это означает, что теперь можно указать тип значения, к которому должен относиться атрибут.
В результате мы можем использовать функцию attr() с большим количеством свойств. И это делает её гораздо более мощной, чем раньше. Открывается целый мир новых возможностей для CSS функции attr().
Новый синтаксис функции attr() выглядит следующим образом.
attr(<attribute-name> type(<specific-type>))Как использовать функцию attr() с типами
Например, если необходимо задать ширину элемента на основе значения атрибута data-width, это можно сделать следующим образом.
Сначала укажите атрибут data на элементе, который нужно настроить.
<div data-width="100px"></div>Затем в CSS с помощью функции attr() и функции type() можно указать, что значение атрибута data-width должно рассматриваться как тип <length>.
div {
width: attr(data-width type(<length>));
}Как видите, тип <length> представляет значение длины, и прекрасно сочетается со свойством width. В результате ширина элемента div будет равна 100px.
Практический пример
Допустим, необходимо создать UI, похожий на диаграмму, где требуется настроить ширину элементов div на основе значения атрибута data-width и цвет фона на основе значения атрибута data-color.
И вот как это можно реализовать.
<div class="box" data-width="200px" data-color="hotpink"></div>
<div class="box" data-width="300px" data-color="slateblue"></div>
<div class="box" data-width="400px" data-color="green"></div>
<div class="box" data-width="500px" data-color="slategray"></div>
<div class="box" data-width="600px" data-color="mediumvioletred"></div>.box {
width: attr(data-width type(<length>));
background: attr(data-color type(<color>));
height: 80px;
}
.box::before {
content: attr(data-color);
height: 100%;
display: flex;
align-items: center;
justify-content: center;
font-family: sans-serif;
font-weight: bold;
color: #fff;
}Посмотреть на него в действии можно в данном CodePen.
Обратите внимание, что в этом примере используется только один общий класс box для настройки ширины элементов div на основе значения атрибута data-width.
Цвет фона также настраивается на основе значения атрибута data-color для всех <div>. С помощью функции type(<color>) указывается, что значение атрибута data-color должно рассматриваться как тип <color>.
В завершение
Более подробно обо всех типах, которые можно использовать с помощью attr(), можно узнать из этой статьи Una и других продвинутых примеров использования её новых возможностей. Например, этот пример со шкалой рейтинга звёзд очень крут!
Я считаю, что это отлично, поскольку можно будет создавать UI с минимально возможным кодом. Можно будет настраивать каждый аспект UI, не прикасаясь к CSS. По сути, это что-то вроде Напиши один раз, используй везде
, что делает CSS многоразовым и удобным в обслуживании.
Функция attr() с типами пока поддерживается только в последних версиях браузеров на базе Chromium (Chrome 133 и новее, если быть точным). Но я считаю, что очень скоро она будет поддерживаться и в других браузерах.