Làm thế nào để phát hiện nếu HĐH ở chế độ tối trong trình duyệt?


138

Tương tự như " Cách phát hiện nếu OS X ở chế độ tối? " Chỉ dành cho trình duyệt.

Có ai tìm thấy nếu có một cách để phát hiện xem hệ thống của người dùng có ở Chế độ tối OS X mới trong Safari / Chrome / Firefox không?

Chúng tôi muốn thay đổi thiết kế trang web của chúng tôi thành thân thiện với chế độ tối dựa trên chế độ hoạt động hiện tại.


1
Theo tôi biết, không có truy vấn phương tiện CSS nào cho Safari để phát hiện chế độ sáng hoặc tối, nhưng Safari chắc chắn hỗ trợ các widget tối trong các trang HTML. Nó có thể hữu ích để nộp một radar cho nó.
mschmidt

Đừng hiurt tôi, nhưng sau khi Stackoverflow giới thiệu chế độ tối tôi googled cách họ thực hiện chế độ "hệ thống" và stumbled khi câu hỏi này. Tôi mong đợi rất nhiều lưu lượng truy cập vào đây :-)
usr-local-ΕΨΗΕΛΩΝ

Câu trả lời:


177

Tiêu chuẩn mới được đăng ký trên W3C trong Truy vấn truyền thông cấp 5 .

LƯU Ý: hiện chỉ khả dụng trong Safari Technology Preview Release 68

Trong trường hợp ưu tiên người dùng là light:

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

Trong trường hợp ưu tiên người dùng là dark:

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

Ngoài ra còn có tùy chọn no-preferencetrong trường hợp người dùng không có ưu tiên. Nhưng tôi khuyên bạn chỉ nên sử dụng CSS bình thường trong trường hợp đó và xếp tầng CSS của bạn một cách chính xác.

EDIT (7 tháng 12 năm 2018):

Trong Safari Technology Preview Release 71, họ đã công bố một công tắc bật tắt trong Safari để giúp việc kiểm tra dễ dàng hơn. Tôi cũng đã làm một trang thử nghiệm để xem hành vi của trình duyệt.

Nếu bạn đã cài đặt Safari Technology Preview Release 71, bạn có thể kích hoạt thông qua:

Phát triển> Tính năng thử nghiệm> Hỗ trợ CSS chế độ tối

Sau đó, nếu bạn mở trang thử nghiệm và mở trình kiểm tra phần tử, bạn có một biểu tượng mới để chuyển chế độ Tối / Sáng.

chuyển chế độ tối / sáng

-

EDIT (11 feb 2019): Apple xuất xưởng trong chế độ tối Safari 12.1 mới

-

EDIT (5 sep 2019): Hiện tại 25% thế giới có thể sử dụng CSS chế độ tối. Nguồn: caniuse.com

Các trình duyệt sắp tới:

  • iOS 13 (Tôi đoán nó sẽ được xuất xưởng vào tuần tới sau Keynote của Apple)
  • EdgeHTML 76 (không chắc chắn khi nào sẽ được chuyển đi)

-

EDIT (5 nov 2019): Hiện 74% trên thế giới có thể sử dụng CSS chế độ tối. Nguồn: caniuse.com

-

EDIT (3 tháng 2 năm 2020): Microsoft Edge 79 hỗ trợ chế độ tối. (phát hành vào ngày 15 tháng 1 năm 2020)

-

Đề xuất của tôi sẽ là: bạn nên xem xét thực hiện chế độ tối vì hầu hết người dùng có thể sử dụng ngay bây giờ (đặc biệt là cho thiết bị di động hay còn gọi là tiết kiệm pin).

Lưu ý: Tất cả các trình duyệt chính hiện đang hỗ trợ chế độ tối, ngoại trừ: IE, Edge


2
Chỉ cần thử nghiệm nó. Nếu bạn thay đổi chủ đề trong cài đặt hệ điều hành mac, thì bạn cần khởi động lại trình duyệt. Quá tệ, nó không được đồng bộ hóa khi đang bay.
Herman Starikov

3
@HermanStarikov Tôi đã đăng một bản cập nhật về vấn đề này mà bạn đang mô tả. Với Bản phát hành Preview Technology Technology 71 mới, bạn có thể chuyển đổi trong thời gian thực.
Davy de Vries

Đẹp! Tôi đã tạo một bản demo nhỏ về chủ đề trông như thế nào với bootstrap: twitter.com/Hermanhasawish/status/1071517994302562305
Herman Starikov

2
Có cách nào để phát hiện điều này trong JavaScript không?
Akash Kava

7
@AkashKava Tôi đã tìm hiểu xung quanh, vâng, có thể nếu bạn sử dụng một cái gì đó như thế này: window.matchMedia("(prefers-color-scheme: dark)").matchesNếu tôi có thời gian rảnh tôi sẽ thêm một giải pháp javascript đầy đủ vào câu trả lời của tôi.
Davy de Vries

68

Nếu bạn muốn phát hiện nó từ JS, bạn có thể sử dụng mã này:

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

Để theo dõi các thay đổi:

window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', e => {
    const newColorScheme = e.matches ? "dark" : "light";
});

Chào! Điều này làm việc tuyệt vời. Mặc dù tôi tò mò - chính xác thì cú pháp này hoạt động như thế nào?
Bão tố

1
@Stormblished trước tiên nó sẽ kiểm tra xem trình duyệt có hỗ trợ matchMediahay không và sau đó nó sẽ cố gắng khớp prefers-color-scheme: darkchuỗi. Nếu nó phù hợp với chúng tôi đang ở chế độ tối.
Mark Szabo

Với toán tử Elvis mới, điều này có thể được viết làif (window.matchMedia?('(prefers-color-scheme: dark)').matches) { }
Mark Szabo

ồ điều đó cũng có lý! Cú pháp với .matches trông giống như đang thực hiện so sánh giữa điều đầu tiên và điều thứ hai hoặc một cái gì đó. Cảm ơn!
Bão tố

Nên là câu trả lời được kiểm tra.
podperson

22

Điều này hiện đang (tháng 9 năm 2018) đang được thảo luận trong "Bản thảo trình soạn thảo nhóm làm việc CSS" . Spec đã ra mắt (xem ở trên), có sẵn như là một truy vấn phương tiện truyền thông. Một cái gì đó đã hạ cánh trong Safari, xem thêm ở đây . Vì vậy, về lý thuyết bạn có thể làm điều này trong Safari / Webkit:

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

Nhưng dường như đây là chuyện riêng tư . Trên MDN, một tính năng phương tiện CSS inverted-colorsđược đề cập . Plug: Tôi viết blog về chế độ tối ở đây .



2

Theo Mozilla, đây là phương pháp được ưa thích kể từ tháng 9 năm 2019

@media (prefers-color-scheme: dark) {
  body {
    background: #000;
  }
}
@media (prefers-color-scheme: light) {
  body {
    background: #fff;
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.