网站跟随系统浅/深色模式的方式
本篇文章皆指网站自动跟随系统浅/深色模式,因此无需用户进行手动切换,也不存在需要进行任何前端缓存的问题。
本文教程支持JS或CSS两种方法来处理网站跟随系统浅/深色模式。
一、基于JS的方法
通过JavaScript来获取系统的浅/深色模式,如下代码可以判断出系统当前是否为浅/深色模式:
if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
console.log('dark')
} else {
console.log('light')
}
上述代码做出了判断但还不够,还需要对HTML进行一些改造。
if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
document.documentElement.classList.add("dark");
}
如果当前系统为深色模式,上述JS会自动在页面HTML标签上加上一个名为“dark”的Class值,此段代码我们可以放置在HTML标签的上面一行中,在页面加载前便需要执行。
监听模式变化
经过测试发现,上述代码存在一个问题,如果用户先打开了网站,而后在进行了系统颜色模式切换且未刷新网站页面,网站一时间无法做出完美跟随,所以还需要对系统颜色模式进行实时监听,需要使用addEventListener方法。
window.matchMedia("(prefers-color-scheme: dark)").addEventListener('change', function(e) {
if (e.target.matches) {
document.documentElement.classList.add("dark");
}
});
监听 + 判断才能完美实现跟随,最终代码如下,需放置在HTML标签的上面。
const themeMedia = window.matchMedia("(prefers-color-scheme: dark)");
if (themeMedia.matches) {
document.documentElement.classList.add("dark");
}
themeMedia.addEventListener('change', function(e) {
if (e.target.matches) {
document.documentElement.classList.add("dark");
}
});
之后便可以编写深色模式CSS了,在样式选择器前加上“.dark”即可,适当配合“!important”的使用。
二、基于CSS的方法
在CSS中可以使用利用媒体属性 preferred-color-scheme,如下代码示例。
@media (prefers-color-scheme: light) {
body {
background: #fff;
color: #333;
}
}
@media (prefers-color-scheme: dark) {
body {
background: #2a2a2b;
color: #fff;
}
}
将浅/深模式不同元素的颜色样式放置于不同媒体属性中即可。