Эта статья посвящена обзору моих наработок в Sass, которые облегчают жизнь при работе с цветами во время верстки. Мы рассмотрим 3 подхода, которые воедино принесут комфорт в работу с цветами.
Задача:
Быстрое изменение палитры цветов и их прозрачность(именно CSS var) для всего сайта , используя только HEX формат.
Решение:
Создание массива с нужными цветами. Далее, автоматическое создание переменных. И написание функции, которая изменяет прозрачность у CSS var.
В итоге, такая запись:
body{ color: cl(primary); background: cl(primary, 0.5); }
Будет эквивалентна такой (можно посмотреть живой пример на codepen):
:root { --color-pink: #E20071; --color-pink--rgb: 226, 0, 113; } body { color: var(--color-pink); background: rgba(var(--color-pink--rgb), 0.5); }
Но, при этом в управлении вы используете только HEX формат цвета. Конвертация происходит в автоматическом режиме. Никаких танцев с бубном. Смотрим:
Автоматическое создание CSS переменных
Почему лучше использовать CSS, а не Sass переменные, можно почитать на Хабре в этой статье.
Первое, создадим массив с нужными цветами.
$colors : ( "pink" : #E20071, "blue" : #00A3DA, "gray" : #939394, "white" : #FFFFFF, "black" : #1B1B1B, );
Далее, создадим CSS переменные, перебрав в цикле созданный выше массив $colors и запишем их в псевдокласс :root.
:root{ @each $key, $value in $colors { --color-#{$key} : #{$value}; } }
На выходе, получим это:
:root { --color-pink: #E20071; --color-blue: #00A3DA; --color-gray: #939394; --color-white: #FFFFFF; --color-black: #1B1B1B; }
Прозрачность цвета
Для использования прозрачности в Sass необходимо использовать цвет в RGB формате, но у нас только HEX. Чтобы это исправить, напишем простую функцию:
@function HexToRGB($hex) { @return red($hex), green($hex), blue($hex); }
Далее, запишем цвет в переменную:
:root { --color-pink-rgb: #{HexToRGB(#E20071)}; }
И воспользуемся функцией rgba, где первый параметр — нужный цвет, а второй — прозрачность. Значение прозрачности может находиться в диапазоне от 0 (полностью прозрачный) до 1 (полностью непрозрачный):
body{ background: rgba(var(--color-pink-rgb), 0.5); }
Сокращенная запись CSS переменной
Для ускоренного написания CSS переменной, напишем функцию cl (сокращение от слова color).
@function cl($name) { @return var(--color-#{unquote($name)}); }
Теперь запись:
body{ background: cl(pink); }
Равнозначна такой:
body{ background: var(--color-pink); }
Простая магия
Теперь покажу пример, как используя 3 этих подхода, можно управлять цветами (CSS переменными) так, используя массив как тему (потрогать на codepen):
body{ color: cl(primary); background: cl(primary, 0.5); }
Вот полный код
$colors_theme : ( "primary" : "pink", "secondary" : "blue" ); $colors : ( "pink" : #E20071, "blue" : #00A3DA, "gray" : #939394, "white" : #FFFFFF, "black" : #1B1B1B, ); @function HexToRGB($hex) { @return red($hex), green($hex), blue($hex); } @function cl($name, $opacity: false) { @if $opacity { @return rgba(var(--color-#{unquote($name)}--rgb), $opacity); } @else { @return var(--color-#{unquote($name)}); } } :root{ @if $colors { @if $colors_theme { @each $key, $value in $colors_theme { --color-#{$key} : var(--color-#{$value}); --color-#{$key}--rgb : var(--color-#{$value}--rgb); } } @each $key, $value in $colors { --color-#{$key} : #{$value}; --color-#{$key}--rgb : #{HexToRGB($value)}; } } }
Ну вот и все, в качестве вывода можно сказать, что благодаря подобным функциям упрощается и ускоряется работа с цветами.
Более того, с помощью данных функций, имея в качестве входного значения цвет только в HEX формате, можно легко изменить цветовую палитру сайта. И не прибегнуть к дополнительным кододвижениям.
Прошу строго не судить — это первая статья на Хабре.
