SlideShare a Scribd company logo
1 of 117
Download to read offline
Пользовательские свойства
как основа архитектуры CSS
Павел Ловцевич, LOVATA
Препроцессоры
Популярные возможности
Преимущества переменных
Переменные — основа современного правильно сконструированного проекта.
Карен Менезес,Variables: The Backbone Of CSS Architecture
• Модульность.
• Уменьшение повторяемости.
• Сокращение объема.
• Повышение читаемости.
• Стайлгайд.
“
Переменные.Когда и какие?
Условие
• Значение встречается в коде два и более раз.
• Значение в будущем может изменяться.
Тип
• Измерения (размеры, отступы, радиусы скругления и т.п.).
• Цветовые схемы.
• Типографика.
• Наборы иконок.
• Брейкпойнты.
Переменные в 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 — массовое внедрение в браузерах.
Преимущества переменных CSS
• Работают в runtime и доступны для чтения и изменения.
• Существуют в DOM'е и ограничены областью видимости узла.
• Наследуются до последнего потомка узла DOM!
Переменные Пользовательские свойства CSS
Пользователькое свойство
Особая разновидность свойств CSS с
префиксом -- , объявляющим имя
переменной, и заданным значением.
--Variable: value;
Переменная
Функция CSS, связывающая идентификатор --
variable и его значение.
var(--Variable);
V
V
Переменные Пользовательские свойства CSS
Пользователькое свойство
Особая разновидность свойств CSS с
префиксом -- , объявляющим имя
переменной, и заданным значением.
-- ariable: value;
Переменная
Функция CSS, связывающая идентификатор --
variable и его значение.
var(-- ariable);
Поддержка в браузерах
PostCSS-костыль IE/Edge.
Проголосовать за внедрение в Edge
http://bit.ly/css-var-edge
Область видимости
SASS
$variable: value;
CSS
:root {
--variable: value;
}
01.
02.
03.
01.
02.
03.
:root {
}
Область видимости
SASS
$variable: value;
CSS
--variable: value;
01.
02.
03.
01.
02.
03.
html {
}
Область видимости
SASS
$variable: value;
CSS
:root {
--variable: value;
}
Альтернативная запись:
--variable: value;
01.
02.
03.
01.
02.
03.
01.
02.
03.
;!global
Область видимости
SASS
$variable: value;
Глобальная из локальной:
selector {
$variable: value
}
CSS
:root {
--variable: value;
}
Альтернативная запись:
html {
--variable: value;
}
01.
02.
03.
01.
02.
03.
04.
01.
02.
03.
01.
02.
03.
Ограничение области видимости
SASS
selector {
$variable: value;
}
CSS
selector {
--variable: value;
}
А также:
• вложенный селектор;
• @mixin.
А также:
• псевдокласс;
• @media.
01.
02.
03.
01.
02.
03.
Синтаксис
SASS
Объявление:
$variable: value;
Вызов:
selector {
property: $variable;
}
CSS
Объявление:
:root {
--variable: value;
}
Вызов:
selector {
property: var(--variable);
}
01.
02.
03.
01.
02.
03.
01.
02.
03.
01.
02.
03.
$variable: value;
selector {
property: $variable;
}
Голосуем за вариант SASS
SASS
Объявление:
Вызов:
CSS
Объявление:
:root {
--variable: value;
}
Вызов:
selector {
property: var(--variable);
}
01.
02.
03.
01.
02.
03.
01.
02.
03.
01.
02.
03.
:root {
--variable: value;
}
selector {
property: var(--variable);
}
Голосуем за вариант CSS
SASS
Объявление:
$variable: value;
Вызов:
selector {
property: $variable;
}
CSS
Объявление:
Вызов:
01.
02.
03.
01.
02.
03.
01.
02.
03.
01.
02.
03.
Причины выбранного синтаксиса
Если бы мы использовали символ "$" для переменных, то не смогли бы его использовать для
будущих новых вещей, подобных на переменные.
Таб Аткинс,Let's Talk about CSS Variables
На самом деле:
• совместимость с препроцессорами;
• нативные "грамматика" и "пунктуация" CSS.
“
Динамичность
переменных
all-in-one.css
Один большой CSS
HTML
<head>
<link rel="stylesheet" href=" ">
</head>
<body>
<div class="block">…</>
…
</body>
01.
02.
03.
04.
05.
06.
07.
Много мелких CSS
HTML
<head>
<link rel="stylesheet" href="main.css">
<link rel="stylesheet" href="block.css">
…
</head>
<body>
<div class="block">…</>
…
</body>
01.
02.
03.
04.
05.
06.
07.
08.
09.
main.css
Много мелких CSS
HTML
<head>
<link rel="stylesheet" href=" ">
<link rel="stylesheet" href="block.css">
…
</head>
<body>
<div class="block">…</>
…
</body>
01.
02.
03.
04.
05.
06.
07.
08.
09.
block.css
Много мелких CSS
HTML
<head>
<link rel="stylesheet" href="main.css">
<link rel="stylesheet" href=" ">
…
</head>
<body>
<div class="block">…</>
…
</body>
01.
02.
03.
04.
05.
06.
07.
08.
09.
block.css
Много мелких CSS
HTML
<head>
<link rel="stylesheet" href="main.css">
…
</head>
<body>
<link rel="stylesheet" href=" ">
<div class="block">…</>
…
</body>
01.
02.
03.
04.
05.
06.
07.
08.
09.
Блокировка отображения
HTML
<head>
<link
rel="stylesheet"
href="main.css">
</head>
main.css
:root {
--block-display: none;
}
.block {
display: var(--block-display);
}
01.
02.
03.
04.
05.
01.
02.
03.
04.
05.
06.
07.
main.css
Блокировка отображения
HTML
<head>
<link
rel="stylesheet"
href=" ">
</head>
main.css
:root {
--block-display: none;
}
.block {
display: var(--block-display);
}
01.
02.
03.
04.
05.
01.
02.
03.
04.
05.
06.
07.
none
display
Блокировка отображения
HTML
<head>
<link
rel="stylesheet"
href="main.css">
</head>
main.css
:root {
--block-display: ;
}
.block {
: var(--block-display);
}
01.
02.
03.
04.
05.
01.
02.
03.
04.
05.
06.
07.
block.css
Снятие блокировки
HTML
<body>
<link
rel="stylesheet"
href=" ">
<div class="block">
…</div>
</body>
block.css
.block {
--block-display: block;
}
01.
02.
03.
04.
05.
06.
07.
01.
02.
03.
block
Снятие блокировки
HTML
<body>
<link
rel="stylesheet"
href="block.css">
<div class="block">
…</div>
</body>
block.css
.block {
--block-display: ;
}
01.
02.
03.
04.
05.
06.
07.
01.
02.
03.
Переменные
в @media
Переменные в @media
CSS
:root {
--gutter: 1em;
}
.сontainer {
padding: var(--gutter);
}
CSS глазами браузера
01.
02.
03.
04.
05.
06.
1em
2em
Переменные в @media
CSS
:root {
--gutter: ;
}
.сontainer {
padding: var(--gutter);
}
@media (min-width: 1200px) {
:root { --gutter: ; }
}
CSS глазами браузера
01.
02.
03.
04.
05.
06.
07.
08.
09.
1em
2em
1em
2em
Переменные в @media
CSS
:root {
--gutter: ;
}
.сontainer {
padding: var(--gutter);
}
@media (min-width: 1200px) {
:root { --gutter: ; }
}
CSS глазами браузера
.сontainer {
padding: ;
}
@media (min-width: 1200px) {
.сontainer {
padding: ;
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
01.
02.
03.
04.
05.
06.
07.
08.
09.
1em
Переменные в @media (SASS)
SASS
$gutter: 1em;
.сontainer {
padding: $gutter;
}
@media (min-width: 1200px) {
$gutter: 2em;
}
CSS
.сontainer {
padding: ;
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
01.
02.
03.
@media (min-width: 1200px) {
$gutter: 2em;
}
1em
Переменные в @media (SASS)
SASS
$gutter: 1em;
.сontainer {
padding: $gutter;
}
CSS
.сontainer {
padding: ;
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
01.
02.
03.
Наследование
переменных
button
Наследование переменных
CSS
:root {
--main-color: black;
}
{
background:
var(--main-color);
}
CSS глазами браузера
01.
02.
03.
04.
05.
06.
07.
black
white
black
white
Наследование переменных
CSS
:root {
--main-color: ;
}
button {
background:
var(--main-color);
}
.black-box {
--main-color: ;
}
CSS глазами браузера
button {
background: ;
}
.black-box button {
background: ;
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
01.
02.
03.
04.
05.
06.
07.
Каскад?
Это шутка?
Принцип открытости/закрытости
Программные сущности (классы, модули, функции и т.д.) должны быть открыты для расширения,
но закрыты для изменения.
Плохо
.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.
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.
.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.
Настройки
по умолчанию
Локальный fallback
CSS
:root {
--main-color: initial;
}
button {
background: var(--main-color,
green);
}
CSS глазами браузера
01.
02.
03.
04.
05.
06.
07.
08.
initial
Локальный fallback
CSS
:root {
--main-color: ;
}
button {
background: var(--main-color,
green);
}
CSS глазами браузера
01.
02.
03.
04.
05.
06.
07.
08.
green
green
Локальный fallback
CSS
:root {
--main-color: initial;
}
button {
background: var(--main-color,
);
}
CSS глазами браузера
button {
background: ;
}
01.
02.
03.
04.
05.
06.
07.
08.
01.
02.
03.
red red
Локальный fallback
CSS
:root {
--main-color: ;
}
button {
background: var(--main-color,
green);
}
CSS глазами браузера
button {
background: ;
}
01.
02.
03.
04.
05.
06.
07.
08.
01.
02.
03.
Глобальный fallback
CSS
:root {
--main-color:
var(--main-color-custom,
green);
--main-color-custom: initial;
}
button {
background: var(--main-color);
}
CSS глазами браузера
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
--main-color
Глобальный fallback
CSS
:root {
:
var(--main-color-custom,
green);
--main-color-custom: initial;
}
button {
background: var(--main-color);
}
CSS глазами браузера
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
--main-color-custom
Глобальный fallback
CSS
:root {
--main-color:
var(--main-color-custom,
green);
: initial;
}
button {
background: var(--main-color);
}
CSS глазами браузера
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
--main-color-custom
--main-color-custom
Глобальный fallback
CSS
:root {
--main-color:
var( ,
green);
: initial;
}
button {
background: var(--main-color);
}
CSS глазами браузера
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
green
Глобальный fallback
CSS
:root {
--main-color:
var(--main-color-custom,
);
--main-color-custom: initial;
}
button {
background: var(--main-color);
}
CSS глазами браузера
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
green
green
Глобальный fallback
CSS
:root {
--main-color:
var(--main-color-custom,
);
--main-color-custom: initial;
}
button {
background: var(--main-color);
}
CSS глазами браузера
button {
background: ;
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
01.
02.
03.
red
red
Глобальный fallback
CSS
:root {
--main-color:
var(--main-color-custom,
green);
--main-color-custom: ;
}
button {
background: var(--main-color);
}
CSS глазами браузера
button {
background: ;
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
01.
02.
03.
Fallback в SASS
SASS
$color: null;
$color: green !default;
button {
background: $color;
}
CSS
01.
02.
03.
04.
05.
06.
$color
$color
Fallback в SASS
SASS
: null;
: green !default;
button {
background: $color;
}
CSS
01.
02.
03.
04.
05.
06.
null
Fallback в SASS
SASS
$color: ;
$color: green !default;
button {
background: $color;
}
CSS
01.
02.
03.
04.
05.
06.
!default
Fallback в SASS
SASS
$color: null;
$color: green ;
button {
background: $color;
}
CSS
01.
02.
03.
04.
05.
06.
green green
Fallback в SASS
SASS
$color: null;
$color: !default;
button {
background: $color;
}
CSS
button {
background: ;
}
01.
02.
03.
04.
05.
06.
01.
02.
03.
red
red
Fallback в SASS
SASS
$color: ;
$color: green !default;
button {
background: $color;
}
CSS
button {
background: ;
}
01.
02.
03.
04.
05.
06.
01.
02.
03.
I18n
“aнглийские
двойные”
«французские
ёлочки»
I18n
HTML
<html lang="ru">
<body>
<q>Чебурашка</q>
</body>
</html>
CSS
01.
02.
03.
04.
05.
lang
I18n
HTML
<html ="ru">
<body>
<q>Чебурашка</q>
</body>
</html>
CSS
01.
02.
03.
04.
05.
« »
“ ”
I18n
HTML
<html lang="ru">
<body>
<q>Чебурашка</q>
</body>
</html>
CSS
q {
quotes: var(--quotes-l)
var(--quotes-r);
}
:root:lang(ru) {
--quotes-l: " "; --quotes-r: " ";
}
:root:lang(en) {
--quotes-l: " "; --quotes-r: " ";
}
01.
02.
03.
04.
05.
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
ru
« »
« »
I18n
HTML
<html lang=" ">
<body>
<q>Чебурашка</q>
</body>
</html>
Результат
Чебурашка
CSS
q {
quotes: var(--quotes-l)
var(--quotes-r);
}
:root:lang(ru) {
--quotes-l: " "; --quotes-r: " ";
}
:root:lang(en) {
--quotes-l: "“"; --quotes-r: "”";
}
01.
02.
03.
04.
05.
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
en
“ ”
“ ”
I18n
HTML
<html lang=" ">
<body>
<q>Чебурашка</q>
</body>
</html>
Результат
Чебурашка
CSS
q {
quotes: var(--quotes-l)
var(--quotes-r);
}
:root:lang(ru) {
--quotes-l: "«"; --quotes-r: "»";
}
:root:lang(en) {
--quotes-l: " "; --quotes-r: " ";
}
01.
02.
03.
04.
05.
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
Вычисляемые
значения
Вычисляемые значения
CSS
:root {
--line-height: 1.5;
}
p {
margin-bottom:
var(--line-height)rem;
}
CSS глазами браузера
01.
02.
03.
04.
05.
06.
07.
08.
margin-bottom
Вычисляемые значения
CSS
:root {
--line-height: 1.5;
}
p {
:
var(--line-height)rem;
}
CSS глазами браузера
01.
02.
03.
04.
05.
06.
07.
08.
--line-height: 1.5;
Вычисляемые значения
CSS
:root {
}
p {
margin-bottom:
var(--line-height)rem;
}
CSS глазами браузера
01.
02.
03.
04.
05.
06.
07.
08.
rem
1.5 rem
Вычисляемые значения
CSS
:root {
--line-height: 1.5;
}
p {
margin-bottom:
var(--line-height) ;
}
CSS глазами браузера
p {
margin-bottom: ;
}
01.
02.
03.
04.
05.
06.
07.
08.
01.
02.
03.
Вычисляемые значения
CSS
:root {
--line-height: 1.5;
}
p {
margin-bottom:
calc(var(--line-height) *
1rem);
}
CSS глазами браузера
01.
02.
03.
04.
05.
06.
07.
08.
09.
var(--line-height)
Вычисляемые значения
CSS
:root {
--line-height: 1.5;
}
p {
margin-bottom:
calc( *
1rem);
}
CSS глазами браузера
01.
02.
03.
04.
05.
06.
07.
08.
09.
1rem
Вычисляемые значения
CSS
:root {
--line-height: 1.5;
}
p {
margin-bottom:
calc(var(--line-height) *
);
}
CSS глазами браузера
01.
02.
03.
04.
05.
06.
07.
08.
09.
1rem
1rem
Вычисляемые значения
CSS
:root {
--line-height: 1.5;
}
p {
margin-bottom:
calc(var(--line-height) *
);
}
CSS глазами браузера
p {
margin-bottom: ;
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
01.
02.
03.
Цветовые
схемы
и SVG
Цветовые схемы и SVG
SVG
<svg height="100" width="100">
<circle cx="50" cy="50"
r="50"
fill="red" />
</svg>
01.
02.
03.
04.
05.
red
Цветовые схемы и SVG
SVG
<svg height="100" width="100">
<circle cx="50" cy="50"
r="50"
fill=" " />
</svg>
01.
02.
03.
04.
05.
--main-color
--main-color
Цветовые схемы и SVG
SVG
<svg height="100" width="100">
<circle cx="50" cy="50"
r="50"
fill="var( )" />
</svg>
CSS
:root {
:
var(--main-color-custom, green);
--main-color-custom: red;
}
01.
02.
03.
04.
05.
01.
02.
03.
04.
05.
green
Цветовые схемы и SVG
SVG
<svg height="100" width="100">
<circle cx="50" cy="50"
r="50"
fill="var(--main-color)" />
</svg>
CSS
:root {
--main-color:
var(--main-color-custom, );
--main-color-custom: red;
}
01.
02.
03.
04.
05.
01.
02.
03.
04.
05.
--main-color-custom
Цветовые схемы и SVG
SVG
<svg height="100" width="100">
<circle cx="50" cy="50"
r="50"
fill="var(--main-color)" />
</svg>
CSS
:root {
--main-color:
var(--main-color-custom, green);
: red;
}
01.
02.
03.
04.
05.
01.
02.
03.
04.
05.
red red
Цветовые схемы и SVG
SVG глазами браузера
<svg height="100" width="100">
<circle cx="50" cy="50"
r="50"
fill=" " />
</svg>
CSS
:root {
--main-color:
var(--main-color-custom, green);
--main-color-custom: ;
}
01.
02.
03.
04.
05.
01.
02.
03.
04.
05.
JavaScript
API CSSVariablesMap
el.style.var.get('variable');
el.style.var.has('variable');
el.style.var.set('variable', 'value');
el.style.var.delete('variable');
01.
02.
03.
04.
get
has
set
delete
API CSSVariablesMap
el.style.var. ('variable');
el.style.var. ('variable');
el.style.var. ('variable', 'value');
el.style.var. ('variable');
01.
02.
03.
04.
API CSSVariablesMap
el.style.var.get('variable');
el.style.var.has('variable');
el.style.var.set('variable', 'value');
el.style.var.delete('variable');
API удалено из стандарта в поисках лучшего решения.
01.
02.
03.
04.
getPropertyValue
setProperty
removeProperty
API CSSStyleDeclaration
getComputedStyle(document.documentElement). ('--variable');
element.style. ('--variable', 'value');
element.style. ('--variable');
01.
02.
03.
'var(--anotherVariable, "fallback")
API CSSStyleDeclaration
getComputedStyle(document.documentElement).getPropertyValue('--variable');
element.style.setProperty('--variable', 'value');
element.style.removeProperty('--variable');
И даже так:
element.style.setProperty('--variable', ');
01.
02.
03.
Проверка
поддержки
Проверка поддержки в CSS
CSS
@supports (--a: 0) {
/* стили с поддержкой переменных */
}
@supports not (--a: 0) {
/* стили без поддержки переменных */
}
01.
02.
03.
04.
05.
06.
07.
@supports (--a: 0) {
}
Проверка поддержки в CSS
CSS
/* стили с поддержкой переменных */
@supports not (--a: 0) {
/* стили без поддержки переменных */
}
01.
02.
03.
04.
05.
06.
07.
@supports not (--a: 0) {
}
Проверка поддержки в CSS
CSS
@supports (--a: 0) {
/* стили с поддержкой переменных */
}
/* стили без поддержки переменных */
01.
02.
03.
04.
05.
06.
07.
Проверка поддержки в CSS
CSS
@supports (--a: 0) {
/* стили с поддержкой переменных */
}
@supports not (--a: 0) {
/* стили без поддержки переменных */
}
Не работает в IE!
01.
02.
03.
04.
05.
06.
07.
Проверка поддержки в JS
CSS
if (window.CSS && window.CSS.supports && window.CSS.supports('--a', 0)) {
// сценарии с поддержкой переменных
} else {
// сценарии бех поддержки переменных
}
01.
02.
03.
04.
05.
Ограничения переменных CSS
• нельзя использовать в:
• в именах обычных свойств CSS: var(--side): 10px ;
• в значениях медиа-запросов: @media screen and (min-width: var(--desktop-
breakpoint) { } ;
• в подстановке URL: url(var(--image-url)) ;
• будьте осторожны с вычислениями calc() :
• со сложными вычислениями в принципе;
• в Chrome с умножением/делением дробных значений;
• в Firefox с вычислениями внутри функций rgba() .
• нельзя одномоментно cбрасывать значения всех переменных: --: initial .
Таб Аткинс
Работает над:
• CSS Nesting Module Level 3
• CSS @apply Rule
• CSS When/Else Rules
@mixin
@apply
@apply
CSS
:root {
--clearfix: {
display: table;
clear: both;
content: '';
}
}
CSS глазами браузера
01.
02.
03.
04.
05.
06.
07.
:root {
}
@apply
CSS
--clearfix: {
display: table;
clear: both;
content: '';
}
CSS глазами браузера
01.
02.
03.
04.
05.
06.
07.
--clearfix
@apply
CSS
:root {
: {
display: table;
clear: both;
content: '';
}
}
CSS глазами браузера
01.
02.
03.
04.
05.
06.
07.
display: table;
clear: both;
content: '';
@apply
CSS
:root {
--clearfix: {
}
}
CSS глазами браузера
01.
02.
03.
04.
05.
06.
07.
@apply --clearfix;
display: table;
clear: both;
content: '';
@apply
CSS
:root {
--clearfix: {
display: table;
clear: both;
content: '';
}
}
.box:after {
}
CSS глазами браузера
.box:after {
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
01.
02.
03.
04.
05.
chrome://flags
@custom-selector
@custom-selector
CSS
article h1 + p,
article h2 + p,
article h3 + p,
article h4 + p,
article h5 + p,
article h6 + p {
margin-top: 0;
}
CSS
@custom-selector :--heading {
expansion: h1, h2, h3,
h4, h5, h6;
}
01.
02.
03.
04.
05.
06.
07.
08.
01.
02.
03.
04.
@custom-selector
@custom-selector
CSS
article h1 + p,
article h2 + p,
article h3 + p,
article h4 + p,
article h5 + p,
article h6 + p {
margin-top: 0;
}
CSS
:--heading {
expansion: h1, h2, h3,
h4, h5, h6;
}
01.
02.
03.
04.
05.
06.
07.
08.
01.
02.
03.
04.
:--heading
@custom-selector
CSS
article h1 + p,
article h2 + p,
article h3 + p,
article h4 + p,
article h5 + p,
article h6 + p {
margin-top: 0;
}
CSS
@custom-selector {
expansion: h1, h2, h3,
h4, h5, h6;
}
01.
02.
03.
04.
05.
06.
07.
08.
01.
02.
03.
04.
expansion: h1, h2, h3,
h4, h5, h6;
@custom-selector
CSS
article h1 + p,
article h2 + p,
article h3 + p,
article h4 + p,
article h5 + p,
article h6 + p {
margin-top: 0;
}
CSS
@custom-selector :--heading {
}
01.
02.
03.
04.
05.
06.
07.
08.
01.
02.
03.
04.
:--heading
@custom-selector
CSS
article h1 + p,
article h2 + p,
article h3 + p,
article h4 + p,
article h5 + p,
article h6 + p {
margin-top: 0;
}
CSS
@custom-selector :--heading {
expansion: h1, h2, h3,
h4, h5, h6;
}
article + p {
margin-top: 0;
}
01.
02.
03.
04.
05.
06.
07.
08.
01.
02.
03.
04.
05.
06.
07.
08.
@custom-selector
CSS
article h1 + p,
article h2 + p,
article h3 + p,
article h4 + p,
article h5 + p,
article h6 + p {
margin-top: 0;
}
CSS
@custom-selector :--heading {
expansion: h1, h2, h3,
h4, h5, h6;
}
article :--heading + p {
margin-top: 0;
}
Полифил PostCSS Custom Selectors.
01.
02.
03.
04.
05.
06.
07.
08.
01.
02.
03.
04.
05.
06.
07.
08.
Подытоживая
• Новые способы решения старых задач.
• Решение невозможных для препроцессоров задач.
• Расширение компонентов через наследование.
• Широкая поддержка в браузерах.
• Простой нативный способ взаимодействия с JS, SVG и т.п.
• Начало конца эры препроцессоров :-P
Спасибо за внимание! Вопросы?
Павел Ловцевич
CTO @ LOVATA
@zigzag_mcquack
p.lovtsevich@lovata.com
Не забудьте проголосовать!
http://bit.ly/css-var-edge

More Related Content

Viewers also liked

The horror story
The horror storyThe horror story
The horror storyceebee2009
 
Web Content Personalization: Three Case Studies
Web Content Personalization: Three Case StudiesWeb Content Personalization: Three Case Studies
Web Content Personalization: Three Case StudiesForaker
 
NEMA - Turnarounds
NEMA - TurnaroundsNEMA - Turnarounds
NEMA - Turnaroundsguestcbcc54
 
The Sims and postmodernism
The Sims and postmodernismThe Sims and postmodernism
The Sims and postmodernismMr M
 
Developing Custom Vocabularies for Personalized Web Content
Developing Custom Vocabularies for Personalized Web ContentDeveloping Custom Vocabularies for Personalized Web Content
Developing Custom Vocabularies for Personalized Web ContentForaker
 
Telephone Etiquette
Telephone EtiquetteTelephone Etiquette
Telephone EtiquetteDylan Kemna
 
Postmodern theorists summary presentation
Postmodern theorists summary presentationPostmodern theorists summary presentation
Postmodern theorists summary presentationMr M
 
Assassins creed postmodernism and video games
Assassins creed   postmodernism and video gamesAssassins creed   postmodernism and video games
Assassins creed postmodernism and video gamesMr M
 

Viewers also liked (11)

The horror story
The horror storyThe horror story
The horror story
 
Web Content Personalization: Three Case Studies
Web Content Personalization: Three Case StudiesWeb Content Personalization: Three Case Studies
Web Content Personalization: Three Case Studies
 
Body
BodyBody
Body
 
NEMA - Turnarounds
NEMA - TurnaroundsNEMA - Turnarounds
NEMA - Turnarounds
 
The Sims and postmodernism
The Sims and postmodernismThe Sims and postmodernism
The Sims and postmodernism
 
Developing Custom Vocabularies for Personalized Web Content
Developing Custom Vocabularies for Personalized Web ContentDeveloping Custom Vocabularies for Personalized Web Content
Developing Custom Vocabularies for Personalized Web Content
 
Telephone Etiquette
Telephone EtiquetteTelephone Etiquette
Telephone Etiquette
 
Postmodern theorists summary presentation
Postmodern theorists summary presentationPostmodern theorists summary presentation
Postmodern theorists summary presentation
 
Assassins creed postmodernism and video games
Assassins creed   postmodernism and video gamesAssassins creed   postmodernism and video games
Assassins creed postmodernism and video games
 
Pucca
PuccaPucca
Pucca
 
Web 2.0
Web 2.0Web 2.0
Web 2.0
 

Similar to пользовательские свойства как основа архитектуры CSS

CSS. Практика
CSS. ПрактикаCSS. Практика
CSS. ПрактикаVitebsk Miniq
 
Андрей Тюпа Оптимизация верстки Sass + Compass framework
Андрей Тюпа Оптимизация верстки Sass + Compass frameworkАндрей Тюпа Оптимизация верстки Sass + Compass framework
Андрей Тюпа Оптимизация верстки Sass + Compass frameworkAlbina Tiupa
 
Роман Комаров "CSS-препроцессоры: из каменного века — в будущее"
Роман Комаров "CSS-препроцессоры: из каменного века — в будущее"Роман Комаров "CSS-препроцессоры: из каменного века — в будущее"
Роман Комаров "CSS-препроцессоры: из каменного века — в будущее"Yandex
 
Артем Маркушев - HTML & CSS
Артем Маркушев - HTML & CSSАртем Маркушев - HTML & CSS
Артем Маркушев - HTML & CSSDataArt
 
CSS глазами машин
CSS глазами машинCSS глазами машин
CSS глазами машинRoman Dvornov
 
Препроцессор LESS. Компилятор Winless
Препроцессор LESS. Компилятор WinlessПрепроцессор LESS. Компилятор Winless
Препроцессор LESS. Компилятор WinlessIT Academy Project EU
 
Спецкурс 2014, занятие 9 (2 часть). Code conventions and best practices
Спецкурс 2014, занятие 9 (2 часть). Code conventions and best practicesСпецкурс 2014, занятие 9 (2 часть). Code conventions and best practices
Спецкурс 2014, занятие 9 (2 часть). Code conventions and best practices7bits
 
Ускорение frontend-разработки с помощью Haml, Sass, Compass
Ускорение frontend-разработки с помощью Haml, Sass, CompassУскорение frontend-разработки с помощью Haml, Sass, Compass
Ускорение frontend-разработки с помощью Haml, Sass, CompassAndrey Sitnik
 
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....rit2011
 
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....rit2011
 
Артем Маркушев — HTML и CSS по кирпичикам. Детали.
Артем Маркушев — HTML и CSS по кирпичикам. Детали.Артем Маркушев — HTML и CSS по кирпичикам. Детали.
Артем Маркушев — HTML и CSS по кирпичикам. Детали.DataArt
 
Ваш CSS нас не устраивает, мы придумаем свой / Роман Прудников (2ГИС)
Ваш CSS нас не устраивает, мы придумаем свой / Роман Прудников (2ГИС)Ваш CSS нас не устраивает, мы придумаем свой / Роман Прудников (2ГИС)
Ваш CSS нас не устраивает, мы придумаем свой / Роман Прудников (2ГИС)Ontico
 
Стажировка-2015. Разработка. Занятие 13. Сборка фронтенда
Стажировка-2015. Разработка. Занятие 13. Сборка фронтендаСтажировка-2015. Разработка. Занятие 13. Сборка фронтенда
Стажировка-2015. Разработка. Занятие 13. Сборка фронтенда7bits
 
Создание веб-сайта. Курс молодого бойца
Создание веб-сайта. Курс молодого бойцаСоздание веб-сайта. Курс молодого бойца
Создание веб-сайта. Курс молодого бойцаAnton Cherepov
 
Зачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyle
Зачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyleЗачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyle
Зачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyleYandex
 
Основы CSS
Основы CSSОсновы CSS
Основы CSSsneemb
 
010 презентация less и адаптивный дизайн
010 презентация   less и адаптивный дизайн010 презентация   less и адаптивный дизайн
010 презентация less и адаптивный дизайнsivorka
 
LESS and even more. Anton Shubkin.
LESS and even more. Anton Shubkin.LESS and even more. Anton Shubkin.
LESS and even more. Anton Shubkin.ADCI Solutions
 

Similar to пользовательские свойства как основа архитектуры CSS (20)

CSS. Практика
CSS. ПрактикаCSS. Практика
CSS. Практика
 
Андрей Тюпа Оптимизация верстки Sass + Compass framework
Андрей Тюпа Оптимизация верстки Sass + Compass frameworkАндрей Тюпа Оптимизация верстки Sass + Compass framework
Андрей Тюпа Оптимизация верстки Sass + Compass framework
 
Роман Комаров "CSS-препроцессоры: из каменного века — в будущее"
Роман Комаров "CSS-препроцессоры: из каменного века — в будущее"Роман Комаров "CSS-препроцессоры: из каменного века — в будущее"
Роман Комаров "CSS-препроцессоры: из каменного века — в будущее"
 
Артем Маркушев - HTML & CSS
Артем Маркушев - HTML & CSSАртем Маркушев - HTML & CSS
Артем Маркушев - HTML & CSS
 
SASS & LESS
SASS & LESSSASS & LESS
SASS & LESS
 
CSS глазами машин
CSS глазами машинCSS глазами машин
CSS глазами машин
 
Парсим CSS
Парсим CSSПарсим CSS
Парсим CSS
 
Препроцессор LESS. Компилятор Winless
Препроцессор LESS. Компилятор WinlessПрепроцессор LESS. Компилятор Winless
Препроцессор LESS. Компилятор Winless
 
Спецкурс 2014, занятие 9 (2 часть). Code conventions and best practices
Спецкурс 2014, занятие 9 (2 часть). Code conventions and best practicesСпецкурс 2014, занятие 9 (2 часть). Code conventions and best practices
Спецкурс 2014, занятие 9 (2 часть). Code conventions and best practices
 
Ускорение frontend-разработки с помощью Haml, Sass, Compass
Ускорение frontend-разработки с помощью Haml, Sass, CompassУскорение frontend-разработки с помощью Haml, Sass, Compass
Ускорение frontend-разработки с помощью Haml, Sass, Compass
 
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
 
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
 
Артем Маркушев — HTML и CSS по кирпичикам. Детали.
Артем Маркушев — HTML и CSS по кирпичикам. Детали.Артем Маркушев — HTML и CSS по кирпичикам. Детали.
Артем Маркушев — HTML и CSS по кирпичикам. Детали.
 
Ваш CSS нас не устраивает, мы придумаем свой / Роман Прудников (2ГИС)
Ваш CSS нас не устраивает, мы придумаем свой / Роман Прудников (2ГИС)Ваш CSS нас не устраивает, мы придумаем свой / Роман Прудников (2ГИС)
Ваш CSS нас не устраивает, мы придумаем свой / Роман Прудников (2ГИС)
 
Стажировка-2015. Разработка. Занятие 13. Сборка фронтенда
Стажировка-2015. Разработка. Занятие 13. Сборка фронтендаСтажировка-2015. Разработка. Занятие 13. Сборка фронтенда
Стажировка-2015. Разработка. Занятие 13. Сборка фронтенда
 
Создание веб-сайта. Курс молодого бойца
Создание веб-сайта. Курс молодого бойцаСоздание веб-сайта. Курс молодого бойца
Создание веб-сайта. Курс молодого бойца
 
Зачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyle
Зачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyleЗачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyle
Зачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyle
 
Основы CSS
Основы CSSОсновы CSS
Основы CSS
 
010 презентация less и адаптивный дизайн
010 презентация   less и адаптивный дизайн010 презентация   less и адаптивный дизайн
010 презентация less и адаптивный дизайн
 
LESS and even more. Anton Shubkin.
LESS and even more. Anton Shubkin.LESS and even more. Anton Shubkin.
LESS and even more. Anton Shubkin.
 

пользовательские свойства как основа архитектуры CSS