Цветовая доступность (color accessibility) является критическим аспектом веб-разработки, напрямую влияющим на удобство использования интерфейсов людьми с нарушениями зрения, включая дальтонизм, слабое зрение и возрастные изменения восприятия цвета. Preact, как лёгкий и высокопроизводительный фреймворк для создания интерфейсов на JavaScript, позволяет реализовывать динамические и интерактивные компоненты, при этом соблюдая требования доступности.
Контраст текста и фона — один из ключевых факторов доступности. Существует несколько стандартов, на которые ориентируются разработчики:
WCAG 2.1 (Web Content Accessibility Guidelines) рекомендует:
Контраст определяется как разница между яркостью и цветовым различием текста и фона. Использование низкоконтрастных сочетаний затрудняет чтение для пользователей с нарушениями зрения.
Цвет как единственный носитель информации — недопустимо. Сигналы, предупреждения или ошибки должны дублироваться текстом, иконками или формой элементов.
Preact использует JSX и виртуальный DOM, что позволяет динамически управлять стилями компонентов. Рассмотрим основные подходы:
Контраст можно вычислять на основе цветовых значений элементов. Для этого часто используют формулу относительной яркости:
function luminance(r, g, b) {
const a = [r, g, b].map(v => {
v /= 255;
return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
});
return 0.2126 * a[0] + 0.7152 * a[1] + 0.0722 * a[2];
}
function contrastRatio(rgb1, rgb2) {
const lum1 = luminance(...rgb1);
const lum2 = luminance(...rgb2);
return (Math.max(lum1, lum2) + 0.05) / (Math.min(lum1, lum2) + 0.05);
}
Эти функции позволяют вычислять коэффициент контрастности двух цветов, что полезно для динамического изменения темы интерфейса или проверки доступности пользовательских цветовых настроек.
Preact позволяет работать с CSS-переменными для реализации светлой и тёмной тем:
function App({ theme }) {
const style = {
'--bg-color': theme === 'dark' ? '#121212' : '#ffffff',
'--text-color': theme === 'dark' ? '#e0e0e0' : '#1a1a1a'
};
return (
<div style={style}>
<h1 style={{ color: 'var(--text-color)' }}>Пример текста</h1>
<button style={{ background: 'var(--text-color)', color: 'var(--bg-color)' }}>
Кнопка
</button>
</div>
);
}
Такой подход упрощает управление контрастностью и поддержание цветовой доступности при смене темы.
Для интерфейсных элементов важно:
:hover) и фокусе
(:focus).<label>), цветовая индикация ошибок должна
сопровождаться текстовым пояснением.alt или aria-label) для
пользователей экранных читалок.Пример доступной кнопки:
function AccessibleButton({ label, onClick }) {
return (
<button
onCl ick={onClick}
style={{ backgroundColor: '#007BFF', color: '#FFFFFF', padding: '0.5em 1em', border: 'none', borderRadius: '4px' }}
aria-label={label}
>
{label}
</button>
);
}
В Preact можно создавать утилиты для проверки контрастности на лету, особенно для динамически генерируемых цветов:
function ColorBox({ bgColor, textColor }) {
const contrast = contrastRatio(bgColor.match(/\d+/g).map(Number), textColor.match(/\d+/g).map(Number));
const warning = contrast < 4.5 ? 'Низкий контраст!' : 'Контраст достаточный';
return (
<div style={{ backgroundColor: bgColor, color: textColor, padding: '1em', margin: '1em 0' }}>
<p>{warning}</p>
</div>
);
}
Это позволяет визуально контролировать соответствие цветов стандартам WCAG.
Соблюдение этих принципов обеспечивает доступность интерфейсов на Preact, повышает удобство использования и делает приложения максимально инклюзивными.