117
Пользовательские свойства как основа архитектуры CSS Павел Ловцевич, LOVATA

Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

  • Upload
    ontico

  • View
    289

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Пользовательские свойства как основа архитектуры CSSПавел Ловцевич, LOVATA

Page 2: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Препроцессоры

Page 3: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Популярные возможности

Page 4: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Преимущества переменныхПеременные — основа современного правильно сконструированного проекта.

Карен Менезес, Variables: The Backbone Of CSS Architecture

• Модульность.

• Уменьшение повторяемости.

• Сокращение объема.

• Повышение читаемости.

• Стайлгайд.

Page 5: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Переменные. Когда и какие?Условие

• Значение встречается в коде два и более раз.

• Значение в будущем может изменяться.

Тип

• Измерения (размеры, отступы, радиусы скругления и т.п.).

• Цветовые схемы.

• Типографика.

• Наборы иконок.

• Брейкпойнты.

Page 6: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Переменные в 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 — массовое внедрение в браузерах.

Page 7: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Преимущества переменных CSS• Работают в runtime и доступны для чтения и изменения.

• Существуют в DOM'е и ограничены областью видимости узла.

• Наследуются до последнего потомка узла DOM!

Page 8: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Переменные Пользовательские свойства CSSПользователькое свойство

Особая разновидность свойств CSS с

префиксом -- , объявляющим имя

переменной, и заданным значением.

--Variable: value;

Переменная

Функция CSS, связывающая идентификатор --

variable и его значение.

var(--Variable);

Page 9: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

V

V

Переменные Пользовательские свойства CSSПользователькое свойство

Особая разновидность свойств CSS с

префиксом -- , объявляющим имя

переменной, и заданным значением.

-- ariable: value;

Переменная

Функция CSS, связывающая идентификатор --

variable и его значение.

var(-- ariable);

Page 10: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Поддержка в браузерах

PostCSS-костыль IE/Edge.

Page 11: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Проголосовать за внедрение в Edge

http://bit.ly/css-var-edge

Page 12: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Область видимостиSASS

$variable: value;

CSS

:root {

--variable: value;

}

01.

02.

03.

01.

02.

03.

Page 13: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

:root {

}

Область видимостиSASS

$variable: value;

CSS

--variable: value;

01.

02.

03.

01.

02.

03.

Page 14: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

html {

}

Область видимостиSASS

$variable: value;

CSS

:root {

--variable: value;

}

Альтернативная запись:

--variable: value;

01.

02.

03.

01.

02.

03.

01.

02.

03.

Page 15: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

;!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.

Page 16: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Ограничение области видимостиSASS

selector {

$variable: value;

}

CSS

selector {

--variable: value;

}

А также:

• вложенный селектор;

• @mixin.

А также:

• псевдокласс;

• @media.

01.

02.

03.

01.

02.

03.

Page 17: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Синтаксис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.

Page 18: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

$variable: value;

selector {

property: $variable;

}

Голосуем за вариант SASSSASS

Объявление:

Вызов:

CSS

Объявление:

:root {

--variable: value;

}

Вызов:

selector {

property: var(--variable);

}

01.

02.

03.

01.

02.

03.

01.

02.

03.

01.

02.

03.

Page 19: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

:root {

--variable: value;

}

selector {

property: var(--variable);

}

Голосуем за вариант CSSSASS

Объявление:

$variable: value;

Вызов:

selector {

property: $variable;

}

CSS

Объявление:

Вызов:

01.

02.

03.

01.

02.

03.

01.

02.

03.

01.

02.

03.

Page 20: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Причины выбранного синтаксисаЕсли бы мы использовали символ "$" для переменных, то не смогли бы его использовать для

будущих новых вещей, подобных на переменные.

Таб Аткинс, Let's Talk about CSS Variables

На самом деле:

• совместимость с препроцессорами;

• нативные "грамматика" и "пунктуация" CSS.

Page 21: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Динамичность переменных

Page 22: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

all-in-one.css

Один большой CSSHTML

<head>

<link rel="stylesheet" href=" ">

</head>

<body>

<div class="block">…</>

</body>

01.

02.

03.

04.

05.

06.

07.

Page 23: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Много мелких CSSHTML

<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.

Page 24: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

main.css

Много мелких CSSHTML

<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.

Page 25: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

block.css

Много мелких CSSHTML

<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.

Page 26: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

block.css

Много мелких CSSHTML

<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.

Page 27: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Блокировка отображения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.

Page 28: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

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.

Page 29: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

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.

Page 30: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

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.

Page 31: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

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.

Page 32: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Переменные в @media

Page 33: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Переменные в @mediaCSS

:root {

--gutter: 1em;

}

.сontainer {

padding: var(--gutter);

}

CSS глазами браузера

01.

02.

03.

04.

05.

06.

Page 34: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

1em

2em

Переменные в @mediaCSS

:root {

--gutter: ;

}

.сontainer {

padding: var(--gutter);

}

@media (min-width: 1200px) {

:root { --gutter: ; }

}

CSS глазами браузера

01.

02.

03.

04.

05.

06.

07.

08.

09.

Page 35: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

1em

2em

1em

2em

Переменные в @mediaCSS

: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.

Page 36: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

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.

Page 37: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

@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.

Page 38: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Наследованиепеременных

Page 39: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

button

Наследование переменныхCSS

:root {

--main-color: black;

}

{

background:

var(--main-color);

}

CSS глазами браузера

01.

02.

03.

04.

05.

06.

07.

Page 40: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

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.

Page 41: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Каскад? Это шутка?

Page 42: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Принцип открытости/закрытостиПрограммные сущности (классы, модули, функции и т.д.) должны быть открыты для расширения,

но закрыты для изменения.

Плохо

.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.

Page 43: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

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.

Page 44: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

.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.

Page 45: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Настройки по умолчанию

Page 46: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Локальный fallbackCSS

:root {

--main-color: initial;

}

button {

background: var(--main-color,

green);

}

CSS глазами браузера

01.

02.

03.

04.

05.

06.

07.

08.

Page 47: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

initial

Локальный fallbackCSS

:root {

--main-color: ;

}

button {

background: var(--main-color,

green);

}

CSS глазами браузера

01.

02.

03.

04.

05.

06.

07.

08.

Page 48: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

green

green

Локальный fallbackCSS

:root {

--main-color: initial;

}

button {

background: var(--main-color,

);

}

CSS глазами браузера

button {

background: ;

}

01.

02.

03.

04.

05.

06.

07.

08.

01.

02.

03.

Page 49: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

red red

Локальный fallbackCSS

:root {

--main-color: ;

}

button {

background: var(--main-color,

green);

}

CSS глазами браузера

button {

background: ;

}

01.

02.

03.

04.

05.

06.

07.

08.

01.

02.

03.

Page 50: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Глобальный fallbackCSS

: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.

Page 51: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

--main-color

Глобальный fallbackCSS

: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.

Page 52: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

--main-color-custom

Глобальный fallbackCSS

: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.

Page 53: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

--main-color-custom

--main-color-custom

Глобальный fallbackCSS

:root {

--main-color:

var( ,

green);

: initial;

}

button {

background: var(--main-color);

}

CSS глазами браузера

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

Page 54: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

green

Глобальный fallbackCSS

: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.

Page 55: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

green

green

Глобальный fallbackCSS

: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.

Page 56: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

red

red

Глобальный fallbackCSS

: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.

Page 57: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Fallback в SASSSASS

$color: null;

$color: green !default;

button {

background: $color;

}

CSS

01.

02.

03.

04.

05.

06.

Page 58: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

$color

$color

Fallback в SASSSASS

: null;

: green !default;

button {

background: $color;

}

CSS

01.

02.

03.

04.

05.

06.

Page 59: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

null

Fallback в SASSSASS

$color: ;

$color: green !default;

button {

background: $color;

}

CSS

01.

02.

03.

04.

05.

06.

Page 60: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

!default

Fallback в SASSSASS

$color: null;

$color: green ;

button {

background: $color;

}

CSS

01.

02.

03.

04.

05.

06.

Page 61: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

green green

Fallback в SASSSASS

$color: null;

$color: !default;

button {

background: $color;

}

CSS

button {

background: ;

}

01.

02.

03.

04.

05.

06.

01.

02.

03.

Page 62: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

red

red

Fallback в SASSSASS

$color: ;

$color: green !default;

button {

background: $color;

}

CSS

button {

background: ;

}

01.

02.

03.

04.

05.

06.

01.

02.

03.

Page 63: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

I18n

Page 64: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

“aнглийскиедвойные”

Page 65: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

«французскиеёлочки»

Page 66: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

I18nHTML

<html lang="ru">

<body>

<q>Чебурашка</q>

</body>

</html>

CSS

01.

02.

03.

04.

05.

Page 67: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

lang

I18nHTML

<html ="ru">

<body>

<q>Чебурашка</q>

</body>

</html>

CSS

01.

02.

03.

04.

05.

Page 68: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

« »

“ ”

I18nHTML

<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.

Page 69: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

ru

« »

« »

I18nHTML

<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.

Page 70: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

en

“ ”

“ ”

I18nHTML

<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.

Page 71: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Вычисляемыезначения

Page 72: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Вычисляемые значенияCSS

:root {

--line-height: 1.5;

}

p {

margin-bottom:

var(--line-height)rem;

}

CSS глазами браузера

01.

02.

03.

04.

05.

06.

07.

08.

Page 73: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

margin-bottom

Вычисляемые значенияCSS

:root {

--line-height: 1.5;

}

p {

:

var(--line-height)rem;

}

CSS глазами браузера

01.

02.

03.

04.

05.

06.

07.

08.

Page 74: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

--line-height: 1.5;

Вычисляемые значенияCSS

:root {

}

p {

margin-bottom:

var(--line-height)rem;

}

CSS глазами браузера

01.

02.

03.

04.

05.

06.

07.

08.

Page 75: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

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.

Page 76: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Вычисляемые значенияCSS

:root {

--line-height: 1.5;

}

p {

margin-bottom:

calc(var(--line-height) *

1rem);

}

CSS глазами браузера

01.

02.

03.

04.

05.

06.

07.

08.

09.

Page 77: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

var(--line-height)

Вычисляемые значенияCSS

:root {

--line-height: 1.5;

}

p {

margin-bottom:

calc( *

1rem);

}

CSS глазами браузера

01.

02.

03.

04.

05.

06.

07.

08.

09.

Page 78: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

1rem

Вычисляемые значенияCSS

:root {

--line-height: 1.5;

}

p {

margin-bottom:

calc(var(--line-height) *

);

}

CSS глазами браузера

01.

02.

03.

04.

05.

06.

07.

08.

09.

Page 79: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

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.

Page 80: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Цветовые схемы и SVG

Page 81: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Цветовые схемы и SVGSVG

<svg height="100" width="100">

<circle cx="50" cy="50"

r="50"

fill="red" />

</svg>

01.

02.

03.

04.

05.

Page 82: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

red

Цветовые схемы и SVGSVG

<svg height="100" width="100">

<circle cx="50" cy="50"

r="50"

fill=" " />

</svg>

01.

02.

03.

04.

05.

Page 83: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

--main-color

--main-color

Цветовые схемы и SVGSVG

<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.

Page 84: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

green

Цветовые схемы и SVGSVG

<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.

Page 85: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

--main-color-custom

Цветовые схемы и SVGSVG

<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.

Page 86: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

red red

Цветовые схемы и SVGSVG глазами браузера

<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.

Page 87: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

JavaScript

Page 88: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

API CSSVariablesMapel.style.var.get('variable');

el.style.var.has('variable');

el.style.var.set('variable', 'value');

el.style.var.delete('variable');

01.

02.

03.

04.

Page 89: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

get

has

set

delete

API CSSVariablesMapel.style.var. ('variable');

el.style.var. ('variable');

el.style.var. ('variable', 'value');

el.style.var. ('variable');

01.

02.

03.

04.

Page 90: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

API CSSVariablesMapel.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.

Page 91: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

getPropertyValue

setProperty

removeProperty

API CSSStyleDeclarationgetComputedStyle(document.documentElement). ('--variable');

element.style. ('--variable', 'value');

element.style. ('--variable');

01.

02.

03.

Page 92: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

'var(--anotherVariable, "fallback")

API CSSStyleDeclarationgetComputedStyle(document.documentElement).getPropertyValue('--variable');

element.style.setProperty('--variable', 'value');

element.style.removeProperty('--variable');

И даже так:

element.style.setProperty('--variable', ');

01.

02.

03.

Page 93: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Проверкаподдержки

Page 94: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Проверка поддержки в CSSCSS

@supports (--a: 0) {

/* стили с поддержкой переменных */

}

@supports not (--a: 0) {

/* стили без поддержки переменных */

}

01.

02.

03.

04.

05.

06.

07.

Page 95: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

@supports (--a: 0) {

}

Проверка поддержки в CSSCSS

/* стили с поддержкой переменных */

@supports not (--a: 0) {

/* стили без поддержки переменных */

}

01.

02.

03.

04.

05.

06.

07.

Page 96: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

@supports not (--a: 0) {

}

Проверка поддержки в CSSCSS

@supports (--a: 0) {

/* стили с поддержкой переменных */

}

/* стили без поддержки переменных */

01.

02.

03.

04.

05.

06.

07.

Page 97: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Проверка поддержки в CSSCSS

@supports (--a: 0) {

/* стили с поддержкой переменных */

}

@supports not (--a: 0) {

/* стили без поддержки переменных */

}

Не работает в IE!

01.

02.

03.

04.

05.

06.

07.

Page 98: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Проверка поддержки в JSCSS

if (window.CSS && window.CSS.supports && window.CSS.supports('--a', 0)) {

// сценарии с поддержкой переменных

} else {

// сценарии бех поддержки переменных

}

01.

02.

03.

04.

05.

Page 99: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Ограничения переменных CSS• нельзя использовать в:

• в именах обычных свойств CSS: var(--side): 10px ;

• в значениях медиа-запросов: @media screen and (min-width: var(--desktop-

breakpoint) { } ;

• в подстановке URL: url(var(--image-url)) ;

• будьте осторожны с вычислениями calc() :

• со сложными вычислениями в принципе;

• в Chrome с умножением/делением дробных значений;

• в Firefox с вычислениями внутри функций rgba() .

• нельзя одномоментно cбрасывать значения всех переменных: --: initial .

Page 100: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Таб Аткинс Работает над:

• CSS Nesting Module Level 3

• CSS @apply Rule

• CSS When/Else Rules

Page 101: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

@mixin @apply

Page 102: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

@applyCSS

:root {

--clearfix: {

display: table;

clear: both;

content: '';

}

}

CSS глазами браузера

01.

02.

03.

04.

05.

06.

07.

Page 103: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

:root {

}

@applyCSS

--clearfix: {

display: table;

clear: both;

content: '';

}

CSS глазами браузера

01.

02.

03.

04.

05.

06.

07.

Page 104: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

--clearfix

@applyCSS

:root {

: {

display: table;

clear: both;

content: '';

}

}

CSS глазами браузера

01.

02.

03.

04.

05.

06.

07.

Page 105: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

display: table;

clear: both;

content: '';

@applyCSS

:root {

--clearfix: {

}

}

CSS глазами браузера

01.

02.

03.

04.

05.

06.

07.

Page 106: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

@apply --clearfix;

display: table;

clear: both;

content: '';

@applyCSS

: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.

Page 108: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

@custom-selector

Page 109: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

@custom-selectorCSS

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.

Page 110: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

@custom-selector

@custom-selectorCSS

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.

Page 111: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

:--heading

@custom-selectorCSS

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.

Page 112: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

expansion: h1, h2, h3,

h4, h5, h6;

@custom-selectorCSS

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.

Page 113: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

:--heading

@custom-selectorCSS

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.

Page 114: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

@custom-selectorCSS

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.

Page 115: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Подытоживая• Новые способы решения старых задач.

• Решение невозможных для препроцессоров задач.

• Расширение компонентов через наследование.

• Широкая поддержка в браузерах.

• Простой нативный способ взаимодействия с JS, SVG и т.п.

• Начало конца эры препроцессоров :-P

Page 116: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Спасибо за внимание! Вопросы? Павел Ловцевич

CTO @ LOVATA

@zigzag_mcquack

[email protected]

Page 117: Пользовательские свойства как основа архитектуры CSS / Павел Ловцевич (LOVATA)

Не забудьте проголосовать!

http://bit.ly/css-var-edge