Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Пользовательские свойства как основа архитектуры CSS (FrontTalks)

Пользовательские свойства как основа архитектуры CSS (FrontTalks)

Распространившаяся имплементация пользовательских свойств CSS в большинство популярных браузеров открыла такой простор для творчества и экспериментов над архитектурой CSS-кода, какого раньше не было.

Всесильны ли препроцессоры?
Можно ли дать CSS второй шанс?
Наследуемость или БЭМ?
А что с обратной совместимостью? Решение есть!

В докладе будет рассмотрены наиболее важные аспекты спецификации CSS Custom Properties for Cascading Variables Module Level 1. На практических примерах будут детально разобраны нюансы использования пользовательских свойств, также будет затронут вопрос обратной совместимости с браузерами, не имеющими поддержку данной технологии.

Pavel Lautsevich

September 17, 2016
Tweet

More Decks by Pavel Lautsevich

Other Decks in Programming

Transcript

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

    Менезес, Variables: The Backbone Of CSS Architecture — Модульность. — Уменьшение повторяемости. — Сокращение объема. — Повышение читаемости. — Стайлгайд. “
  2. Переменные. Когда и какие? Условие — Значение встречается в коде

    два и более раз. — Значение в будущем может изменяться. Тип — Измерения (размеры, отступы, радиусы скругления и т.п.). — Цветовые схемы. — Типографика. — Наборы иконок. — Брейкпойнты.
  3. Scope selector { --variable: value; } Псевдокласс: selector:pseudo-class { --variable:

    value; } Медиа-запрос: @media selector { --variable: value; } 01. 02. 03. 01. 02. 03. 01. 02. 03.
  4. $foo Если бы мы использовали символ "$" для переменных, то

    не смогли бы его использовать для будущих новых более мощных сущностей, подобных на переменные. Таб Аткинс, Let's Talk about CSS Variables Кроме того: — совместимость с препроцессорами; — нативные "грамматика и пунктуация" CSS. “
  5. 1rem 2rem @media :root { --gutter: ; } .сontainer {

    margin: var(--gutter); } @media (min-width: 1200px) { :root { --gutter: ; } } 01. 02. 03. 04. 05. 06. 07. 08. 09.
  6. @media (SASS) $gutter: 1rem; .сontainer { margin: $gutter; } @media

    (min-width: 1200px) { $gutter: 2rem; } 01. 02. 03. 04. 05. 06. 07. 08. 09.
  7. @media (min-width: 1200px) { $gutter: 2rem; } @media (SASS) $gutter:

    1rem; .сontainer { margin: $gutter; } 01. 02. 03. 04. 05. 06. 07. 08. 09.
  8. Inheritance :root { --color: black; } button { background: var(--color);

    } .black-box { --color: white; } 01. 02. 03. 04. 05. 06. 07. 08. 09.
  9. SOLID O Программные сущности (классы, модули, функции и т.д.) должны

    быть открыты для расширения, но закрыты для изменения. Бертран Мейер “
  10. SOLID O Плохо .button { background: black; } .black-box .button

    { background: white; } Хорошо .button { background: var(--color, black); } .black-box { --color: white; } 01. 02. 03. 04. 05. 06. 07. 01. 02. 03. 04. 05. 06. 07.
  11. .black-box .button background: white; } SOLID O Плохо .button {

    background: black; } { Хорошо .button { background: var(--color, black); } .black-box { --color: white; } 01. 02. 03. 04. 05. 06. 07. 01. 02. 03. 04. 05. 06. 07.
  12. .button SOLID O Плохо .button { background: black; } .black-box

    .button { background: white; } Хорошо { background: var(--color, black); } .black-box { --color: white; } 01. 02. 03. 04. 05. 06. 07. 01. 02. 03. 04. 05. 06. 07.
  13. --color SOLID O Плохо .button { background: black; } .black-box

    .button { background: white; } Хорошо .button { background: var( , black); } .black-box { --color: white; } 01. 02. 03. 04. 05. 06. 07. 01. 02. 03. 04. 05. 06. 07.
  14. --color: white SOLID O Плохо .button { background: black; }

    .black-box .button { background: white; } Хорошо .button { background: var(--color, black); } .black-box { ; } 01. 02. 03. 04. 05. 06. 07. 01. 02. 03. 04. 05. 06. 07.
  15. background: var(--color, black); SOLID O Плохо .button { background: black;

    } .black-box .button { background: white; } Хорошо .button { } .black-box { --color: white; } 01. 02. 03. 04. 05. 06. 07. 01. 02. 03. 04. 05. 06. 07.
  16. --color-default: black; var(--color-default) Fallback :root { --color:; } .button {

    background: var(--color, ); } 01. 02. 03. 04. 05. 06. 07. 08.
  17. :; Fallback :root { --color --color-default: black; } .button {

    background: var(--color, var(--color-default)); } 01. 02. 03. 04. 05. 06. 07. 08.
  18. Fallback :root { --color: ; --color-default: black; } .button {

    background: var(--color, var(--color-default)); } 01. 02. 03. 04. 05. 06. 07. 08.
  19. initial Fallback :root { --color: ; --color-default: black; } .button

    { background: var(--color, var(--color-default)); } 01. 02. 03. 04. 05. 06. 07. 08.
  20. var(--color-custom, black) Fallback :root { --color: ; --color-custom: initial; }

    .button { background: var(--color); } 01. 02. 03. 04. 05. 06. 07. 08.
  21. « » I18n :root:lang(en) { --quotes-l: "“"; --quotes-r: "”"; }

    q { quotes: var(--quotes-l, " ") var(--quotes-r, " "); } 01. 02. 03. 04. 05. 06. 07.
  22. “ ” I18n :root:lang(en) { --quotes-l: " "; --quotes-r: "

    "; } q { quotes: var(--quotes-l, "«") var(--quotes-r, "»"); } 01. 02. 03. 04. 05. 06. 07.
  23. --line-height: 1.5; calc() :root { --paragraph-margin: calc(var(--line-height) * 2); }

    p { margin-bottom: calc(var(--paragraph-margin, 0) * 1px); } 01. 02. 03. 04. 05. 06. 07. 08.
  24. --paragraph-margin: calc(var(--line-height) * 2); calc() :root { --line-height: 1.5; }

    p { margin-bottom: calc(var(--paragraph-margin, 0) * 1px); } 01. 02. 03. 04. 05. 06. 07. 08.
  25. calc(var(--paragraph-margin, 0) * 1px); calc() :root { --line-height: 1.5; --paragraph-margin:

    calc(var(--line-height) * 2); } p { margin-bottom: } 01. 02. 03. 04. 05. 06. 07. 08.
  26. --color: black; var(--color) <SVG> <svg height="100" width="100"> <style> :root {

    } </style> <circle cx="50" cy="50" r="50" fill=" " /> </svg> 01. 02. 03. 04. 05. 06. 07. 08.
  27. --color: black; var(--color) <SVG> CSS :root { } SVG <svg

    height="100" width="100"> <circle cx="50" cy="50" r="50" fill=" " /> </svg> 01. 02. 03. 01. 02. 03.
  28. CSS.supports if (window.CSS && window.CSS.supports && window.CSS.supports('--a', 0)) { //

    сценарии с поддержкой переменных } else { // сценарии без поддержки переменных } 01. 02. 03. 04. 05. 06.