h5通过css进行深色模式切换

一、CSS 的媒体查询

prefers-color-scheme (https://developer.mozilla.org/zh-CN/docs/Web/CSS/@media/prefers-color-scheme) 是一种用于检测用户是否有将系统的主题色设置为亮色或者暗色的 CSS 媒体特性。利用其设置不同主题模式下的 CSS 样式,浏览器会自动根据当前系统主题加载对应的 CSS 样式。light 适配浅色主题,dark 适配深色主题,no-preference 表示获取不到主题时的适配方案。

    @media (prefers-color-scheme:light){
        /* 当系统是使用浅色模式 */
        body{
            background-color: #fff;
            color: #000;
        }
    }
    @media (prefers-color-scheme:dark){
        /* 当系统是使用深色模式 */
        body{
            background-color: #000;
            color: #fff;
        }
    }
    @media (prefers-color-scheme:no-preference){
        body{
            background-color: #fff;
            color: #000;
        }
    }

浅色模式效果如图:


image.png

深色模式效果如图:


image.png

二、使用window.matchMedia + CSS 的变量

window.matchMedia (https://developer.mozilla.org/zh-CN/docs/Web/API/Window/matchMedia) 方法可以用来查询指定的媒体查询字符串解析后的结果。结合 CSS 变量和 matchMedia 的查询结果,设置对应的 CSS 主题颜色。该方法更灵活,可以单独抽离主题色进行适配,深色模式匹配 (prefers-color-scheme: dark) ,浅色模式匹配 (prefers-color-scheme: light) 。

监听主题模式,深色模式时为 body 添加类名 dark,根据 CSS 变量的响应式布局特点,自动生效 dark 类名下的 CSS。

   .dark{
        background-color: #000000;
        color: #fff;
    }
<script>
    const darkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)');//匹配深色模式
    console.log(darkMode)
    // 判断是否匹配深色模式, matches为true代表当前系统是深色模式
    if (darkMode && darkMode.matches) {
        document.body.classList.add('dark');
    }
    // 监听主题切换事件
    darkMode && darkMode.addEventListener('change', e => {
    if (e.matches) {
        document.body.classList.add('dark');
    } else {
        document.body.classList.remove('dark');
    }
    });
</script>

浅色模式效果如图:


image.png

深色模式效果如图:

image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容