Как определить, находится ли ОС в темном режиме в браузерах?

138

Подобно « Как определить, находится ли OS X в темном режиме? » Только для браузеров.

Кто-нибудь нашел, есть ли способ определить, находится ли система пользователя в новом темном режиме OS X в Safari / Chrome / Firefox?

Мы хотели бы изменить дизайн нашего сайта, чтобы он был совместим с темным режимом в зависимости от текущего режима работы.

funkju
источник
1
Насколько мне известно, для Safari нет медиа-запроса CSS для определения светлого или темного режима, но Safari однозначно поддерживает темные виджеты на HTML-страницах. Может быть полезно зарегистрировать для этого радар.
mschmidt
Не трогайте меня, но после того, как Stackoverflow представил темный режим, я погуглил, как они реализовали "системный" режим, и наткнулся на этот вопрос. Я ожидаю много трафика по этому
поводу

Ответы:

178

Новый стандарт зарегистрирован на W3C в Media Queries Level 5 .

ПРИМЕЧАНИЕ: в настоящее время доступно только в Safari Technology Preview Release 68.

В случае предпочтений пользователя light:

/* Light mode */
@media (prefers-color-scheme: light) {
    body {
        background-color: white;
        color: black;
    }
}

В случае предпочтений пользователя dark:

/* Dark mode */
@media (prefers-color-scheme: dark) {
    body {
        background-color: black;
        color: white;
    }
}

Также есть возможность, no-preferenceесли у пользователя нет предпочтений. Но я рекомендую вам просто использовать обычный CSS в этом случае и правильно каскадировать CSS.

РЕДАКТИРОВАТЬ (7 декабря 2018 г.):

В Safari Technology Preview Release 71 они анонсировали тумблер в Safari, чтобы упростить тестирование. Я также сделал тестовую страницу, чтобы увидеть поведение браузера.

Если у вас установлен Safari Technology Preview Release 71, вы можете активировать его через:

Разработка> Экспериментальные функции> Поддержка темного режима CSS

Затем, если вы откроете тестовую страницу и откроете инспектор элементов, у вас появится новый значок для переключения темного / светлого режима.

переключить темный / светлый режим

-

РЕДАКТИРОВАТЬ (11 февраля 2019 г.): Apple поставляется в новом темном режиме Safari 12.1

-

РЕДАКТИРОВАТЬ (5 сен 2019): в настоящее время 25% мира могут использовать темный режим CSS. Источник: caniuse.com

Будущие браузеры:

  • iOS 13 (я думаю, она будет выпущена на следующей неделе после Apple Keynote)
  • EdgeHTML 76 (не уверен, когда он будет отправлен)

-

РЕДАКТИРОВАТЬ (5 ноя 2019): в настоящее время 74% людей в мире могут использовать темный режим CSS. Источник: caniuse.com

-

РЕДАКТИРОВАТЬ (3 февраля 2020 г.): Microsoft Edge 79 поддерживает темный режим. (выпущено 15 января 2020 г.)

-

Мое предложение: вам следует подумать о внедрении темного режима, потому что большинство пользователей могут использовать его сейчас (особенно для мобильных устройств, то есть для экономии заряда батареи).

Примечание: все основные браузеры теперь поддерживают темный режим, кроме IE, Edge.

Дэви де Врис
источник
2
Просто протестировал. Если вы измените тему в настройках Mac OS, вам необходимо перезапустить браузер. Жаль, что он не синхронизируется на лету.
Герман Стариков
3
@HermanStarikov Я опубликовал обновление по этой проблеме, которую вы описываете. В новом выпуске 71 Safari Technology Preview вы можете переключаться в реальном времени.
Дэви де Врис
Ницца! Я сделал небольшую демонстрацию того, как будут выглядеть темы с помощью начальной загрузки: twitter.com/Hermanhasawish/status/1071517994302562305
Герман Стариков
2
Есть ли способ обнаружить это в JavaScript?
Акаш Кава
7
@AkashKava Я погуглил, да, это возможно, если вы используете что-то вроде этого: window.matchMedia("(prefers-color-scheme: dark)").matchesЕсли у меня будет немного свободного времени, я добавлю к своему ответу полное решение javascript.
Дэви де Врис,
70

Если вы хотите обнаружить его из JS, вы можете использовать этот код:

if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
    // dark mode
}

Чтобы следить за изменениями:

window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', e => {
    const newColorScheme = e.matches ? "dark" : "light";
});
Марк Сабо
источник
Здравствуй! Это прекрасно работает. Мне любопытно, как именно работает этот синтаксис?
Stormblessed
1
@Stormblessed сначала проверит, поддерживает ли браузер, matchMediaа затем попытается сопоставить prefers-color-scheme: darkстроку. Если он совпадает, мы находимся в темном режиме.
Марк Сабо
С новым оператором Элвиса это можно записать какif (window.matchMedia?('(prefers-color-scheme: dark)').matches) { }
Марк Сабо
о, в этом есть смысл! Синтаксис с .matches выглядел так, будто сравнивал первое и второе или что-то в этом роде. Спасибо!
Stormblessed
Должен быть проверенным ответом.
podperson
22

В настоящее время (сентябрь 2018 г.) это обсуждается в «Черновиках редактора рабочей группы CSS» . Запущен Spec (см. Выше), доступный в виде медиа-запроса. Что-то уже появилось в Safari, см. Также здесь . Так что теоретически вы можете сделать это в Safari / Webkit:

@media (prefers-dark-interface) { color: white; background: black }

Но похоже, что это личное . На MDN функция медиа CSS inverted-colorsявляется упомянуто . Штекер: Я писал о режиме темного здесь .

Франк Леммер
источник
5

Я искал через Mozilla API, похоже, у них нет переменных, соответствующих цвету окна браузера. Хотя я нашел страницу, которая может вам помочь: Как использовать стили операционной системы в CSS . Несмотря на заголовок статьи, цвета у Chrome и Firefox разные.

toeffe3
источник
5
Сейчас он там - developer.mozilla.org/en-US/docs/Web/CSS/@media/…
siwalikm
2

Согласно Mozilla, вот предпочтительный метод по состоянию на сентябрь 2019 г.

@media (prefers-color-scheme: dark) {
  body {
    background: #000;
  }
}
@media (prefers-color-scheme: light) {
  body {
    background: #fff;
  }
}
Аслам
источник