197

Windows 和 macOS 现在有暗模式。

对于 CSS,我可以使用:

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

但我正在使用Stripe Elements API,它将颜色放入 JavaScript

例如:

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
    }
  }
}

如何在 JavaScript 中检测操作系统的首选配色方案?

4

3 回答 3

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

观察变化:

window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
    const newColorScheme = event.matches ? "dark" : "light";
});
于 2019-09-04T20:52:09.033 回答
18

根据MediaQueryList - Web API | MDNaddListener是聆听变化的正确方式。addEventListener在 iOS 13.4 上不适用于我。

window.matchMedia('(prefers-color-scheme: dark)').addListener(function (e) {
  console.log(`changed to ${e.matches ? "dark" : "light"} mode`)
});
于 2020-04-21T17:14:14.553 回答
12

您可以使用 JavaScript 直接检查 CSS媒体查询

window.matchMedia() 方法返回一个 MediaQueryList 对象,表示指定 CSS 媒体查询字符串的结果。matchMedia() 方法的值可以是 CSS @media 规则的任何媒体特征,例如 min-height、min-width、orientation 等。

要检查 Media-Query 是否为真,matches可以使用该属性

// 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)
}

color-scheme根据用户的偏好动态更新,可以使用以下命令:

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(getPreferredColorScheme()));
}
于 2020-04-01T12:48:21.903 回答