Переходы и защита данных в CSS
Пользовательские свойства CSS, также известные как переменные CSS, позволяют определять собственные свойства в CSS и использовать их значения во всем CSS. Хотя они невероятно полезны сегодня, у них есть недостатки, которые могут затруднить работу с ними: они могут принимать любое значение, поэтому их можно случайно переопределить чем-то неожиданным, они всегда наследуют свои значения от родителя, и вы не можете их перенести. С помощью CSS Properties and Values API Level 1 от Houdini, который теперь доступен в Chrome 78, эти недостатки устранены, что делает пользовательские свойства CSS невероятно мощными!
Что такое Houdini?
Прежде чем говорить о новом API, давайте кратко поговорим о Гудини. Рабочая группа CSS-TAG Houdini Task Force, более известная как CSS Houdini или просто Houdini, была создана, чтобы "разрабатывать функции, которые объясняют "магию" стилей и макетов в интернете". Набор спецификаций Houdini предназначен для того, чтобы открыть возможности механизма рендеринга браузера, позволяя как глубже понять наши стили, так и расширить наш механизм рендеринга. Благодаря этому вы можете использовать типизированные значения CSS в JavaScript, а также полифиллинг и новые свойства CSS без ущерба для производительности. Houdini может дать мощный толчок творчеству в интернете.
CSS Properties and Values API Level 1
CSS Properties and Values API Level 1 (Houdini Props and Vals) позволяет нам структурировать наши пользовательские свойства. Вот как обстоят дела с использованием дополнительных параметров:
.thing {
--my-color: green;
}
Поскольку у пользовательских свойств нет типов, они могут быть переопределены неожиданным образом. Например, рассмотрим, что произойдет, если вы определите --my-color с помощью URL.
.thing {
--my-color: url('not-a-color');
color: var(--my-color);
}
Поскольку тип --my-color не указан, браузер не знает, что URL не является допустимым значением цвета. В этом случае используются значения по умолчанию (черный для color, прозрачный для background). С помощью Houdini Props and Vals можно зарегистрировать дополнительные свойства, чтобы браузер знал, какими они должны быть.
Теперь дополнительный параметр --my-color зарегистрирован как цвет. Это сообщает браузеру, какие значения разрешены и как он может вводить и обрабатывать это свойство.
Как устроено зарегистрированное свойство
Регистрация ресурса выглядит следующим образом:
window.CSS.registerProperty({
name: '--my-color',
syntax: '<color>',
inherits: false,
initialValue: 'black',
});
Поддерживаются следующие параметры.
name: string
Название дополнительного параметра.
syntax: string
Как анализировать дополнительный параметр. Полный список возможных значений приведен в спецификации CSS Values and Units. Значение по умолчанию – *.
inherits: boolean
Наследует ли он значение родительского элемента. Значение по умолчанию – true.
initialValue: string
Начальное значение дополнительного параметра.
Изучаю данные о компании "syntax"… Существует ряд допустимых вариантов, от чисел до цветов и типов <custom-ident>. Эти синтаксисы также можно изменить, используя следующие значения:
- Добавление
+означает, что он принимает список значений этого синтаксиса, разделенных пробелами. Например,<length>+– это список длин, разделенных пробелами. - Добавление
#означает, что параметр принимает список значений, разделенных запятыми. Например,<color>#– это список цветов, разделенных запятыми. - Символ
|между синтаксическими конструкциями или идентификаторами означает, что можно использовать любой из указанных вариантов. Например,<color># | <url> | magicпозволяет указать список цветов через запятую, URL или словоmagic.
Gotchas
Есть две ловушки со свойствами и значениями Гудини. Во-первых, после определения зарегистрированного свойства его нельзя обновить, а попытка повторной регистрации свойства приведет к ошибке, указывающей на то, что оно уже определено.
Во-вторых, в отличие от стандартных свойств, зарегистрированные свойства не проверяются при синтаксическом анализе. Они проверяются при вычислении. Это означает, что недопустимые значения не будут отображаться как недопустимые при проверке свойств элемента, а включение недопустимого свойства после допустимого не приведет к возврату к допустимому. Однако недопустимое свойство вернется к значению по умолчанию зарегистрированного свойства.
Анимация пользовательских свойств
Зарегистрированное пользовательское свойство предоставляет забавный бонус, помимо проверки типов: возможность его анимации! Простой пример анимации выглядит так:
<script>
CSS.registerProperty({
name: '--stop-color',
syntax: '<color>',
inherits: false,
initialValue: 'blue',
});
</script>
<style>
button {
--stop-color: red;
transition: --stop-color 1s;
}
button:hover {
--stop-color: green;
}
</style>
При наведении указателя мыши на кнопку она будет менять цвет с красного на зеленый. Без регистрации свойства оно будет переходить от одного цвета к другому, потому что без регистрации браузер не знает, чего ожидать между одним значением и следующим, и поэтому не может гарантировать возможность их перехода. Но это ещё не всё. Вы можете анимировать градиенты CSS. Следующий CSS можно написать с тем же зарегистрированным свойством:
button {
--stop-color: red;
background: linear-gradient(var(--stop-color), black);
transition: --stop-color 1s;
}
button:hover {
--stop-color: green;
}
Это анимирует наше пользовательское свойство, которое является частью linear-gradient, и, следовательно, анимирует наш линейный градиент. Посмотрите Codepen ниже, чтобы увидеть полный код в действии и поэкспериментировать с ним самостоятельно.
Заключение
Houdini уже на пути к браузерам, а вместе с ним и совершенно новые способы работы с CSS и его расширения. С появлением Paint API, а теперь и Custom Props and Vals, наш набор инструментов для создания креативов расширяется. Теперь мы можем определять типизированные свойства CSS и использовать их для создания и анимации новых интересных дизайнов. В очереди проблем Houdini есть и другие функции, где вы можете оставить отзыв и узнать, что будет дальше с Houdini. Houdini существует для разработки функций, которые объясняют "магию" стилизации и макета в Интернете, так что выходите и используйте эти волшебные функции с пользой.