如何检测浏览器是不是支持暗模式

Posted

技术标签:

【中文标题】如何检测浏览器是不是支持暗模式【英文标题】:How to detect if a browser supports dark mode如何检测浏览器是否支持暗模式 【发布时间】:2021-12-25 14:34:39 【问题描述】:

我们可以使用prefers-color-scheme: dark 来检测是否激活了暗模式:

const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;

有没有办法检测浏览器是否支持暗模式? (“支持暗模式”是指浏览器自动更改网页的默认背景/文本颜色)。

在 CSS 中,我们可以强制使用暗模式

color-scheme: dark;

但是,某些浏览器(android 版 Firefox)会忽略它。因此,如果深色模式不可用,我想隐藏主题选择。

【问题讨论】:

不确定是否检测,但您可以在这里轻松快速查看caniuse.com/?search=color%20scheme 何时可用是什么意思?,暗模式是您添加到网站的东西。如果您想检测浏览器是否可以检测到操作系统模式,请按照您在问题中提到的操作。有什么我想念的吗? @MohamedAbdallah 我们可以使用 color-scheme: dark; 在 CSS 中强制使用暗模式,但并非所有浏览器都会切换到暗模式(即 Android Firefox)。 您可以尝试基于 CSS 的@supports (color-scheme: dark) ... 进行检测。 @connexo 很有趣。任何想法为什么在使用任何字符串而不是 dark 时它是“真实的”?例如@supports (color-scheme: blahblahblah) background-color: red; 【参考方案1】:

我目前的解决方案是在暗模式和亮模式之间切换,并检查模式之间的默认颜色是否发生了变化:

const hasDarkMode = function()

  const el = document.createElement("div");
  el.style.display = "none";
  document.body.appendChild(el);
  let color;
  /*canvastext - doesn't work in Samsung Internet, initial/unset - doesn't work in Firefox*/
  for(let i = 0, c = ["canvastext", "initial", "unset"]; i < c.length; i++ )
  
    el.style.color = c[i];
    el.style.colorScheme = "dark";
    color = getComputedStyle(el).color;
    el.style.colorScheme = "light";
    color = color != getComputedStyle(el).color;
    if (color)
      break;
  
  document.body.removeChild(el);
  return color;
();

console.log("Dark mode supported:", hasDarkMode);

这可能不是最优雅的解决方案,但它似乎有效。

通过@connexo 的评论,我们还可以测试:

const hasDarkMode = CSS.supports("color-scheme", "dark");

console.log("Dark mode supported:", hasDarkMode);
@supports (color-scheme: dark)

  .no-dark-mode
  
    display: none;
  
&lt;div&gt;Dark mode is &lt;span class="no-dark-mode"&gt;not &lt;/span&gt;available&lt;/div&gt;

【讨论】:

为什么你更喜欢const hasDarkMode = function() 而不是function hasDarkMode () 因为它不需要执行多次。

以上是关于如何检测浏览器是不是支持暗模式的主要内容,如果未能解决你的问题,请参考以下文章

(PHP) 如何检测用户的计算机/浏览器处于暗模式?

如何在三星互联网浏览器上检测暗模式?

iPad 检测用户是不是启用了暗模式,但不支持暗模式

(PHP)如何检测用户的计算机/浏览器是否处于黑暗模式?

如何检测 OS X 是不是处于暗模式?

启用浏览器的强制暗标志时如何使 Google Docs 进入暗模式?