Будьте готовы к усилению CSS! Правило @property
, входящее в состав API-интерфейсов CSS Houdini, теперь полностью поддерживается во всех современных браузерах. Эта революционная функция открывает новые уровни контроля и гибкости для пользовательских свойств CSS (также известных как переменные CSS), делая ваши таблицы стилей более умными и динамичными.
Преимущества @property
- Семантическое значение: используйте
@property
, чтобы определить тип (синтаксис) ваших пользовательских свойств. Это сообщает браузеру, какие данные содержит ваше пользовательское свойство (например, цвета, длины или числа), предотвращает неожиданные результаты и поддерживает новые возможности, такие как анимация градиентов. - Резервные значения: больше никаких исчезающих стилей! Используйте
@property
, чтобы установить начальное значение для пользовательского свойства. Если позже будет присвоено недопустимое значение, браузер корректно использует заданный вами резервный вариант. - Улучшенная обработка ошибок. Повышенная безопасность типов и возможность установки резервных вариантов открывают новые возможности для тестирования и проверки непосредственно в CSS.
Создание расширенных пользовательских свойств
Чтобы создать «стандартное» пользовательское свойство, задайте имя свойства, добавленное знаком --
и присвойте этому свойству значение. Значение этих пользовательских свойств анализируется браузером как строка.
В следующем примере показано, как инициализируется настраиваемое свойство по умолчанию (строковое).
:root { --myColor: hotpink; }
Чтобы воспользоваться преимуществами этих «расширенных пользовательских свойств», включая семантику за пределами строки, зарегистрируйте свое пользовательское свойство CSS с помощью @property
.
В этом примере то же самое пользовательское свойство инициализируется с помощью @property
.
@property --myColor { syntax: '<color>'; inherits: false; initial-value: hotpink; }
Пользовательское свойство, инициализированное с помощью @property
предоставляет гораздо больше деталей, чем просто имя и значение. Он включает тип синтаксиса и устанавливает для наследования значение true или false.
Преимущество этого подхода заключается в том, что при использовании стандартного свойства вы ожидаете, что это свойство будет содержать цвет в качестве значения, и собираетесь использовать этот цвет в другом месте таблицы стилей. Если бы кто-то обновил это свойство, чтобы оно имело числовое значение, любое использование этого свойства в другом месте не удалось бы. При использовании @property
определяется резервный цвет, а также syntax
, который объявляет, что это свойство должно содержать значение цвета. Если используется значение, не являющееся цветом, вместо него будет использоваться резервное значение.
Демо: Мерцающий градиентный фон
Одно из изящных применений @property
— плавная анимация свойств, переход которых ранее был невозможен, например градиентов, которые браузер воспринимает как изображения. Однако если вы придадите переменным синтаксическое значение через @property
, их можно будет использовать в инструкции градиента. Теперь вы описываете анимацию между двумя объявленными значениями внутри градиента, включая анимацию. Возьмем следующий пример: карточка с тонкой фоновой анимацией, состоящей из двух радиальных градиентов, которые меняют цвет на разных временных шкалах:
@property
для стилизации анимированных цветов в фоновом градиенте.Этого можно добиться, настроив значения пользовательских свойств в виде цветов:
@property --card-bg { syntax: "<color>"; inherits: false; initial-value: lavender; } @property --shine-1 { syntax: "<color>"; inherits: false; initial-value: wheat; } @property --shine-2 { syntax: "<color>"; inherits: false; initial-value: lightpink; }
Затем вы получаете к ним доступ, чтобы создать исходный градиентный фон:
.card { background: radial-gradient( 300px circle at 55% 60% in oklab, var(--shine-2), transparent 100% 100%), radial-gradient(farthest-side circle at 75% 30% in oklab, var(--shine-1) 0%, var(--card-bg) 100%); }
Кроме того, вы затем обновляете значения в ключевых кадрах:
@keyframes animate-color-1 { to { --shine-1: orange; } } @keyframes animate-color-2 { to { --shine-2: hotpink; } }
И анимируем каждый:
animation: animate-color-1 8s infinite linear alternate, animate-color-2 1s infinite linear alternate;
Заключение
Зарегистрированные пользовательские свойства CSS — это очень мощная функция, которая расширяет язык CSS, предоставляя значение и контекст переменным CSS. Теперь, когда @property
стал базовым, эта суперсила CSS становится все сильнее.