CSS Houdini — это обобщающий термин, который охватывает набор низкоуровневых API, которые раскрывают части движка рендеринга CSS и предоставляют разработчикам доступ к объектной модели CSS. Это огромное изменение для экосистемы CSS, поскольку оно позволяет разработчикам сообщать браузеру, как читать и анализировать пользовательский CSS, не дожидаясь, пока поставщики браузеров предоставят встроенную поддержку для этих функций. Так волнительно!
Одним из самых интересных дополнений к CSS в рамках Houdini является API свойств и значений .
Этот API расширяет возможности ваших пользовательских свойств CSS (также часто называемых переменными CSS), придавая им семантическое значение (определяемое синтаксисом) и даже резервные значения, что позволяет проводить тестирование CSS.
Написание пользовательских свойств Houdini
Вот пример установки пользовательского свойства (представьте себе: переменную CSS), но теперь с синтаксисом (типом), начальным значением (откатом) и логическим наследованием (наследует ли оно значение от своего родителя или нет?). Текущий способ сделать это — через CSS.registerProperty()
в JavaScript, но в поддерживающих браузерах вы можете использовать @property
:
CSS.registerProperty({ name: '--colorPrimary', syntax: '<color>', initialValue: 'magenta', inherits: false });
@property --colorPrimary { syntax: '<color>'; initial-value: magenta; inherits: false; }
Теперь вы можете получить доступ --colorPrimary
как и к любому другому пользовательскому свойству CSS, через var(--colorPrimary)
. Однако разница здесь в том, что --colorPrimary
не просто читается как строка. Он содержит данные!
Резервные значения
Как и в случае с любым другим пользовательским свойством, вы можете получать (используя var
) или устанавливать (записывать/переписывать) значения, но в случае с пользовательскими свойствами Houdini, если вы устанавливаете ложное значение при его переопределении, движок рендеринга CSS отправит начальное значение (его резервное значение) вместо того, чтобы игнорировать строку.
Рассмотрим пример ниже. Переменная --colorPrimary
имеет initial-value
magenta
. Но разработчик присвоил ей недопустимое значение "23". Без @property
парсер CSS проигнорировал бы недопустимый код. Теперь парсер возвращается к magenta
. Это позволяет использовать настоящие резервные варианты и тестирование в CSS. Здорово!
.card {
background-color: var(--colorPrimary); /* magenta */
}
.highlight-card {
--colorPrimary: yellow;
background-color: var(--colorPrimary); /* yellow */
}
.another-card {
--colorPrimary: 23;
background-color: var(--colorPrimary); /* magenta */
}
Синтаксис
С функцией синтаксиса теперь можно писать семантический CSS, указав тип. Текущие типы, которые разрешены, включают:
-
length
-
number
-
percentage
-
length-percentage
-
color
-
image
-
url
-
integer
-
angle
-
time
-
resolution
-
transform-list
-
transform-function
-
custom-ident
(строка пользовательского идентификатора)
Настройка синтаксиса позволяет браузеру проверять тип пользовательских свойств. Это имеет много преимуществ.
Чтобы проиллюстрировать этот момент, я покажу вам, как анимировать градиент. В настоящее время нет способа плавно анимировать (или интерполировать) между значениями градиента, поскольку каждое объявление градиента анализируется как строка.
В этом примере процент остановки градиента анимируется от начального значения 40% до конечного значения 100% посредством взаимодействия с наведением. Вы должны увидеть плавный переход этого верхнего цвета градиента вниз.
Браузер слева поддерживает API свойств и значений Houdini, что позволяет плавно останавливать переход градиента. Браузер справа — нет. Браузер без поддержки может понимать это изменение только как строку, идущую из точки A в точку B. Нет возможности интерполировать значения, и поэтому вы не видите плавный переход.
Однако, если вы объявляете тип синтаксиса при написании пользовательских свойств, а затем используете эти пользовательские свойства для включения анимации, вы увидите переход. Вы можете создать экземпляр пользовательского свойства --gradPoint
следующим образом:
@property --gradPoint {
syntax: '<percentage>';
inherits: false;
initial-value: 40%;
}
А затем, когда придет время его анимировать, вы сможете обновить значение с начальных 40%
до 100%
:
.post:hover,
.post:focus {
--gradPoint: 100%;
}
Теперь это позволит реализовать плавный переход градиента.
Заключение
Правило @property
делает захватывающую технологию еще более доступной, позволяя вам писать семантически значимый CSS внутри самого CSS. Чтобы узнать больше о CSS Houdini и API свойств и значений, ознакомьтесь со следующими ресурсами:
- Гудини уже готов?
- Справочник MDN Houdini
- Более интеллектуальные пользовательские свойства с новым API Houdini
- Очередь проблем CSSWG Houdini
Фото Кристиана Эскобара на Unsplash.