Использование CSS-функции attr() для более умной стилизации

CSS-функция attr() извлекает значения непосредственно из HTML-атрибутов в ваши стили — но теперь она больше не ограничивается только отображением текстового содержимого. Начиная с Chrome 133, attr() может теперь парсить типизированные значения и работать с любым CSS-свойством, открывая мощные новые паттерны стилизации с минимальным использованием JavaScript.
Ключевые выводы
- Современная функция attr() работает с любым CSS-свойством, а не только с content
- Парсинг типов позволяет преобразовывать значения атрибутов в правильные типы данных CSS
- Chrome 133+ поддерживает расширенный синтаксис attr() с резервными значениями
- Определение поддержки функций обеспечивает корректную деградацию в неподдерживаемых браузерах
Традиционное использование attr(): ограниченное, но полезное
На протяжении многих лет CSS-функция attr() была удобным инструментом для извлечения значений HTML-атрибутов, но с одним серьезным ограничением: она работала только со свойством content
и всегда возвращала строки.
/* Классический attr() - отображение href как текста */
a:empty::before {
content: attr(href);
}
Это традиционное использование остается ценным для отображения значений атрибутов в виде текста — например, всплывающие подсказки, показывающие URL-адреса или атрибуты данных в псевдоэлементах. Но на этом её полезность заканчивалась.
Революция современной функции attr()
Обновленная CSS-функция attr() трансформирует подход к работе с динамической стилизацией. Вместо ограничения свойством content
, теперь вы можете использовать attr() с любым CSS-свойством и парсить значения в конкретные типы данных.
Базовый синтаксис
attr(<attr-name> <attr-type>?, <fallback-value>?)
Функция принимает три параметра:
- attr-name: HTML-атрибут для чтения
- attr-type: способ парсинга значения (необязательный)
- fallback-value: значение по умолчанию, если атрибут отсутствует (необязательный)
Парсинг типов: за пределами строк
Истинная мощь современной CSS-функции attr() заключается в парсинге типов. Теперь вы можете преобразовывать значения атрибутов в правильные типы данных CSS:
Значения цветов
<div class="card" data-color="#3b82f6">Синяя карточка</div>
.card {
background-color: attr(data-color type(<color>), gray);
}
Объявление type(<color>)
сообщает браузеру, что нужно парсить атрибут как значение цвета. Если атрибут отсутствует или недействителен, используется резервное значение gray.
Числовые значения с единицами измерения
<p data-size="18">Настраиваемый текст</p>
p {
font-size: attr(data-size px, 16px);
}
Здесь CSS-функция attr() добавляет px
к числовому значению. Вы также можете использовать другие единицы измерения, такие как rem
, em
или %
.
Пользовательские идентификаторы
Одно из самых мощных применений использует <custom-ident>
для динамических значений CSS-свойств:
<div class="card" id="card-1">Первая карточка</div>
<div class="card" id="card-2">Вторая карточка</div>
.card {
view-transition-name: attr(id type(<custom-ident>), none);
}
Это автоматически назначает уникальные значения view-transition-name
на основе ID элементов — идеально для переходов представлений без повторяющегося CSS.
Discover how at OpenReplay.com.
Поддерживаемые типы данных
Современная CSS-функция attr() поддерживает множество типов данных:
<string>
(по умолчанию)<color>
<number>
<length>
<percentage>
<angle>
<time>
<custom-ident>
<integer>
<transform-function>
Примечание: По соображениям безопасности значения <url>
не поддерживаются, за исключением строк в свойстве content
.
Реальные применения
Динамическая тематизация
<section data-theme-color="#1e293b" data-theme-spacing="2">
<h2>Тематический раздел</h2>
</section>
section {
background-color: attr(data-theme-color type(<color>), white);
padding: attr(data-theme-spacing rem, 1rem);
}
Адаптивные сеточные макеты
<div class="grid" data-columns="3">
<!-- Элементы сетки -->
</div>
.grid {
display: grid;
grid-template-columns: repeat(attr(data-columns type(<integer>), 1), 1fr);
}
Поддержка браузерами и определение функций
Возможности современной CSS-функции attr() в настоящее время являются экспериментальными, с полной поддержкой только в Chrome 133+ и других браузерах на основе Chromium. Всегда используйте определение поддержки функций:
@supports (width: attr(x type(*))) {
/* Современная attr() поддерживается */
.element {
color: attr(data-color type(<color>), black);
}
}
@supports not (width: attr(x type(*))) {
/* Резервные стили */
.element {
color: black;
}
}
Для определения в JavaScript:
if (CSS.supports("width", "attr(x type(*))")) {
// Современная attr() доступна
}
Лучшие практики
- Всегда предоставляйте резервные значения: второй параметр обеспечивает работу ваших стилей даже при отсутствии атрибутов
- Используйте семантические имена атрибутов:
data-font-size
понятнее, чемdata-fs
- Учитывайте производительность: несмотря на мощность, чрезмерное использование attr() может повлиять на производительность рендеринга
- Валидируйте значения атрибутов: убедитесь, что ваши HTML-атрибуты содержат действительные CSS-значения для ожидаемого типа
Распространенные подводные камни
Остерегайтесь этих проблем при использовании CSS-функции attr():
- Несоответствие единиц измерения:
font-size: attr(data-size)
не работает без единиц измерения - Неверный парсинг типов: убедитесь, что значения атрибутов соответствуют объявленному типу
- Особенности наследования: значения attr() вычисляются на элементе, где они используются, а не там, где они определены
Заключение
Современная CSS-функция attr() устраняет разрыв между HTML и CSS, обеспечивая действительно динамическую стилизацию без JavaScript. Хотя поддержка браузерами все еще развивается, её потенциал для компонентных систем дизайна и макетов, управляемых данными, делает её достойной внедрения с соответствующими резервными решениями. По мере того как больше браузеров будут реализовывать эти функции, attr() станет незаменимым инструментом для написания более чистых и поддерживаемых таблиц стилей.
Часто задаваемые вопросы
Да, вы можете использовать attr() для установки значений пользовательских свойств. Например, --theme-color: attr(data-color type(color), blue) работает в поддерживаемых браузерах. Это позволяет создавать мощные паттерны каскадирования и наследования.
Когда парсинг типа не удается, браузер обрабатывает это так, как если бы атрибут не существовал, и использует резервное значение. Если резервное значение не предоставлено, объявление свойства становится недействительным и игнорируется.
Каждая функция attr() требует от браузера чтения HTML-атрибутов и их парсинга во время вычисления стилей. Хотя современные браузеры оптимизируют этот процесс, чрезмерное использование на часто обновляемых элементах может повлиять на производительность рендеринга.
Используйте определение поддержки функций с @supports или CSS.supports() для предоставления резервных стилей. Рассмотрите возможность использования пользовательских CSS-свойств, устанавливаемых через JavaScript, как альтернативы для неподдерживаемых браузеров, сохраняя при этом аналогичную функциональность.
Truly understand users experience
See every user interaction, feel every frustration and track all hesitations with OpenReplay — the open-source digital experience platform. It can be self-hosted in minutes, giving you complete control over your customer data. . Check our GitHub repo and join the thousands of developers in our community..