
CSS-переменные позволяют задать цвета интерфейса в одном месте и переключать палитру без дублирования стилей компонентов. Для настройки цветовой темы сайта определите семантические роли цветов, объявите значения для светлого и тёмного режимов, а затем примените их к фону, тексту и элементам управления. Переключение удобно связать с атрибутом темы и системными настройками пользователя.
Опорные решения для цветовой системы на CSS-переменных
- Называйте переменные по назначению: например, цвет фона страницы задавайте через
--color-background, а не через название оттенка. - Храните базовую палитру отдельно от правил компонентов, чтобы менять тему централизованно.
- Для переключения используйте один атрибут на корневом элементе, например
data-theme. - Сохраняйте системный режим, если пользователь не выбрал тему вручную.
- Проверяйте контрастность текста и видимость состояний элементов в каждой теме.
Определите палитру и семантические роли цветов
Подход подходит для сайтов с несколькими цветовыми режимами, брендовыми темами или повторяющимися компонентами. Он особенно удобен, если нужно менять оформление целиком, не переписывая стили каждой кнопки и карточки. Если у проекта одна небольшая статичная страница и тема не будет меняться, отдельная система токенов может оказаться избыточной.
Сначала определите роли: фон страницы, поверхность карточек, основной текст, приглушённый текст, акцент, границы и состояния ошибок. Подберите для каждой роли значение в светлой и тёмной палитре. Это основа, на которой строится настройка цветовой темы сайта.
Объявите токены темы в :root
Понадобятся доступ к CSS-файлам проекта и возможность проверить страницу в браузере. Если тема уже подключена через сборщик или систему компонентов, выясните, где объявлены глобальные стили, и внесите изменения в существующее место, а не создавайте конкурирующий набор правил.
Объявите переменные для режима по умолчанию и переопределите их для альтернативного режима:
:root {
color-scheme: light;
--color-background: #ffffff;
--color-surface: #f3f4f6;
--color-text: #1f2937;
--color-muted: #596273;
--color-accent: #2457c5;
--color-border: #d1d5db;
}
:root[data-theme="dark"] {
color-scheme: dark;
--color-background: #151821;
--color-surface: #202431;
--color-text: #f3f4f6;
--color-muted: #b7bfce;
--color-accent: #9bb8ff;
--color-border: #3a4151;
}
Значения в примере служат отправной точкой: проверьте, подходят ли они вашему бренду и обеспечивают ли читаемость. Свойство color-scheme сообщает браузеру, какой режим используется для встроенных элементов, например полей ввода и полос прокрутки.
Подключите переменные к компонентам интерфейса
-
Замените прямые цвета в глобальных стилях.
Примените переменные к фону страницы и основному тексту, чтобы базовый режим темы работал повсеместно.body { background: var(--color-background); color: var(--color-text); } -
Настройте поверхности компонентов.
Карточки, меню и диалоговые окна обычно используют отдельный цвет поверхности и границы. Это помогает сохранить визуальную иерархию в обоих режимах..card { background: var(--color-surface); border: 1px solid var(--color-border); } -
Обновите акцентные элементы.
Примените акцентный токен к ссылкам и кнопкам, затем проверьте состояния наведения, фокуса и отключения. Если для состояния нужен отдельный цвет, добавьте соответствующую семантическую переменную. -
Удалите устаревшие значения постепенно.
Ищите в стилях жёстко заданные цвета и заменяйте их по смыслу, а не механически. После каждого крупного компонента проверяйте обе темы, чтобы не пропустить локальные переопределения.
Быстрый режим
- Определите роли цветов и значения для двух тем.
- Объявите переменные в
:rootи переопределите их для тёмного режима. - Подключите переменные к глобальным стилям и компонентам.
- Переключайте тему атрибутом и проверьте контрастность.
Такая схема подходит как для самостоятельной доработки, так и для обсуждения требований при заказе разработки интерфейса сайта. При выборе подрядчика для услуги веб-разработки заранее согласуйте, кто отвечает за палитру, переключение темы и тестирование доступности.
Переключайте тему через атрибуты и классы
Атрибут на корневом элементе связывает тему с CSS-переопределениями. Например, переключатель в приложении может установить document.documentElement.dataset.theme = "dark"; перед внедрением согласуйте это изменение с существующей логикой приложения.
Проверьте результат по списку:
- Светлая тема отображается при отсутствии атрибута или при явно выбранном светлом режиме.
- Значение
data-theme="dark"включает все переменные тёмной палитры. - Фон, текст, карточки, границы и ссылки меняются согласованно.
- Иконки и изображения остаются различимыми в обоих режимах.
- В фокусе клавиатуры виден индикатор, а не только изменение цвета фона.
- После переключения не остаются компоненты с жёстко заданными цветами.
- Переключатель темы сохраняет понятное название и доступное состояние.
Синхронизируйте тему с настройками операционной системы
Медиа-запрос prefers-color-scheme позволяет учитывать предпочтение системы, когда пользователь ещё не выбрал тему вручную. Распространённая ошибка - безусловно задавать атрибут при загрузке и тем самым игнорировать системное предпочтение. Также не следует менять тему при каждом обновлении страницы, если сохранён ручной выбор.
- Не применяйте системный режим поверх явно сохранённого выбора пользователя.
- Не дублируйте значения палитры в нескольких местах без необходимости.
- Проверьте порядок CSS-правил: позднее переопределение может перекрыть выбранную тему.
- Не полагайтесь только на цвет для обозначения ошибки или активного состояния.
- Учитывайте элементы браузера через
color-scheme, чтобы они не выбивались из оформления. - Проверьте поведение без JavaScript, если сайт должен сохранять базовую читаемость при его отключении.
Системное предпочтение можно задать через медиа-запрос, если атрибут темы не установлен:
@media (prefers-color-scheme: dark) {
:root:not([data-theme]) {
color-scheme: dark;
--color-background: #151821;
--color-surface: #202431;
--color-text: #f3f4f6;
--color-muted: #b7bfce;
--color-accent: #9bb8ff;
--color-border: #3a4151;
}
}
Если приложение устанавливает data-theme="light" или data-theme="dark", эти явные значения не затрагиваются правилом выше.
Проверьте контрастность и отладьте смену цветов
Если автоматическая смена темы не нужна, есть несколько уместных вариантов:
- Только светлая тема. Подходит небольшому сайту с постоянным оформлением; используйте семантические переменные, чтобы упростить будущие изменения.
- Только системный режим. Уместен, когда интерфейс должен следовать настройке устройства без отдельного переключателя.
- Ручное переключение. Выбирайте этот вариант, если пользователю важно управлять оформлением; сохраняйте его выбор и проверяйте приоритет над настройками системы.
После внесения изменений просмотрите страницы на разных размерах экрана, проверьте текст и интерактивные элементы в обеих темах, а также убедитесь, что фокус клавиатуры и состояния ошибок различимы. При проблемах начните с поиска CSS-правил, в которых остались фиксированные цвета или более специфичные селекторы.
Практические нюансы настройки цветовой темы
Чем CSS-переменные отличаются от переменных препроцессора?
CSS-переменные доступны браузеру во время работы страницы и могут переопределяться для отдельных тем. Переменные препроцессора обычно обрабатываются до передачи CSS браузеру.
Где лучше объявлять переменные темы?
Общие токены обычно объявляют в :root, а значения альтернативного режима задают отдельным селектором. Для компонента можно использовать локальное переопределение, если оно не нарушает общую систему.
Как сохранить выбранную пользователем тему?
Сохраните выбор доступным для приложения способом и применяйте атрибут темы при загрузке страницы. Если выбора ещё нет, можно учитывать prefers-color-scheme.
Нужно ли создавать отдельные переменные для состояний кнопки?
Создайте их, если состояния наведения, фокуса или отключения требуют отдельных цветов. Для доступности проверяйте не только оттенок, но и заметность состояния без опоры на цвет.
Почему часть страницы не меняет цвет?
В стилях компонента может оставаться жёстко заданный цвет или правило с более высокой специфичностью. Найдите такое правило в инструментах разработчика и замените значение на подходящую переменную.
Как убедиться, что текст читаем в обеих темах?
Проверьте сочетания текста и фона инструментом оценки контрастности, а затем протестируйте интерфейс с клавиатуры и в браузере. Особое внимание уделите приглушённому тексту, ссылкам и границам элементов управления.