0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Вы знаете, что можно динамически менять цветовое оформление страницы без JavaScript или CSS-препроцессоров? Это возможно благодаря магии кастомных свойств CSS, цветовой модели HSL и функции calc(). Они работают с любым фреймворком и веб-технологией без лишних телодвижений. Да здравствует CSS!</p>
1
<p>Вы знаете, что можно динамически менять цветовое оформление страницы без JavaScript или CSS-препроцессоров? Это возможно благодаря магии кастомных свойств CSS, цветовой модели HSL и функции calc(). Они работают с любым фреймворком и веб-технологией без лишних телодвижений. Да здравствует CSS!</p>
2
<p>В демо на CodePen можно выбрать основной и дополнительный цвета и создать завершённую систему. Это реализовано на ванильном CSS. JavaScript здесь используется только для динамического изменения цветов.</p>
2
<p>В демо на CodePen можно выбрать основной и дополнительный цвета и создать завершённую систему. Это реализовано на ванильном CSS. JavaScript здесь используется только для динамического изменения цветов.</p>
3
<h2>Содержание</h2>
3
<h2>Содержание</h2>
4
<ul><li><a>Что нам дают CSS-препроцессоры</a></li>
4
<ul><li><a>Что нам дают CSS-препроцессоры</a></li>
5
<li><a>Настраиваем окружение</a></li>
5
<li><a>Настраиваем окружение</a></li>
6
<li><a>Корректируем значения с помощью HSL</a></li>
6
<li><a>Корректируем значения с помощью HSL</a></li>
7
<li><a>Получаем комплементарные цвета и триадические сочетания</a></li>
7
<li><a>Получаем комплементарные цвета и триадические сочетания</a></li>
8
<li><a>Воспроизводим mix()</a></li>
8
<li><a>Воспроизводим mix()</a></li>
9
<li><a>Создаём функцию color-contrast()</a></li>
9
<li><a>Создаём функцию color-contrast()</a></li>
10
<li><a>Заключение</a></li>
10
<li><a>Заключение</a></li>
11
</ul><h2>Что нам дают CSS-препроцессоры</h2>
11
</ul><h2>Что нам дают CSS-препроцессоры</h2>
12
<p>Когда заходит речь о системах цветов, на ум приходят<a>несколько полезных функций Sass</a>. Вот наиболее распространённые:</p>
12
<p>Когда заходит речь о системах цветов, на ум приходят<a>несколько полезных функций Sass</a>. Вот наиболее распространённые:</p>
13
<ul><li>lighten, darken();</li>
13
<ul><li>lighten, darken();</li>
14
<li>complement();</li>
14
<li>complement();</li>
15
<li>hue();</li>
15
<li>hue();</li>
16
<li>mix();</li>
16
<li>mix();</li>
17
<li>contrast-color().</li>
17
<li>contrast-color().</li>
18
</ul><p>Некоторые из этих трансформаций можно воссоздать с помощью CSS-фильтров. Например, lighten и darken - это всего лишь значение lightness из HSL. Трансформация hue - это H из HSL. Дополнительные цвета можно рассчитывать с помощью инверсии hue, для этого достаточно прибавить к или отнять 180 от соответствующего значения. Это переносит значение hue на противоположную сторону цветового круга. Функция calc() и кастомные свойства позволяют трансформировать цвета с помощью одного значения.</p>
18
</ul><p>Некоторые из этих трансформаций можно воссоздать с помощью CSS-фильтров. Например, lighten и darken - это всего лишь значение lightness из HSL. Трансформация hue - это H из HSL. Дополнительные цвета можно рассчитывать с помощью инверсии hue, для этого достаточно прибавить к или отнять 180 от соответствующего значения. Это переносит значение hue на противоположную сторону цветового круга. Функция calc() и кастомные свойства позволяют трансформировать цвета с помощью одного значения.</p>
19
<p>Ниже рассказывается, как с помощью кастомных свойств CSS и функции calc() воссоздавать lighten() darken(), comlement() и даже триадические сочетания. Также вы узнаете лайфхак, который позволяет делать крутые штуки с color-contrast(). Эти возможности реализованы во всех современных браузерах. Но для Internet Explorer 11 и ниже придётся использовать препроцессор.</p>
19
<p>Ниже рассказывается, как с помощью кастомных свойств CSS и функции calc() воссоздавать lighten() darken(), comlement() и даже триадические сочетания. Также вы узнаете лайфхак, который позволяет делать крутые штуки с color-contrast(). Эти возможности реализованы во всех современных браузерах. Но для Internet Explorer 11 и ниже придётся использовать препроцессор.</p>
20
<h2>Настраиваем окружение</h2>
20
<h2>Настраиваем окружение</h2>
21
<p>В первую очередь нужно разложить цвета на значения hue, saturation и lightness (тон, насыщенность и светлота) цветовой модели HSL. Можно также использовать значение альфа - прозрачность. Например, переменная для цвета red выглядит так:</p>
21
<p>В первую очередь нужно разложить цвета на значения hue, saturation и lightness (тон, насыщенность и светлота) цветовой модели HSL. Можно также использовать значение альфа - прозрачность. Например, переменная для цвета red выглядит так:</p>
22
<p>Объявляем пользовательские свойства со значениями HSL.</p>
22
<p>Объявляем пользовательские свойства со значениями HSL.</p>
23
<h2>Корректируем значения с помощью HSL</h2>
23
<h2>Корректируем значения с помощью HSL</h2>
24
<p>Теперь значения из примера выше можно использовать для корректирования цветов. Начать стоит с воссоздания функций lighten и darken.</p>
24
<p>Теперь значения из примера выше можно использовать для корректирования цветов. Начать стоит с воссоздания функций lighten и darken.</p>
25
<p>Определим, на сколько светлее или темнее должен стать цвет. Эти значения сохраним в дополнительных кастомных свойствах.</p>
25
<p>Определим, на сколько светлее или темнее должен стать цвет. Эти значения сохраним в дополнительных кастомных свойствах.</p>
26
<p>После определения трансформаций можно записать новые значения. Показатель lightness можно вычислить так.</p>
26
<p>После определения трансформаций можно записать новые значения. Показатель lightness можно вычислить так.</p>
27
<p>Всё вместе выглядит так.</p>
27
<p>Всё вместе выглядит так.</p>
28
<p>Код может показаться сложным. Но здесь только используются базовые значения hue и saturation и уточняется значение lightness.</p>
28
<p>Код может показаться сложным. Но здесь только используются базовые значения hue и saturation и уточняется значение lightness.</p>
29
<blockquote><p><strong>Читайте также:<a>7 необычных приёмов и инструментов HTML и CSS</a></strong></p>
29
<blockquote><p><strong>Читайте также:<a>7 необычных приёмов и инструментов HTML и CSS</a></strong></p>
30
</blockquote><p>Чтобы реализовать функцию darken, можно вычесть значение lightness или прибавить его, если вам нужны отрицательные значения.</p>
30
</blockquote><p>Чтобы реализовать функцию darken, можно вычесть значение lightness или прибавить его, если вам нужны отрицательные значения.</p>
31
<h2>Получаем комплементарные цвета и триадические сочетания</h2>
31
<h2>Получаем комплементарные цвета и триадические сочетания</h2>
32
<p><em>Цветовой круг HSL</em></p>
32
<p><em>Цветовой круг HSL</em></p>
33
<p>Чтобы получать комплиментарные или триадические оттенки, нужно уточнять значение hue базового цвета. Можно создать отдельные переменные или использовать шорткаты и помнить, что цветовой круг HSL изменяется по часовой стрелке от нуля до 360 градусов (см. иллюстрацию выше). То есть чтобы получить комплементарный оттенок, необходимо отнять или прибавить к значению 180 градусов.</p>
33
<p>Чтобы получать комплиментарные или триадические оттенки, нужно уточнять значение hue базового цвета. Можно создать отдельные переменные или использовать шорткаты и помнить, что цветовой круг HSL изменяется по часовой стрелке от нуля до 360 градусов (см. иллюстрацию выше). То есть чтобы получить комплементарный оттенок, необходимо отнять или прибавить к значению 180 градусов.</p>
34
<p><em>Получаем комплементарный оттенок</em></p>
34
<p><em>Получаем комплементарный оттенок</em></p>
35
<p>Чтобы получить триадическое сочетание, нужно разделить цветовой круг на три части. То есть оттенки можно получить, добавив к базовому значению 120 и 240 соответственно.</p>
35
<p>Чтобы получить триадическое сочетание, нужно разделить цветовой круг на три части. То есть оттенки можно получить, добавив к базовому значению 120 и 240 соответственно.</p>
36
<p><em>Триадические сочетания</em></p>
36
<p><em>Триадические сочетания</em></p>
37
<h2>Воспроизводим mix()</h2>
37
<h2>Воспроизводим mix()</h2>
38
<p>Режим смешивания mix() более сложный по сравнению с lighten() и darken(). Но его можно воспроизвести с помощью HSL-вычислений.</p>
38
<p>Режим смешивания mix() более сложный по сравнению с lighten() и darken(). Но его можно воспроизвести с помощью HSL-вычислений.</p>
39
<p>Чтобы смешать цвета, надо определить их.</p>
39
<p>Чтобы смешать цвета, надо определить их.</p>
40
<p>Затем надо получить средние значения.</p>
40
<p>Затем надо получить средние значения.</p>
41
<p>Теперь можно получить смешанный цвет.</p>
41
<p>Теперь можно получить смешанный цвет.</p>
42
<h2>Создаём функцию color-contrast()</h2>
42
<h2>Создаём функцию color-contrast()</h2>
43
<p>Ещё одна ключевая возможность CSS-препроцессоров - использование логических значений. Они позволяют вычислять доступные цвета с помощью функции color-contrast().</p>
43
<p>Ещё одна ключевая возможность CSS-препроцессоров - использование логических значений. Они позволяют вычислять доступные цвета с помощью функции color-contrast().</p>
44
<p>Эта функция принимает серию значений: базовый цвет, который выступает в качестве контрастного, значения light и dark. Функция возвращает самый контрастный цвет по отношению к базовому. Это невозможно воспроизвести на чистом CSS, поэтому понадобятся дополнительные хаки.</p>
44
<p>Эта функция принимает серию значений: базовый цвет, который выступает в качестве контрастного, значения light и dark. Функция возвращает самый контрастный цвет по отношению к базовому. Это невозможно воспроизвести на чистом CSS, поэтому понадобятся дополнительные хаки.</p>
45
<p><em>Наглядная демонстрация возможностей системы цветов</em></p>
45
<p><em>Наглядная демонстрация возможностей системы цветов</em></p>
46
<p>Сначала определяем порог контрастности.</p>
46
<p>Сначала определяем порог контрастности.</p>
47
<p>Затем проверяем, не превышает ли значение lightness порог контрастности. Для этого используем<a>демонстрационную версию</a>системы цветов. Если порог выше яркости основного цвета, возвращается значение light, так как мы умножаем значение lightness на - 100. Например, значение lightness составляет 40, а contrastThreshhold 60. Разница равна - 20. Умножаем это значение на - 100 и получаем 2000. Это белый цвет, так как при значении lightness 100 и выше всегда получается белый.</p>
47
<p>Затем проверяем, не превышает ли значение lightness порог контрастности. Для этого используем<a>демонстрационную версию</a>системы цветов. Если порог выше яркости основного цвета, возвращается значение light, так как мы умножаем значение lightness на - 100. Например, значение lightness составляет 40, а contrastThreshhold 60. Разница равна - 20. Умножаем это значение на - 100 и получаем 2000. Это белый цвет, так как при значении lightness 100 и выше всегда получается белый.</p>
48
<p>Когда значение lightness выше contrastThreshhold, получаем обратную ситуацию. Если lightness 90, а contrastThreshold 60, разница составляет 30. Умножаем это значение на - 100 и получаем -3000. Это чёрный цвет, так как lightness ниже нуля.</p>
48
<p>Когда значение lightness выше contrastThreshhold, получаем обратную ситуацию. Если lightness 90, а contrastThreshold 60, разница составляет 30. Умножаем это значение на - 100 и получаем -3000. Это чёрный цвет, так как lightness ниже нуля.</p>
49
<p>Возвращаем lightness как L в HSL. Это выглядит так.</p>
49
<p>Возвращаем lightness как L в HSL. Это выглядит так.</p>
50
<p>Поскольку HSL - это то, как компьютер, а не пользователь понимает lightness, этот инструмент не идеальный. То есть у кастомных свойств и функции calc() есть недостатки, как у любого другого инструмента.</p>
50
<p>Поскольку HSL - это то, как компьютер, а не пользователь понимает lightness, этот инструмент не идеальный. То есть у кастомных свойств и функции calc() есть недостатки, как у любого другого инструмента.</p>
51
<h2>Заключение</h2>
51
<h2>Заключение</h2>
52
<p>В статье рассмотрели удобные способы работы с кастомными свойствами и функцией calc(). Если у вас есть вопросы или дополнения, пишите их в комментариях.</p>
52
<p>В статье рассмотрели удобные способы работы с кастомными свойствами и функцией calc(). Если у вас есть вопросы или дополнения, пишите их в комментариях.</p>
53
<p><em>Адаптированный перевод статьи<a>Calculating Color: Dynamic Color Theming with Pure CSS</a>by Una Kravets.</em></p>
53
<p><em>Адаптированный перевод статьи<a>Calculating Color: Dynamic Color Theming with Pure CSS</a>by Una Kravets.</em></p>