HTML Diff
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>&lt;= 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>&lt;= 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>&lt;= 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>&lt;= 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>&lt;= 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>&lt;= 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>