网页主题换色

主题色

开始在 全局设置好主题色变量,

:root {
	--theme_font: #fff;
	--theme_bg: #f00;
}

点击切换按钮后切换变量

document.styleSheets[0].cssRules[0].style.setProperty("--theme_font", "#000");

定制布局

  • Reslove. Extension

暗黑主题

不同人群有不同的需要:

  • 飞蚊症患者可能更喜欢 dark mode(可能是 dark mode 下飞蚊不那么明显?)
  • 散光患者可能在 light mode 下更容易聚焦

设置 dark mode

1. 在 <head> 中添加 <meta name="color-scheme" content="light dark">

<head>
  <!-- 其他内容 -->
  <meta name="color-scheme" content="light dark">
  <!-- 其他内容 -->
</head>
 
<!-- 也可以在元素上设置 -->
<div style="color-scheme: light dark;">…</div>

但是浏览器只会改变那些没有主动设置颜色的元素,如果你给一个元素设置了 colorbackground-color 等,浏览器是不知道如何切换颜色的。

2. CSS 中通过 light-dark() 设置不同的颜色

按照 color-scheme 文档中的介绍,有两种办法去适配颜色:

}

@media (prefers-color-scheme: light) {
.element {
color: black;
background-color: white;
}
}

@media (prefers-color-scheme: dark) {
.element {
color: white;
background-color: black;
}
}

- 使用 [light-dark()](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/light-dark) 这是 [Come to the light-dark() Side](https://css-tricks.com/come-to-the-light-dark-side/) 中推荐的方法。
```css
:root {
    color-scheme: light dark;
}

.element {
    /* fallback 的颜色,当用户浏览器不支持 color: light-dark(black, white); 时,回退到这个颜色 */
    color: black;
    /* light mode 下 color 用 black, dark mode 下 color 用 white */
    color: light-dark(black, white);
    background-color: white;
    background-color: light-dark(white, black);
}

3. 页面上通过 <select> 去切换 <meta name="color-scheme"> 的值,用 localStorage记住读者选择的 color-scheme

一些坑

dark mode 下 iframe 的处理

<iframe> 是不受 style.css 的影响,为了能够适配 color-scheme,我会遍历页面上所有的 iframe,然后在他们的 contentDocument 设置 color-scheme 属性。

这里也会存在一个时机的问题,需要在 iframe 加载完成后再设置 color-scheme 才行,不然 color-scheme 无法生效,实现上是通过监听 iframe 的 load evnet进行设置的。