使用JavaScript检测暗模式

mik*_*ana 5 javascript stripe-payments macos-darkmode

Windows和macOS现在具有暗模式。

对于CSS,我可以使用:

@media (prefers-dark-interface) { 
  color: white; background: black 
}
Run Code Online (Sandbox Code Playgroud)

但是我正在使用Stripe ELements API,该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
      }
    }
  }

Run Code Online (Sandbox Code Playgroud)

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

小智 16

根据MediaQueryList - Web APIs | MDNaddListener才是听变的正确方式。addEventListener在 iOS 13.4 上对我不起作用。

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

  • 同样来自 MDN - 这基本上是 EventTarget.addEventListener() 的别名,用于向后兼容。 (4认同)
  • 只是引用提到的 MDN,因为我很困惑并查找了它:“ `addListener()` 向 MediaQueryList 添加一个回调,每当媒体查询状态(无论文档是否与列表中的媒体查询匹配)时都会调用该回调更改。此方法的存在主要是为了向后兼容;**如果可能**,您应该使用 `addEventListener()` 来监视更改事件。” (4认同)

Yul*_*ian 11

这是根据SanBen 的回答写的一句话:

const getPreferredScheme = () => window?.matchMedia?.('(prefers-color-scheme:dark)')?.matches ? 'dark' : 'light';
Run Code Online (Sandbox Code Playgroud)


Mar*_*abo 10

if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
    // dark mode
}
Run Code Online (Sandbox Code Playgroud)

  • 我将在这里留下这个: `window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function(e) { console.log('changed!!');}) ` (42认同)
  • 请注意,“prefers-color-scheme: dark”似乎在 Edge 中不起作用。不在 CSS 或 JavaScript 中。 (3认同)
  • 是的,那是“旧”版本。据我所知,在基于 EdgeHTML 的 Edge 中检测暗模式的唯一方法是通过 Windows API,这些 API 仅当用户通过 Windows 应用商店“安装”应用程序时才可用。我不会为此烦恼,因为 Windows 功能更新 2004(现已推出)用基于 Chromium 的新 Edge 取代了“旧”Egde。 (2认同)
  • 此事件处理程序的 TypeScript 事件类型是“event: MediaQueryListEvent”。 (2认同)

San*_*Ben 7

您可以直接使用 Javascript检查 CSS Media-Queries

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

要检查媒体查询是否为真,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)
}
Run Code Online (Sandbox Code Playgroud)

如果用户会改变他们的偏好,要动态更新配色方案,可以使用以下方法:

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()));
}
Run Code Online (Sandbox Code Playgroud)


小智 5

检查matchMedia选项:

function getTheme() {
  if(window.matchMedia && window.matchMedia("(prefers-color-scheme:dark)").matches) {
    return "dark";
  } else {
    return "light";
  }
}
Run Code Online (Sandbox Code Playgroud)