Як визначити, чи ОС перебуває в темному режимі в браузерах?


138

Подібно до " Як визначити, чи ОС X перебуває в темному режимі? " Лише для браузерів.

Хтось знайшов, чи є спосіб виявити, чи система користувача перебуває в новому темному режимі OS X в Safari / Chrome / Firefox?

Ми хотіли б змінити дизайн нашого веб-сайту на придатний для темних режимів на основі поточного режиму роботи.


1
Наскільки я знаю, у Сафарі немає запиту на медіа CSS для виявлення світлого або темного режиму, але Safari остаточно підтримує темні віджети на сторінках HTML. Це може бути корисно подати радар для цього.
mschmidt

Не шкода мені, але після того, як Stackoverflow ввів темний режим, я погуглив, як вони реалізували режим "системи", і натрапив на це питання. Я очікую багато трафіку на цьому :-)
usr-local-ΕΨΗΕΛΩΝ

Відповіді:


177

Новий стандарт зареєстрований на W3C у Media 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.

EDIT (7 грудня 2018 р.):

У Safari Technology Preview Release 71 вони оголосили перемикач у Safari, щоб полегшити тестування. Я також зробив тестову сторінку, щоб побачити поведінку браузера.

Якщо у вас встановлено Safari Technology Preview Release 71, ви можете активувати:

Розробка> Експериментальні функції> Темний режим Підтримка CSS

Потім, якщо ви відкриєте тестову сторінку та відкриєте інспектор елементів, у вас є нова ікона для переключення темного / світлого режиму.

перемикання темного / світлого режиму

-

EDIT (11 лютого 2019 р.): Apple поставляється в новому темному режимі Safari 12.1

-

EDIT (5 вересня 2019 р.): Наразі 25% країн світу можуть використовувати темний режим CSS. Джерело: caniuse.com

Майбутні браузери:

  • iOS 13 (я думаю, він буде поставлений наступного тижня після основного повідомлення від Apple)
  • EdgeHTML 76 (не впевнений, коли це буде поставлено)

-

EDIT (5 листопада 2019 р.): Зараз 74% країн світу можуть використовувати темний режим CSS. Джерело: caniuse.com

-

EDIT (3 лютого 2020 р.): Microsoft Edge 79 підтримує темний режим. (випущено 15 січня 2020 року)

-

Моя пропозиція полягала б у тому, що ви повинні розглянути можливість застосування темного режиму, оскільки більшість користувачів зараз може ним користуватися (особливо для економії акумулятора на мобільних пристроях).

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


2
Просто перевірив це. Якщо ви змінили тему в налаштуваннях mac os, вам потрібно перезапустити браузер. Шкода, що він не синхронізується з льоту.
Герман Стариков

3
@HermanStarikov Я опублікував оновлення щодо цього питання, яке ви описуєте. Завдяки новій програмі Safari Preview Release 71 ви можете перемикатися в режимі реального часу.
Деві де Вріс

Приємно! Я зробив невеличку демонстрацію того, як виглядатиме тематизація з завантажувальним пристроєм: twitter.com/Hermanhasawish/status/1071517994302562305
Герман Стариков

2
Чи є спосіб виявити це в JavaScript?
Акаш Кава

7
@AkashKava Я гуляв навколо, так це можливо, якщо ви використовуєте щось подібне: window.matchMedia("(prefers-color-scheme: dark)").matchesЯкщо у мене є вільний час, я додам повноцінне рішення Javascript до своєї відповіді.
Деві де Вріс

68

Якщо ви хочете виявити його в 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";
});

Привіт! Це чудово працює. Мені цікаво, хоча - як саме працює цей синтаксис?
Штурмував

1
@Stormblessed спочатку перевірить, чи підтримує браузер, matchMediaа потім спробує відповідати prefers-color-scheme: darkрядку. Якщо це відповідає, ми перебуваємо в темному режимі.
Марк Сабо

З новим оператором Елвіса це можна записати якif (window.matchMedia?('(prefers-color-scheme: dark)').matches) { }
Марк Сабо

о, це має сенс! Синтаксис з .matches виглядав так, ніби він робив порівняння між першим і другим чи чимось. Дякую!
Штурмується

Повинна бути перевірена відповідь.
підперсон

22

Наразі це (вересень 2018 року) обговорюється в «Чернетках редакторів робочої групи CSS» . Spec запустився (див. Вище), доступний як медіа-запит. Щось вже приземлилося в Сафарі, дивіться також тут . Тож теоретично ви можете це зробити в Safari / Webkit:

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

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


5

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



2

За словами Mozilla, ось кращий метод станом на вересень 2019 року

@media (prefers-color-scheme: dark) {
  body {
    background: #000;
  }
}
@media (prefers-color-scheme: light) {
  body {
    background: #fff;
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.