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

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

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

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

Насколько мне известно, для Safari нет медиа-запроса CSS для определения светлого или темного режима, но Safari полностью поддерживает темные виджеты на HTML-страницах. Может быть полезно зарегистрировать для этого радар.

mschmidt 13.06.2018 21:41

Не трогайте, но после Stackoverflow представил темный режим я гуглил как они реализовали "системный" режим и наткнулся на этот вопрос. Я ожидаю много трафика по этому поводу :-)

usr-local-ΕΨΗΕΛΩΝ 01.04.2020 14:20
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
180
2
56 509
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Он сейчас там - developer.mozilla.org/en-US/docs/Web/CSS/@media/…

siwalikm 27.01.2019 08:42

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

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

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

Не используйте inverted-colors для определения темного режима. Во-первых, не получится. Во-вторых, он используется для доступности, а НЕ для эстетики. Некоторые пользователи используют инвертированный режим для повышения контрастности экрана, что типично для людей с ослабленным зрением. Пожалуйста, не меняйте внешний вид вашего сайта с учетом inverted-colors, поскольку он в лучшем случае не будет работать так, как вы хотите, а в худшем - это разочарует этих пользователей.
Qix - MONICA WAS MISTREATED 15.10.2020 05:08
Ответ принят как подходящий

Новый стандарт зарегистрирован на W3C в медиа-запросах, уровень 5.

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

Если пользователь предпочитает 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.

EDIT (7 dec 2018):

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

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

Develop > Experimental Features > Dark Mode CSS Support

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

toggle dark/light mode


EDIT (11 feb 2019): Apple ships in the new Safari 12.1 dark mode


EDIT (5 sep 2019): Currently 25% of the world can use dark mode CSS. Source: caniuse.com

Upcoming browsers:

  • iOS 13 ( I guess it will be shipped next week after Apple's Keynote)
  • EdgeHTML 76 (not sure when that will be shipped)

EDIT (5 nov 2019): Currently 74% of the world can use dark mode CSS. Source: caniuse.com


EDIT (3 Feb 2020): Microsoft Edge 79 supports dark mode. (released on 15 Jan 2020)

My suggestion would be: that you should consider implementing dark mode because most of the users can use it now (for night-time users of your site).

Note: All major browsers are supporting dark mode now, except: IE, Edge


EDIT (19 Nov 2020): Currently 88% of the world can use dark mode CSS. Source: caniuse.com

CSS-framework Tailwind CSS v2.0 supports dark-mode. (released on 18 Nov 2020)

Просто протестировал. Если вы измените тему в настройках Mac OS, вам необходимо перезапустить браузер. Жаль, что не синхронизируется на лету.

Herman Starikov 18.11.2018 23:53

@HermanStarikov Я опубликовал обновление по этой проблеме, которую вы описываете. В новом выпуске 71 Safari Technology Preview вы можете переключаться в реальном времени.

Davy de Vries 07.12.2018 11:51

Хороший! Я сделал небольшую демонстрацию того, как будут выглядеть темы с начальной загрузкой: twitter.com/Hermanhasawish/status/1071517994302562305

Herman Starikov 08.12.2018 22:37

Есть ли способ обнаружить это в JavaScript?

Akash Kava 08.05.2019 07:03

@AkashKava Я погуглил, да, это возможно, если вы используете что-то вроде этого: window.matchMedia("(prefers-color-scheme: dark)").matches Если у меня будет свободное время, я добавлю к своему ответу полное решение javascript.

Davy de Vries 08.05.2019 12:00

В JS это можно увидеть в этот другой ответ.

Stormblessed 26.02.2020 01:19

Также можно использовать prefers-color-scheme в <link rel = "stylesheet" ...>. Например: предупреждение <link rel = "stylesheet" media = "(prefers-color-scheme: light)" type = "text/css" href = "light.css" /> и <link rel = "stylesheet" media = "(prefers-color-scheme: dark)" type = "text/css" href = "dark.css" />: в Firefox (88 для Ubuntu) media = "(prefers-color-scheme: dark)" сильно мешал title = "Style Name", который можно использовать для переключения между альтернативными таблицами стилей. Использование атрибута title заставило Firefox не выбирать таблицу стилей темного режима (вторую).

Naradana 02.06.2021 12:26

В Chromium 91 на Ubuntu 20 <link rel = "stylesheet" media = "(prefers-color-scheme: light)"... и т. д. Не работает. Переключатель темного режима # enable-force-dark включает независимую эвристику рендеринга.

Naradana 02.06.2021 12:59

Если вы хотите обнаружить его из 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 26.02.2020 01:22

@Stormblessed сначала проверит, поддерживает ли браузер matchMedia, а затем попытается сопоставить строку prefers-color-scheme: dark. Если он совпадает, мы в темном режиме.

Mark Szabo 28.02.2020 09:18

С новым оператором Элвиса это можно записать как if (window.matchMedia?('(prefers-color-scheme: dark)').matches) { }

Mark Szabo 28.02.2020 09:19

о, в этом есть смысл! Синтаксис с .matches выглядел так, будто сравнивал первое и второе или что-то в этом роде. Спасибо!

Stormblessed 28.02.2020 16:12

Должен быть проверенным ответом.

podperson 24.03.2020 19:25

@MarkSzabo Ваш код действительно работает, но не является кросс-платформенным, как addListener, см. Здесь: developer.mozilla.org/en-US/docs/Web/API/MediaQueryList/… Так и должно быть: window.matchMedia('(prefers-color-scheme: dark)').addListener(e => { this.darkMode = e.matches; });

Stefan Rein 17.07.2020 11:45

@StefanRein, насколько мне известно, все версии браузеров, поддерживающие matchMedia, также поддерживают addEventListener, так что это не должно вызывать ошибок.

Mark Szabo 18.07.2020 13:31

@MarkSzabo, мое приложение Cordova только что вылетело из-за window.matchMedia('(prefers-color-scheme: dark)').addEventListener is not a function. В то время как в моем настольном браузере все работало. Это была WKWebView iOS 13 с cordova-ios 5.1.1.

Stefan Rein 19.07.2020 13:12

@StefanRein, вы включали проверку функций, например window.matchMedia &&?

Mark Szabo 19.07.2020 16:35

@MarkSzabo Нет, потому что метод addListener действительно работал с возвращенным MediaQueryList метода matchMedia (). Поскольку matchMedia существует, он все равно вылетает из-за вызова функции, которой не существует

Stefan Rein 20.07.2020 06:56

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

@media (prefers-color-scheme: dark) {
  body {
    background: #000;
  }
}
@media (prefers-color-scheme: light) {
  body {
    background: #fff;
  }
}

Для Safari / Webkit вы можете использовать

@media (prefers-dark-interface) { background: #000; }

Другие вопросы по теме