Когда дело доходит до разработки пользовательских интерфейсов, цвет играет решающую роль в создании визуально привлекательного и доступного интерфейса. Одним из важных соображений при работе с цветами является обеспечение достаточного контраста между элементами переднего плана и фона, чтобы обеспечить удобочитаемость и доступность для всех пользователей, в том числе для людей с нарушениями зрения.
В этой статье мы рассмотрим, как использовать функцию getContrastYIQ() для динамического создания цветовых схем на основе цвета фона в проекте React. Мы также обсудим, как преобразовать шестнадцатеричные цвета в формат RGB с помощью функции hexToRgb(), которая используется функцией getContrastYIQ().
Что такое getContrastYIQ()
?
getContrastYIQ()
— это функция, которая принимает шестнадцатеричное значение цвета в качестве входных данных и возвращает значение «светлый» или «темный», в зависимости от воспринимаемой яркости цвета. Это определяется с помощью формулы, которая вычисляет значение YIQ (яркость) цвета, которое затем сравнивается с пороговым значением, чтобы определить, является ли цвет светлым или темным.
Вот код для getContrastYIQ()
:
export const getContrastYIQ = (hex: string): BackgroundTypes => { const rgb = hexToRgb(hex); const modifyRgb: Array<string> = rgb ? rgb .substring(4, rgb.length - 1) .replace(/ /g, '') .split(',') : []; const yiq: number = modifyRgb?.length ? (Number(modifyRgb[0]) * 299 + Number(modifyRgb[1]) * 587 + Number(modifyRgb[2]) * 114) / 1000 : 0; return yiq >= 128 ? BackgroundTypes.Light : BackgroundTypes.Dark; };
Функция сначала преобразует шестнадцатеричное значение цвета в формат RGB с помощью функции hexToRgb()
. Затем он вычисляет значение YIQ цвета, умножая значения красного, зеленого и синего на заранее определенные константы и суммируя результаты. Если значение YIQ больше или равно 128, функция возвращает «светлый», в противном случае — «темный».
BackgroundTypes
— это перечисление с двумя значениями: «Светлый» и «Темный», которые используются для обозначения воспринимаемой яркости цвета.
Преобразование шестнадцатеричных цветов в формат RGB
Как мы видели в предыдущем разделе, getContrastYIQ()
требует, чтобы входной цвет был в формате RGB. Однако в CSS и других веб-технологиях цвета часто указываются в шестнадцатеричном формате. Чтобы преобразовать шестнадцатеричный цвет в формат RGB, мы можем использовать функцию hexToRgb()
, которая принимает шестнадцатеричное значение цвета в качестве входных данных и возвращает значение цвета RGB в формате «rgb (R, G, B)».
Вот код для hexToRgb()
:
const hexToRgb = (hex: string): string | null => { const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); return result ? `rgb(${hexToInt(result, 1)}, ${hexToInt(result, 2)},${hexToInt(result, 3)})` : null; }; const hexToInt = (arr: RegExpExecArray, index: number): number => parseInt(arr[index], 16);
Применение цвета текста
Теперь мы можем использовать функцию getContrastYIQ
, чтобы определить подходящий цвет текста для нашего элемента. Если фон светлый, мы можем использовать темный цвет текста, а если фон темный, мы можем использовать светлый цвет текста.
Вот обновленный код для компонента Text
, который применяет цвет текста на основе цвета фона:
import { getContrastYIQ } from './colorUtils'; interface TextProps { text: string; backgroundColor: string; } const Text = ({ text, backgroundColor }: TextProps) => { const textColor = getContrastYIQ(backgroundColor) === BackgroundTypes.Light ? '#000' : '#fff'; return ( <div style={{ backgroundColor, color: textColor }}> {text} </div> ); };
В приведенном выше коде мы используем функцию getContrastYIQ
, чтобы определить, является ли цвет фона светлым или темным. Если фон светлый, мы устанавливаем переменную textColor
в черный цвет (#000
), а если фон темный, мы устанавливаем переменную textColor
в белый цвет (#fff
).
Затем мы применяем backgroundColor
и textColor
к реквизиту style
элемента div
.
Заключение
В этой статье мы узнали, как изменить цвет текста в зависимости от цвета фона в React. Мы начали с создания простого компонента Text
, который принимает пропсы text
и backgroundColor
. Затем мы реализовали функцию getContrastYIQ
, чтобы определить, является ли цвет фона светлым или темным. Наконец, мы применили цвет текста на основе цвета фона, используя функцию getContrastYIQ
.
Следуя этим шагам, вы можете создать более доступный пользовательский интерфейс, гарантируя, что ваш текст всегда будет удобочитаемым, независимо от цвета фона.