0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>При вёрстке веб-страницы важно сделать так, чтобы пользователям было комфортно читать текст. Это необходимо учитывать, так как у людей может отличаться восприятие цвета. Если вы можете легко прочитать светло-серый текст на белом фоне, то, возможно, у вашего друга это вызовет затруднения.</p>
1
<p>При вёрстке веб-страницы важно сделать так, чтобы пользователям было комфортно читать текст. Это необходимо учитывать, так как у людей может отличаться восприятие цвета. Если вы можете легко прочитать светло-серый текст на белом фоне, то, возможно, у вашего друга это вызовет затруднения.</p>
2
<p>Для решения этой и других задач доступности веб-страницы существует стандарт Web Content Accessibility Guidelines (WCAG). В этой статье нас интересует раздел, посвящённый контрасту цвета. Полную версию стандарта можно прочитать на сайте организации<a>W3C</a>.</p>
2
<p>Для решения этой и других задач доступности веб-страницы существует стандарт Web Content Accessibility Guidelines (WCAG). В этой статье нас интересует раздел, посвящённый контрасту цвета. Полную версию стандарта можно прочитать на сайте организации<a>W3C</a>.</p>
3
<p>Какие же требования предъявляются к тексту с точки зрения стандарта WCAG?</p>
3
<p>Какие же требования предъявляются к тексту с точки зрения стандарта WCAG?</p>
4
<ul><li>Текст на странице или изображении должен иметь коэффициент контраста не менее 4.5 : 1. В идеале это значение должно быть не менее 7 : 1.</li>
4
<ul><li>Текст на странице или изображении должен иметь коэффициент контраста не менее 4.5 : 1. В идеале это значение должно быть не менее 7 : 1.</li>
5
<li>Для увеличенного текста коэффициент контраста должен иметь значение не менее 3 : 1. В идеале это значение должно быть не менее 4.5 : 1. Увеличенным считается текст размером в 18 пикселей, либо 14 пикселей с полужирным начертанием.</li>
5
<li>Для увеличенного текста коэффициент контраста должен иметь значение не менее 3 : 1. В идеале это значение должно быть не менее 4.5 : 1. Увеличенным считается текст размером в 18 пикселей, либо 14 пикселей с полужирным начертанием.</li>
6
</ul><p>Кажется, всё логично: чем больше контраст, тем лучше читается текст. Закрываем статью и идём пить кофе. Но как же проверить, каким контрастом обладает тот или иной текст относительно фона? И что обозначают цифры 4.5 : 1, 7 : 1 и так далее?</p>
6
</ul><p>Кажется, всё логично: чем больше контраст, тем лучше читается текст. Закрываем статью и идём пить кофе. Но как же проверить, каким контрастом обладает тот или иной текст относительно фона? И что обозначают цифры 4.5 : 1, 7 : 1 и так далее?</p>
7
<h2>Содержание</h2>
7
<h2>Содержание</h2>
8
<ul><li><a>Что такое коэффициент контраста</a></li>
8
<ul><li><a>Что такое коэффициент контраста</a></li>
9
<li><a>Что такое относительная яркость</a></li>
9
<li><a>Что такое относительная яркость</a></li>
10
<li><a>Пример вычисления коэффициент контраста</a></li>
10
<li><a>Пример вычисления коэффициент контраста</a></li>
11
<li><a>Как контролировать контраст с помощью SASS</a></li>
11
<li><a>Как контролировать контраст с помощью SASS</a></li>
12
<li><a>Резюме</a></li>
12
<li><a>Резюме</a></li>
13
<li><a>Дополнительные материалы</a></li>
13
<li><a>Дополнительные материалы</a></li>
14
</ul><h2>Что такое коэффициент контраста</h2>
14
</ul><h2>Что такое коэффициент контраста</h2>
15
<p>Коэффициент контраста, согласно стандарту WCAG, высчитывается по формуле:<strong>(L1 + 0,05) / (L2 + 0,05)</strong>, в которой:</p>
15
<p>Коэффициент контраста, согласно стандарту WCAG, высчитывается по формуле:<strong>(L1 + 0,05) / (L2 + 0,05)</strong>, в которой:</p>
16
<ul><li><strong>L1</strong>- относительная яркость самого светлого цвета.</li>
16
<ul><li><strong>L1</strong>- относительная яркость самого светлого цвета.</li>
17
<li><strong>L2</strong>- относительная яркость самого тёмного цвета.</li>
17
<li><strong>L2</strong>- относительная яркость самого тёмного цвета.</li>
18
</ul><p>Формула достаточно простая: берём два цвета, добавляем к ним константу, делим и смотрим на результат. Но как вы могли заметить, нужно взять не просто два цвета, а их относительную яркость.</p>
18
</ul><p>Формула достаточно простая: берём два цвета, добавляем к ним константу, делим и смотрим на результат. Но как вы могли заметить, нужно взять не просто два цвета, а их относительную яркость.</p>
19
<h2>Что такое относительная яркость</h2>
19
<h2>Что такое относительная яркость</h2>
20
<p>Относительной яркостью считается коэффициент от нуля до единицы, где 0 является чёрным цветом, а 1 белым цветом. Для получения этого значения используется следующая формула:<strong>L = 0,2126 * R + 0,7152 * G + 0,0722 * B</strong>. Самый сложный момент здесь - получение необходимых значений R (red), G (green), B (blue). Для этого нужно выполнить две операции над каждым из цветов:</p>
20
<p>Относительной яркостью считается коэффициент от нуля до единицы, где 0 является чёрным цветом, а 1 белым цветом. Для получения этого значения используется следующая формула:<strong>L = 0,2126 * R + 0,7152 * G + 0,0722 * B</strong>. Самый сложный момент здесь - получение необходимых значений R (red), G (green), B (blue). Для этого нужно выполнить две операции над каждым из цветов:</p>
21
<ul><li>R<em>sRGB</em>= R<em>8bit</em>/ 255</li>
21
<ul><li>R<em>sRGB</em>= R<em>8bit</em>/ 255</li>
22
<li>G<em>sRGB</em>= G<em>8bit</em>/ 255</li>
22
<li>G<em>sRGB</em>= G<em>8bit</em>/ 255</li>
23
<li>B<em>sRGB</em>= B<em>8bit</em>/ 255</li>
23
<li>B<em>sRGB</em>= B<em>8bit</em>/ 255</li>
24
</ul><p>После этого производятся следующие операции:</p>
24
</ul><p>После этого производятся следующие операции:</p>
25
<ul><li>Если R<em>sRGB</em><= 0,03928, то<strong>R</strong>= R<em>sRGB</em>/ 12,92. Иначе<strong>R</strong>= ((R<em>sRGB</em>+ 0,055) / 1,055) ^ 2,4.</li>
25
<ul><li>Если R<em>sRGB</em><= 0,03928, то<strong>R</strong>= R<em>sRGB</em>/ 12,92. Иначе<strong>R</strong>= ((R<em>sRGB</em>+ 0,055) / 1,055) ^ 2,4.</li>
26
<li>Если G<em>sRGB</em><= 0,03928, то<strong>G</strong>= G<em>sRGB</em>/ 12,92. Иначе<strong>G</strong>= ((G<em>sRGB</em>+ 0,055) / 1,055) ^ 2,4.</li>
26
<li>Если G<em>sRGB</em><= 0,03928, то<strong>G</strong>= G<em>sRGB</em>/ 12,92. Иначе<strong>G</strong>= ((G<em>sRGB</em>+ 0,055) / 1,055) ^ 2,4.</li>
27
<li>Если B<em>sRGB</em><= 0,03928, то<strong>B</strong>= B<em>sRGB</em>/ 12,92. Иначе<strong>B</strong>= ((B<em>sRGB</em>+ 0,055) / 1,055) ^ 2,4.</li>
27
<li>Если B<em>sRGB</em><= 0,03928, то<strong>B</strong>= B<em>sRGB</em>/ 12,92. Иначе<strong>B</strong>= ((B<em>sRGB</em>+ 0,055) / 1,055) ^ 2,4.</li>
28
</ul><h2>Пример вычисления коэффициент контраста</h2>
28
</ul><h2>Пример вычисления коэффициент контраста</h2>
29
<p>В качестве примера возьмём следующий блок:</p>
29
<p>В качестве примера возьмём следующий блок:</p>
30
<p>Блок имеет такие значимые стили:</p>
30
<p>Блок имеет такие значимые стили:</p>
31
<p>При использовании модели RGB достаточно легко получить значение каждого цвета. Для этого необходимо просто взять по 2 цифры из цвета. Первая пара является обозначением красного цвета, вторая пара обозначает зелёный цвет, а третья пара отвечает за голубой цвет. Фон блока можно определить следующим образом:</p>
31
<p>При использовании модели RGB достаточно легко получить значение каждого цвета. Для этого необходимо просто взять по 2 цифры из цвета. Первая пара является обозначением красного цвета, вторая пара обозначает зелёный цвет, а третья пара отвечает за голубой цвет. Фон блока можно определить следующим образом:</p>
32
<ul><li>R: 84</li>
32
<ul><li>R: 84</li>
33
<li>G: 51</li>
33
<li>G: 51</li>
34
<li>B: 43</li>
34
<li>B: 43</li>
35
</ul><p>Данные значения записаны в шестнадцатеричной системе. Их необходимо перевести в десятичную. Это можно сделать самостоятельно или с помощью онлайн сервисов. Например<a>Color Scheme</a>. В ней нас интересует цвет в системе<em>rgb()</em>.</p>
35
</ul><p>Данные значения записаны в шестнадцатеричной системе. Их необходимо перевести в десятичную. Это можно сделать самостоятельно или с помощью онлайн сервисов. Например<a>Color Scheme</a>. В ней нас интересует цвет в системе<em>rgb()</em>.</p>
36
<ul><li>R: 132</li>
36
<ul><li>R: 132</li>
37
<li>G: 81</li>
37
<li>G: 81</li>
38
<li>B: 67</li>
38
<li>B: 67</li>
39
</ul><p>Теперь можно получить относительную яркость фонового цвета.</p>
39
</ul><p>Теперь можно получить относительную яркость фонового цвета.</p>
40
<ul><li><p>R<em>sRGB</em>= 132 / 255 = 0.51</p>
40
<ul><li><p>R<em>sRGB</em>= 132 / 255 = 0.51</p>
41
</li>
41
</li>
42
<li><p>G<em>sRGB</em>= 81 / 255 = 0.31</p>
42
<li><p>G<em>sRGB</em>= 81 / 255 = 0.31</p>
43
</li>
43
</li>
44
<li><p>B<em>sRGB</em>= 67 / 255 = 0.26</p>
44
<li><p>B<em>sRGB</em>= 67 / 255 = 0.26</p>
45
</li>
45
</li>
46
<li><p><strong>R</strong>= ((0.51 + 0.055) / 1.055) ^ 2.4 = 0.2234</p>
46
<li><p><strong>R</strong>= ((0.51 + 0.055) / 1.055) ^ 2.4 = 0.2234</p>
47
</li>
47
</li>
48
<li><p><strong>G</strong>= ((0.31 + 0.055) / 1.055) ^ 2.4 = 0.0782</p>
48
<li><p><strong>G</strong>= ((0.31 + 0.055) / 1.055) ^ 2.4 = 0.0782</p>
49
</li>
49
</li>
50
<li><p><strong>B</strong>= ((0.26 + 0.055) / 1.055) ^ 2.4 = 0.0549</p>
50
<li><p><strong>B</strong>= ((0.26 + 0.055) / 1.055) ^ 2.4 = 0.0549</p>
51
</li>
51
</li>
52
</ul><p>Итоговое значение относительной яркости (<strong>L</strong>): 0.2126 * 0.2234 + 0.7152 * 0.0782 + 0.0722 * 0.0549 =<strong>0.1074</strong></p>
52
</ul><p>Итоговое значение относительной яркости (<strong>L</strong>): 0.2126 * 0.2234 + 0.7152 * 0.0782 + 0.0722 * 0.0549 =<strong>0.1074</strong></p>
53
<p>С помощью этих же формул можно вычислить относительную яркость цвета текста.</p>
53
<p>С помощью этих же формул можно вычислить относительную яркость цвета текста.</p>
54
<ul><li>R: 155</li>
54
<ul><li>R: 155</li>
55
<li>G: 179</li>
55
<li>G: 179</li>
56
<li>B: 165</li>
56
<li>B: 165</li>
57
</ul><p>Теперь можно получить относительную яркость текста.</p>
57
</ul><p>Теперь можно получить относительную яркость текста.</p>
58
<ul><li><p>R<em>sRGB</em>= 155 / 255 = 0.6078</p>
58
<ul><li><p>R<em>sRGB</em>= 155 / 255 = 0.6078</p>
59
</li>
59
</li>
60
<li><p>G<em>sRGB</em>= 179 / 255 = 0.7019</p>
60
<li><p>G<em>sRGB</em>= 179 / 255 = 0.7019</p>
61
</li>
61
</li>
62
<li><p>B<em>sRGB</em>= 165 / 255 = 0.6470</p>
62
<li><p>B<em>sRGB</em>= 165 / 255 = 0.6470</p>
63
</li>
63
</li>
64
<li><p><strong>R</strong>= ((0.6078 + 0.055) / 1.055) ^ 2.4 = 0.3277</p>
64
<li><p><strong>R</strong>= ((0.6078 + 0.055) / 1.055) ^ 2.4 = 0.3277</p>
65
</li>
65
</li>
66
<li><p><strong>G</strong>= ((0.7019 + 0.055) / 1.055) ^ 2.4 = 0.4506</p>
66
<li><p><strong>G</strong>= ((0.7019 + 0.055) / 1.055) ^ 2.4 = 0.4506</p>
67
</li>
67
</li>
68
<li><p><strong>B</strong>= ((0.6470 + 0.055) / 1.055) ^ 2.4 = 0.3761</p>
68
<li><p><strong>B</strong>= ((0.6470 + 0.055) / 1.055) ^ 2.4 = 0.3761</p>
69
</li>
69
</li>
70
</ul><p>Итоговое значение относительной яркости (<strong>L</strong>): 0.2126 * 0.3277 + 0.7152 * 0.4506 + 0.0722 * 0.3761 =<strong>0.4190</strong></p>
70
</ul><p>Итоговое значение относительной яркости (<strong>L</strong>): 0.2126 * 0.3277 + 0.7152 * 0.4506 + 0.0722 * 0.3761 =<strong>0.4190</strong></p>
71
<p>Используя полученные значения относительной яркости, можно вычислить коэффициент контраста. Как было указано ранее, коэффициент контраста вычисляется по формуле<strong>(L1 + 0,05) / (L2 + 0,05)</strong>, в которой:</p>
71
<p>Используя полученные значения относительной яркости, можно вычислить коэффициент контраста. Как было указано ранее, коэффициент контраста вычисляется по формуле<strong>(L1 + 0,05) / (L2 + 0,05)</strong>, в которой:</p>
72
<ul><li><strong>L1</strong>- относительная яркость самого светлого цвета.</li>
72
<ul><li><strong>L1</strong>- относительная яркость самого светлого цвета.</li>
73
<li><strong>L2</strong>- относительная яркость самого тёмного цвета.</li>
73
<li><strong>L2</strong>- относительная яркость самого тёмного цвета.</li>
74
</ul><p>Самым светлым будет считаться цвет, у которого относительная яркость выше. Подставим значения в формулу:</p>
74
</ul><p>Самым светлым будет считаться цвет, у которого относительная яркость выше. Подставим значения в формулу:</p>
75
<p><strong>Contrast Ratio</strong>= (0.4190 + 0.05) / (0.1074 + 0.05) =<strong>2.9</strong>. Также это значение может быть представлено так:<strong>2.9 : 1</strong>, как это было показано в начале статьи.</p>
75
<p><strong>Contrast Ratio</strong>= (0.4190 + 0.05) / (0.1074 + 0.05) =<strong>2.9</strong>. Также это значение может быть представлено так:<strong>2.9 : 1</strong>, как это было показано в начале статьи.</p>
76
<p>Данное значение не вписывается в рамки стандарта WCAG. Если хотите сделать сайт более доступным для ваших пользователей, используйте другое сочетания фона и текста.</p>
76
<p>Данное значение не вписывается в рамки стандарта WCAG. Если хотите сделать сайт более доступным для ваших пользователей, используйте другое сочетания фона и текста.</p>
77
<h2>Как контролировать контраст с помощью SASS</h2>
77
<h2>Как контролировать контраст с помощью SASS</h2>
78
<p>Естественно, производить подобные вычисления вручную нет необходимости. Это отнимает много времени, к тому же, в вычислениях легко допустить ошибку. Вместо этого можно написать функцию, используя любой современный препроцессор. В качестве примера используем препроцессор SASS и создадим функцию contrast-ratio().</p>
78
<p>Естественно, производить подобные вычисления вручную нет необходимости. Это отнимает много времени, к тому же, в вычислениях легко допустить ошибку. Вместо этого можно написать функцию, используя любой современный препроцессор. В качестве примера используем препроцессор SASS и создадим функцию contrast-ratio().</p>
79
<p>Функция contrast-ratio() принимает значения фонового и текстового цвета, после чего высчитывает относительную яркость каждого цвета и возвращает коэффициент контраста. На самом деле такой функции, как luminance(), в SASS не существует. Поэтому её тоже необходимо написать. Так как в функции возможна операция возведения в степень, необходимо подключить библиотеку, которая добавит необходимую операцию. В качестве такой библиотеки используем<a>sass-math-pow</a>.</p>
79
<p>Функция contrast-ratio() принимает значения фонового и текстового цвета, после чего высчитывает относительную яркость каждого цвета и возвращает коэффициент контраста. На самом деле такой функции, как luminance(), в SASS не существует. Поэтому её тоже необходимо написать. Так как в функции возможна операция возведения в степень, необходимо подключить библиотеку, которая добавит необходимую операцию. В качестве такой библиотеки используем<a>sass-math-pow</a>.</p>
80
<p>Теперь можно отслеживать коэффициент контраста непосредственно в SASS. Для этого используем директиву @warn и при недостаточном контрасте покажем сообщение. Оно выведется при следующей компиляции кода.</p>
80
<p>Теперь можно отслеживать коэффициент контраста непосредственно в SASS. Для этого используем директиву @warn и при недостаточном контрасте покажем сообщение. Оно выведется при следующей компиляции кода.</p>
81
<p>Во время компиляции SASS предупредит о недостаточном контрасте:</p>
81
<p>Во время компиляции SASS предупредит о недостаточном контрасте:</p>
82
<h2>Резюме</h2>
82
<h2>Резюме</h2>
83
<ul><li>У людей может отличаться цветовосприятие, это надо учитывать при вёрстке страниц</li>
83
<ul><li>У людей может отличаться цветовосприятие, это надо учитывать при вёрстке страниц</li>
84
<li>Для контроля доступности в вебе используется стандарт Web Content Accessibility Guidelines (WCAG)</li>
84
<li>Для контроля доступности в вебе используется стандарт Web Content Accessibility Guidelines (WCAG)</li>
85
<li>Контролировать контраст текста на странице можно с помощью SASS</li>
85
<li>Контролировать контраст текста на странице можно с помощью SASS</li>
86
</ul><h2>Дополнительные материалы</h2>
86
</ul><h2>Дополнительные материалы</h2>
87
<ul><li><a>Проверка контраста в Chrome DevTools</a></li>
87
<ul><li><a>Проверка контраста в Chrome DevTools</a></li>
88
</ul>
88
</ul>