Массовая имплементация пользовательских свойств CSS в большинстве популярных браузеров открыла простор для творчества и экспериментов над архитектурой CSS-кода, недостижимой ранее.
- Всесильны ли препроцессоры?
- Можно ли дать CSS второй шанс?
- Наследуемость или БЭМ?
- А что с обратной совместимостью? Решение есть!
В рамках доклада будут детально рассмотрены практические примеры применения CSS Custom Properties. Также будут рассмотрены новые спецификации CSS Extensions (Сustom selectors) и CSS @apply Rule в рамках перспективы отказа от препроцессоров.
4. Преимущества переменных
Переменные — основа современного правильно сконструированного проекта.
Карен Менезес,Variables: The Backbone Of CSS Architecture
• Модульность.
• Уменьшение повторяемости.
• Сокращение объема.
• Повышение читаемости.
• Стайлгайд.
“
5. Переменные.Когда и какие?
Условие
• Значение встречается в коде два и более раз.
• Значение в будущем может изменяться.
Тип
• Измерения (размеры, отступы, радиусы скругления и т.п.).
• Цветовые схемы.
• Типографика.
• Наборы иконок.
• Брейкпойнты.
6. Переменные в CSS
• 2008 — первая реализация в Safari.
• 2012 — CSS Variables Module Level 1.
• 2013 — CSS Custom Properties for Cascading Variables Module Level 1.
• 2014 — первая реализация по спецификации в Chrome и Firefox.
• 2015 — W3C Candidate Recommendation.
• 2016 — массовое внедрение в браузерах.
7. Преимущества переменных CSS
• Работают в runtime и доступны для чтения и изменения.
• Существуют в DOM'е и ограничены областью видимости узла.
• Наследуются до последнего потомка узла DOM!
8. Переменные Пользовательские свойства CSS
Пользователькое свойство
Особая разновидность свойств CSS с
префиксом -- , объявляющим имя
переменной, и заданным значением.
--Variable: value;
Переменная
Функция CSS, связывающая идентификатор --
variable и его значение.
var(--Variable);
9. V
V
Переменные Пользовательские свойства CSS
Пользователькое свойство
Особая разновидность свойств CSS с
префиксом -- , объявляющим имя
переменной, и заданным значением.
-- ariable: value;
Переменная
Функция CSS, связывающая идентификатор --
variable и его значение.
var(-- ariable);
20. Причины выбранного синтаксиса
Если бы мы использовали символ "$" для переменных, то не смогли бы его использовать для
будущих новых вещей, подобных на переменные.
Таб Аткинс,Let's Talk about CSS Variables
На самом деле:
• совместимость с препроцессорами;
• нативные "грамматика" и "пунктуация" CSS.
“
42. Принцип открытости/закрытости
Программные сущности (классы, модули, функции и т.д.) должны быть открыты для расширения,
но закрыты для изменения.
Плохо
.button {
background: black;
}
.header .button {
background: white;
}
Хорошо
.button {
background: var(--main-color, black);
}
.header {
--main-color: white;
}
01.
02.
03.
04.
05.
06.
07.
01.
02.
03.
04.
05.
06.
07.
43. black
Принцип открытости/закрытости
Программные сущности (классы, модули, функции и т.д.) должны быть открыты для расширения,
но закрыты для изменения.
Плохо
.button {
background: black;
}
.header .button {
background: white;
}
Хорошо
.button {
background: var(--main-color, );
}
.header {
--main-color: white;
}
01.
02.
03.
04.
05.
06.
07.
01.
02.
03.
04.
05.
06.
07.
44. .header {
--main-color: white;
}
Принцип открытости/закрытости
Программные сущности (классы, модули, функции и т.д.) должны быть открыты для расширения,
но закрыты для изменения.
Плохо
.button {
background: black;
}
.header .button {
background: white;
}
Хорошо
.button {
background: var(--main-color, black);
}
01.
02.
03.
04.
05.
06.
07.
01.
02.
03.
04.
05.
06.
07.
94. Проверка поддержки в CSS
CSS
@supports (--a: 0) {
/* стили с поддержкой переменных */
}
@supports not (--a: 0) {
/* стили без поддержки переменных */
}
01.
02.
03.
04.
05.
06.
07.
95. @supports (--a: 0) {
}
Проверка поддержки в CSS
CSS
/* стили с поддержкой переменных */
@supports not (--a: 0) {
/* стили без поддержки переменных */
}
01.
02.
03.
04.
05.
06.
07.
96. @supports not (--a: 0) {
}
Проверка поддержки в CSS
CSS
@supports (--a: 0) {
/* стили с поддержкой переменных */
}
/* стили без поддержки переменных */
01.
02.
03.
04.
05.
06.
07.
97. Проверка поддержки в CSS
CSS
@supports (--a: 0) {
/* стили с поддержкой переменных */
}
@supports not (--a: 0) {
/* стили без поддержки переменных */
}
Не работает в IE!
01.
02.
03.
04.
05.
06.
07.
98. Проверка поддержки в JS
CSS
if (window.CSS && window.CSS.supports && window.CSS.supports('--a', 0)) {
// сценарии с поддержкой переменных
} else {
// сценарии бех поддержки переменных
}
01.
02.
03.
04.
05.
99. Ограничения переменных CSS
• нельзя использовать в:
• в именах обычных свойств CSS: var(--side): 10px ;
• в значениях медиа-запросов: @media screen and (min-width: var(--desktop-
breakpoint) { } ;
• в подстановке URL: url(var(--image-url)) ;
• будьте осторожны с вычислениями calc() :
• со сложными вычислениями в принципе;
• в Chrome с умножением/делением дробных значений;
• в Firefox с вычислениями внутри функций rgba() .
• нельзя одномоментно cбрасывать значения всех переменных: --: initial .
115. Подытоживая
• Новые способы решения старых задач.
• Решение невозможных для препроцессоров задач.
• Расширение компонентов через наследование.
• Широкая поддержка в браузерах.
• Простой нативный способ взаимодействия с JS, SVG и т.п.
• Начало конца эры препроцессоров :-P
116. Спасибо за внимание! Вопросы?
Павел Ловцевич
CTO @ LOVATA
@zigzag_mcquack
p.lovtsevich@lovata.com