我一直在寻找一种既可以自动切换又可切换的移动端高效暗黑模式主题。通过“移动端高效”,我指的是高延迟、低带宽、低CPU占用:
- 仅在需要时加载相关样式表(当浅色模式激活时,不会加载暗黑样式表,反之亦然),以节省带宽
- 无全屏闪烁
- 无 cookie
我发现的解决方案没有这些属性,它们要么使用一个灰色CSS来组合两个主题,要么使用两个样式表,这可能导致全屏闪烁,当用户选择与系统默认设置不同的主题时(因为它们是通过在DOM中引用样式表之后执行的JS来控制的)。
到目前为止,我找到的最好的替代方案是“高效”的,但它依赖于文档头部的小型内联脚本中的document.write,例如:
let theme = localStorage.getItem("theme");
if (!theme) {
theme = (window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches)?"dark":"light"
}
if (theme == "dark") {
document.write('<link rel="stylesheet" href="dark.theme.css" />');
} else {
document.write('<link rel="stylesheet" href="light.theme.css" />');
}
localStorage的条目在用户手动切换时由常规JS管理。
我尝试了所有改变链接DOM元素的方法,但它们都失败了,导致页面闪烁或CSS加载延迟(未呈现的HTML会暂时可见)。
我想知道是否有一种方法既高效、支持开关,又不依赖于document.write?