CSS var в rgba или удобное использование цветов в Sass

от автора

Эта статья посвящена обзору моих наработок в Sass, которые облегчают жизнь при работе с цветами во время верстки. Мы рассмотрим 3 подхода, которые воедино принесут комфорт в работу с цветами.

В итоге, такая запись:

body{   color: color(primary);   background: color(primary, 0.5); }

Будет эквивалентна такой:

: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 переменной, напишем функцию color.

@function color($name) {   @return var(--color-#{unquote($name)}); }

Теперь запись:

body{   background: color(pink); }

Равнозначна такой:

body{   background: var(--color-pink); }

Простая магия

Теперь покажу пример, как используя 3 этих подхода, можно управлять цветами (CSS переменными) так, используя массив как тему:

body{   color: color(primary);   background: color(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 color($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 формате, можно легко изменить цветовую палитру сайта. И не прибегнуть к дополнительным кододвижениям.

Прошу строго не судить — это первая статья на Хабре.

ссылка на оригинал статьи https://habr.com/ru/post/533084/