Журнал • знания • практикаПоиск по сайту

Сайты, дизайн и самостоятельная работа

Найти материал →

Как использовать Css-переменные для настройки цветовой темы интерфейса в веб-разработке

6 минут чтения

Как использовать Css-переменные для настройки цветовой темы интерфейса в веб-разработке

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 сообщает браузеру, какой режим используется для встроенных элементов, например полей ввода и полос прокрутки.

Подключите переменные к компонентам интерфейса

  1. Замените прямые цвета в глобальных стилях.
    Примените переменные к фону страницы и основному тексту, чтобы базовый режим темы работал повсеместно.

    body {
      background: var(--color-background);
      color: var(--color-text);
    }
  2. Настройте поверхности компонентов.
    Карточки, меню и диалоговые окна обычно используют отдельный цвет поверхности и границы. Это помогает сохранить визуальную иерархию в обоих режимах.

    .card {
      background: var(--color-surface);
      border: 1px solid var(--color-border);
    }
  3. Обновите акцентные элементы.
    Примените акцентный токен к ссылкам и кнопкам, затем проверьте состояния наведения, фокуса и отключения. Если для состояния нужен отдельный цвет, добавьте соответствующую семантическую переменную.
  4. Удалите устаревшие значения постепенно.
    Ищите в стилях жёстко заданные цвета и заменяйте их по смыслу, а не механически. После каждого крупного компонента проверяйте обе темы, чтобы не пропустить локальные переопределения.

Быстрый режим

  1. Определите роли цветов и значения для двух тем.
  2. Объявите переменные в :root и переопределите их для тёмного режима.
  3. Подключите переменные к глобальным стилям и компонентам.
  4. Переключайте тему атрибутом и проверьте контрастность.

Такая схема подходит как для самостоятельной доработки, так и для обсуждения требований при заказе разработки интерфейса сайта. При выборе подрядчика для услуги веб-разработки заранее согласуйте, кто отвечает за палитру, переключение темы и тестирование доступности.

Переключайте тему через атрибуты и классы

Атрибут на корневом элементе связывает тему с 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.

Нужно ли создавать отдельные переменные для состояний кнопки?

Создайте их, если состояния наведения, фокуса или отключения требуют отдельных цветов. Для доступности проверяйте не только оттенок, но и заметность состояния без опоры на цвет.

Почему часть страницы не меняет цвет?

В стилях компонента может оставаться жёстко заданный цвет или правило с более высокой специфичностью. Найдите такое правило в инструментах разработчика и замените значение на подходящую переменную.

Как убедиться, что текст читаем в обеих темах?

Проверьте сочетания текста и фона инструментом оценки контрастности, а затем протестируйте интерфейс с клавиатуры и в браузере. Особое внимание уделите приглушённому тексту, ссылкам и границам элементов управления.

Scroll to Top