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

Темный режим – это популярная тенденция в дизайне, которая включает в себя изменение цветовой схемы веб-сайта на темный фон со светлым текстом и элементами. Эта функция также известна как Ночной режимилиТемная тема. Основная цель темного режима — свести к минимуму нагрузку на глаза при использовании устройств в условиях низкой освещенности, продлить срок службы батареи на мобильных устройствах и придать утонченный и современный вид.
Многие популярные веб-сайты и приложения теперь предлагают опцию 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;
Вот так, ребята! Надеюсь моя статья поможет вам в вашем бизнесе
Спасибо, что прочитали это! Ждем ваших комментариев и предложений 😎✌