Làm cách nào để phát hiện chế độ tối bằng JavaScript?


89

Windows và macOS hiện có chế độ tối.

Đối với CSS, tôi có thể sử dụng:

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

Nhưng tôi đang sử dụng API Stripe Elements, đặt màu sắc trong JavaScript

Ví dụ:

  const stripeElementStyles = {
    base: {
      color: COLORS.darkGrey,
      fontFamily: `-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"`,
      fontSize: '18px',
      fontSmoothing: 'antialiased',
      '::placeholder': {
        color: COLORS.midgrey
      },
      ':-webkit-autofill': {
        color: COLORS.icyWhite
      }
    }
  }

Làm cách nào để phát hiện bảng màu ưa thích của HĐH trong JavaScript?



2
Câu trả lời thứ hai này không được đánh dấu là được chấp nhận, nhưng bao gồm cách sử dụng JavaScript vớiwindow.matchMedia
mikemaccana

Tôi không thể làm cho @media (prefers-dark-interface)truy vấn phương tiện hoạt động trong Chrome 80 (như bạn đã đề cập), nhưng @media (prefers-color-scheme: dark)đã làm được.
Talk Nerdy To Me vào

Câu trả lời:


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

Để xem các thay đổi:

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

2
Lưu ý rằng điều này chỉ hoạt động khi bạn thực sự thực thi mã, chứ không tự động khi người dùng thay đổi chế độ theo cách thủ công hoặc nó được hệ thống tự động thay đổi.
Daniel

1
@Daniel Khá rõ ràng vì nó dường như không phải là một sự kiện mà chỉ là một thuộc tính của đối tượng window.
Muhammad bin Yusrat

32
Tôi sẽ chỉ đăng cái này ở đây:window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function(e) { console.log('changed!!');})
Jaromanda X

Lưu ý rằng điều prefers-color-scheme: darkđó dường như không hoạt động trong Edge. Không có trong CSS hoặc Javasript.
VDWWD

@VDWWD Edge cũ hay Edge mới (dựa trên Chromium)?
Mark Szabo

10

Theo MediaQueryList - Web API | MDN , addListenerlà cách chính xác để lắng nghe sự thay đổi. addEventListenerkhông hoạt động đối với tôi trên iOS 13.4.

window.matchMedia('(prefers-color-scheme: dark)').addListener(function (e) {
  console.log(`changed to ${e.matches ? "dark" : "light"} mode`)
});

1
Cũng từ MDN - Về cơ bản, đây là một bí danh cho EventTarget.addEventListener (), cho các mục đích tương thích ngược.
Gerrit0

7

Bạn có thể kiểm tra CSS Media-Queries trực tiếp bằng Javascript

Phương thức window.matchMedia () trả về một đối tượng MediaQueryList đại diện cho kết quả của chuỗi truy vấn phương tiện CSS được chỉ định. Giá trị của phương thức matchMedia () có thể là bất kỳ tính năng đa phương tiện nào của quy tắc CSS @media, như chiều cao tối thiểu, chiều rộng tối thiểu, hướng, v.v.

Để kiểm tra xem Media-Query có đúng, thuộc matchestính có thể được sử dụng

// Check to see if Media-Queries are supported
if (window.matchMedia) {
  // Check if the dark-mode Media-Query matches
  if(window.matchMedia('(prefers-color-scheme: dark)').matches){
    // Dark
  } else {
    // Light
  }
} else {
  // Default (when Media-Queries are not supported)
}

Để cập nhật động bảng màu nếu người dùng thay đổi tùy chọn của họ, bạn có thể sử dụng những điều sau:

function setColorScheme(scheme) {
  switch(scheme){
    case 'dark':
      // Dark
      break;
    case 'light':
      // Light
      break;
    default:
      // Default
      break;
  }
}

function getPreferredColorScheme() {
  if (window.matchMedia) {
    if(window.matchMedia('(prefers-color-scheme: dark)').matches){
      return 'dark';
    } else {
      return 'light';
    }
  }
  return 'light';
}

if(window.matchMedia){
  var colorSchemeQuery = window.matchMedia('(prefers-color-scheme: dark)');
  colorSchemeQuery.addEventListener('change', setColorScheme(getPreferedColorScheme()));
}
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.