Здравствуйте друзья!
Хотя я занимаюсь бэкэнд-разработкой, в моих проектах нередко приходится охватывать весь стек разработки. Именно поэтому сегодня я хотел рассказать вам о том, что беспокоило меня лично, и, надеюсь, поможет и вам.

Пойдем!

Темный режим – это популярная тенденция в дизайне, которая включает в себя изменение цветовой схемы веб-сайта на темный фон со светлым текстом и элементами. Эта функция также известна как Ночной режимилиТемная тема. Основная цель темного режима — свести к минимуму нагрузку на глаза при использовании устройств в условиях низкой освещенности, продлить срок службы батареи на мобильных устройствах и придать утонченный и современный вид.

Многие популярные веб-сайты и приложения теперь предлагают опцию Dark Mode — вот TailwindCSS:

Если вы разработчик, вы, скорее всего, уже знаете, как включить темный режим в Dev Tools (для тех, кто не знает, перейдите на вкладку «рендеринг»!):

Если вы хотите включить темный режим для своей операционной системы (и, следовательно, для всех приложений, поддерживающих темный режим), перейдите в «Системные настройки». На Mac вы найдете его в разделе «Системные настройки» > «Внешний вид»:

Уже есть множество руководств о том, как реализовать темный режим для веб-сайта.

В этом руководстве будут рассмотрены различные подходы, в том числе несколько потрясающих новых возможностей CSS, которые позволят вам отказаться от JavaScript.

Темный режим с использованием системных цветов

Для начала создадим простой HTML-документ с заголовком:

<body>
  <h1>Hello Darkness, My Old Friend</h1>
</body>

В таблицу стилей мы добавим:

body {
  color-scheme: light dark;
}

Это сообщит браузеру, что наш документ может принимать как светлый, так и темный color-scheme.

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

Это связано с тем, что в таблице стилей user-agent не заданы цвета по умолчанию.

Мы можем это быстро исправить, используя Системные цвета:

body {
  background-color: Canvas;
  color: CanvasText;
  color-scheme: light dark;
}

Давайте еще раз проверим наш фрагмент:

Намного лучше! Темный режим для всего вашего сайта в трех строках CSS!

Давайте подробнее рассмотрим Системные цвета. Из спецификаций:

Как правило, ключевые слова <system-color> отражают выбор цвета по умолчанию, сделанный пользователем, браузером или операционной системой. По этой причине они обычно используются в таблице стилей браузера по умолчанию.

Вот демонстрация Light Mode, показывающая доступные системные цвета в Safari:

Если мы переключаемся в темный режим, некоторые цвета меняются полностью (например, Canvas и CanvasText, с которыми мы уже сталкивались), а другие лишь слегка меняются:

Использование системных цветов для темного режима — это немного упрощенный опыт работы с темным режимом.

Да, это сработает, но чистое черно-белое изображение немного скучно.

Мы можем оживить его, используя color-mix в CSS. Мы можем смешать немного CanvasText (черного или белого) с Canvas (белым или черным) для background-color и наоборот для color:

body {
  background-color: color-mix(in srgb, Canvas, CanvasText 2.5%);
  color: color-mix(in srgb, CanvasText, Canvas 15%);
}

Это приводит к «более мягкому» виду:

Использование prefers-color-scheme медиа-запроса

Чтобы указать определенные цвета для светлого и темного режима, я рекомендую использовать Пользовательские свойства CSS, а затем обновлять их с помощью prefers-color-scheme медиа-запроса.

Используя Светлый режим по умолчанию, давайте добавим цвета в раздел :where(body), чтобы отделить их от наших обычных стилей body:

/* Properties */
:where(body) {
  --background-color: #FFF;
  --text-color: #222;
}
body {
  background-color: var(--background-color);
  color: var(--text-color);
}

Затем для Темного режима мы просто обновим эти свойства цветов:

@media (prefers-color-scheme: dark) {
  :where(body) {
    --background-color: hsl(228, 5%, 15%);
    --text-color: hsl(228, 5%, 80%);
  }
}

Давайте проверим это:

Но что, если мы хотим, чтобы пользователи выбирали, какую версию нашего веб-сайта они хотят, независимо от системных настроек?

Они могут предпочесть систему, установленную в темном режиме, но наш веб-сайт в светлом режиме.

Давайте создадим переключатель!

Создание переключателя цветовой схемы

Использование CSS

Используя несколько совершенно новых CSS-методов, мы можем создать переключатель без JavaScript.

Мы создадим переключатель с 3 состояниями:

  • Легкий (принудительный)
  • Авто (системное значение по умолчанию, может быть либо светлым, либо темным)
  • Темный (принудительно)

Сначала немного базовой разметки:

<fieldset>
  <label>
    <input type="radio" name="color-scheme" id="color-scheme-light" value="0">
    Light
  </label>
  <label>
    <input type="radio" name="color-scheme" value="auto" checked>
    Auto
  </label>
  <label>
    <input type="radio" name="color-scheme" id="color-scheme-dark" value="1">
    Dark
  </label>
</fieldset>

После добавления некоторых базовых стилей (см. демо-версию Codepen ниже) он выглядит следующим образом:

Добавим свойство --darkmode и container-type к html-элементу:

html {
  --darkmode: 0;
  container-name: root;
  container-type: normal;
}

Мы будем использовать @container style()-запросы, поэтому нам нужно установить узел как «контейнер».

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

Если пользователь выберет «принудительное» значение, мы обновим --darkmode:

html:has(#color-scheme-light:checked) { --darkmode: 0; }
html:has(#color-scheme-dark:checked) { --darkmode: 1; }

И, наконец, мы будем использовать style()-запрос контейнера, чтобы проверить, установлен ли --darkmode в 1:

@container root style(--darkmode: 1) {
  body {
    --background-color: hsl(228, 5%, 15%);
    --text-color: hsl(228, 5%, 80%);
  }
}

ПРИМЕЧАНИЕ. @container style()-queries в настоящее время работает тольков скрытом режимев Chrome, это первые дни, поэтому не используйте его в рабочей среде.

Теперь, после выбора «Dark», наш переключатель (и страница) выглядит так:

Просто и эффективно!

Состояние хранения

Чтобы сохранить предпочтения пользователя, нам нужно использовать JavaScript.

Во-первых, давайте добавим идентификатор к нашему <fieldset>:

<fieldset id="colorScheme">

Затем в JavaScript:

colorScheme.addEventListener('change', event => {
  localStorage.setItem('color-scheme', event.target.value)
})

Теперь все, что нам нужно сделать, это установить для свойства значение localStorage, когда документ загружен:

window.addEventListener("load", event => {
  const scheme = localStorage.getItem('color-scheme') || 'auto'
  if (scheme) {
    document.documentElement.style.setProperty('--darkmode', scheme)
  }
})

Чтобы выбрать правильный режим в переключателе, добавьте это в блок if:

const selected = [...colorScheme.elements].filter(element => element.value === scheme)
if (selected) selected[0].checked = true;

Вот так, ребята! Надеюсь моя статья поможет вам в вашем бизнесе

Спасибо, что прочитали это! Ждем ваших комментариев и предложений 😎✌

Еще мои статьи:

* Лучшие репозитории GitHub для разработчиков Django.

* Создание Telegram-ботов с помощью Python

* Лучшие сайты для разработчиков

* Запуск приложений Golang, Nginx и React в Docker (руководство для начинающих)

* 101 вопрос, на который должен ответить Python-разработчик

* Канбан-доска на Django, DRF и Alpine.js

* 5 моделей монетизации веб-проектов

Исходная статья