prefers-color-scheme

Baseline 广泛可用 *

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2020 年 1 月⁩ 起,所有主流浏览器均已支持。

* 此特性的某些部分可能存在不同级别的支持。

prefers-color-scheme CSS 媒体特性 用于检测用户是否请求了浅色或深色主题。用户通过操作系统设置(例如,浅色或深色模式)或用户代理设置来表明他们的偏好。

嵌入元素

对于 SVG 和 iframe,prefers-color-scheme 允许您根据网页中父元素的 color-scheme 为 SVG 或 iframe 设置 CSS 样式。SVG 必须作为嵌入式(即 <img src="circle.svg" alt="circle" />)使用,而不是 在 HTML 中内联。在 SVG 中使用 prefers-color-scheme 的示例可以在“嵌入元素中继承的颜色方案”部分找到。

允许在跨域 <svg><iframe> 元素中使用 prefers-color-scheme。跨域元素是指从与引用它们的页面不同的主机检索的元素。要了解有关 SVG 的更多信息,请参阅 SVG 文档;有关 iframe 的更多信息,请参阅 iframe 文档

语法

light

表示用户已通知他们更喜欢浅色主题界面,或未明确表示主动偏好。

dark

表示用户已通知他们更喜欢深色主题界面。

示例

检测深色或浅色主题

一种常见用法是默认使用浅色方案,然后使用 prefers-color-scheme: dark 将颜色覆盖为深色变体。也可以反过来操作。

此示例显示了两种选项:主题 A 使用浅色,但可以被覆盖为深色。主题 B 使用深色,但可以被覆盖为浅色。最后,如果浏览器支持 prefers-color-scheme,则两个主题都将是浅色或深色。

HTML

html
<div class="box theme-a">Theme A (initial)</div>
<div class="box theme-a adaptive">Theme A (changed if dark preferred)</div>
<br />

<div class="box theme-b">Theme B (initial)</div>
<div class="box theme-b adaptive">Theme B (changed if light preferred)</div>

CSS

主题 A(棕色)默认使用浅色方案,但会根据媒体查询切换到深色方案

css
.theme-a {
  background: #ddccaa;
  color: #773311;
}
@media (prefers-color-scheme: dark) {
  .theme-a.adaptive {
    background: #775533;
    color: #ddccbb;
    outline: 5px dashed black;
  }
}

主题 B(蓝色)默认使用深色方案,但会根据媒体查询切换到浅色方案

css
.theme-b {
  background: #444477;
  color: #bbbbdd;
}
@media (prefers-color-scheme: light) {
  .theme-b.adaptive {
    background: #bbccdd;
    color: #333344;
    outline: 5px dotted black;
  }
}

结果

左侧方框显示了在没有 prefers-color-scheme 媒体查询的情况下主题 A 和主题 B 的外观。右侧方框显示了相同的主题,但其中一个将根据用户的活动颜色方案更改为更深或更浅的变体。如果其中一个方框根据您的浏览器或操作系统设置进行了更改,其轮廓将显示为虚线或点线。

嵌入元素中继承的颜色方案

以下示例展示了如何在嵌入元素中使用 prefers-color-scheme 媒体特性来继承父元素的颜色方案。脚本用于设置 <img> 元素的源及其 alt 属性。这通常会在 HTML 中完成,如 <img src="circle.svg" alt="circle" />

您应该会看到三个圆圈,其中一个用不同的颜色绘制。第一个圆圈继承自操作系统的 color-scheme,可以使用系统操作系统的主题切换器进行切换。

第二个和第三个圆圈继承自嵌入元素的 color-scheme@media 查询允许根据父元素的 color-scheme 设置 SVG 内容的样式。在本例中,具有 color-scheme CSS 属性的父元素是一个 <div>

html
<div>
  <img />
</div>
<div class="light">
  <img />
</div>
<div class="dark">
  <img />
</div>
css
.light {
  color-scheme: light;
}

.dark {
  color-scheme: dark;
}
js
// Embed an SVG for all <img> elements
for (let img of document.querySelectorAll("img")) {
  img.alt = "circle";
  img.src = `data:image/svg+xml;base64,${window.btoa(`
    <svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
      <style>
        :root { color: blue }
        @media (prefers-color-scheme: dark) {
          :root { color: purple }
        }
      </style>
      <circle fill="currentColor" cx="16" cy="16" r="16"/>
    </svg>
  `)}`;
}

规范

规范
媒体查询 Level 5
# prefers-color-scheme

浏览器兼容性

另见