三种方式实现主题切换方案
前端主题切换
有些时候我们在网站上会进行夜间/白天模式的切换。
这里我们介绍一种流行的切换模式 css变量 + 动态类名来进行切换
非常的简单。废话不多说。我们直接上代码。
第1种是通过 类名和变量来实现的
第2种是通过 属性和变量还实现的
最后1种 给body加 filter: invert(1);
设置两种模式的颜色
//白天模式 body { --site-config-color-bar: #fff; // --site-config-color-text: #555; // --site-config-color-border: rgba(0, 0, 0, 0.12); // --site-config-color-shadow: #eee; // --site-config-color-introduce-border: #2196f3; // --site-config-color-primary: #2196f3; // --site-config-color-side-bar: #3a7afe; // --site-config-color-side-bar-active-background: #3a7afe1a; // } //夜间模式 body.dark { --site-config-color-bar: #1e1e1e; // --site-config-color-text: #fff; // --site-config-color-border: #333; // --site-config-color-shadow: #121212; // --site-config-color-introduce-border: #555; // --site-config-color-primary: #96cbfe; // --site-config-color-side-bar: #4a7afe; // --site-config-color-side-bar-active-background: #4a7afe1a; // } ps:将这两种模式的代码放置在全局中。比如app.vue文件中。 反正要在项目的全局中可以使用就行了。
通过给body设置dark类名和移除类名来显示夜间和白天
<template> <div> <div class="top-header"> 我是顶部的标题 <button class="change-btn" @click="changeBgHandler">切换皮肤</button> </div> <div class="cont-box"> <div class="left-asider-box"> <div class="item-cont-css" :class="{activecss:item.id==1}" v-for="(item,index) in leftData" :key="index"> {{item.name}} </div> </div> <div class="center-cont"> <h3 class="h3-css">我是标题</h3> <div class="top-center-header"> <p class="p1-cont" v-for="item in 10" :key="item"> {{ item}} 组件库使用中文作为默认语言,支持多语言切换,内置支持 <a> 中文</a>,<a>英文</a>。 </p> </div> </div> </div> </div> </template> <script> export default { data() { return { msg: 'xx', leftData: [ { name: '优秀的功能1', id: 1 }, { name: '优秀的功能2', id: 2 }, { name: '优秀的功能3', id: 3 }, {name:'优秀的功能4', id:4}, {name:'优秀的功能5', id:5}, { name: '优秀的功能6', id: 6 }, { name: '优秀的功能7', id: 7 }, { name: '优秀的功能8', id: 8 }, {name:'优秀的功能9', id:9}, {name:'优秀的功能10', id:10}, {name:'优秀的功能11', id:11}, {name:'优秀的功能12', id:12}, { name: '优秀的功能13', id: 13 }, {name:'优秀的功能14', id:14}, { name: '优秀的功能15', id: 15 }, { name: '优秀的功能16', id: 16 }, { name: '优秀的功能17', id: 17 }, {name:'优秀的功能18', id:18}, { name: '优秀的功能19', id: 19 }, { name: '优秀的功能20', id: 20 }, { name: '优秀的功能21', id: 21 }, { name: '优秀的功能22', id: 22 }, { name: '优秀的功能23', id: 23 }, { name: '优秀的功能24', id: 24 }, ], } }, methods: { changeBgHandler() { if (!document.body.className) { document.body.className = "dark" } else { document.body.className = "" } } } } </script> <style lang="scss" scoped> .top-header{ height: 46px; line-height: 46px; text-align: center; background: var(--site-config-color-bar); border-bottom: 1px solid var(--site-config-color-border); color: var(--site-config-color-text); position: relative; .change-btn { position: absolute; right: 20px; top: 14px; } } .cont-box { display: flex; background: var(--site-config-color-bar); .left-asider-box { width: 240px; box-shadow: 0 8px 12px var(--site-config-color-shadow); background: var(--site-config-color-bar); .item-cont-css { cursor: pointer; padding-left: 20px; height: 40px; line-height: 40px; color: var(--site-config-color-text); } .activecss { color: var(--site-config-color-side-bar); background: var(--site-config-color-side-bar-active-background); transition: color .2s; } } } .center-cont{ padding-left: 20px; padding-right: 20px; flex:1; .h3-css { color: var(--site-config-color-text); margin-top: 10px; margin-bottom: 10px; } .top-center-header { border-radius: 4px; background: var(--site-config-color-bar); padding: 20px; margin-bottom: 30px; box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px rgba(0, 0, 0, 0.14), 0 1px 5px rgba(0, 0, 0, 0.12); } .p1-cont { height: 20px; color: var(--site-config-color-text); } .p1-cont a { color: var(--site-config-color-primary); } } </style>
这些网站有夜间模式
https://varlet.gitee.io/varlet-ui/#/zh-CN/home
第2种-变量+属性
全局的颜色样式-app.vue中
<style lang="scss"> *{ padding: 0; margin: 0; } /* 默认白天主题 */ :root { --bg-color: #fff; --text-color: #555; // 白天的颜色放置在这里 } /* 夜间模式主题 */ :root[theme='light'] { --bg-color: #1e1e1e; --text-color: #fff; // 页面模式的放置在这里 } // 设置整个页面的背景色 html,body{ background-color: var(--bg-color); } </style>
在页面中的使用
<template> <div> <div class="center-cont"> <h3 class="h3-css">我是标题</h3> <div class="top-center-header"> <p class="p1-cont" v-for="item in 10" :key="item">{{ item}}组件库使用中文作为默认语言,支持多语言切换,内置支持 <a> 中文</a>,<a>英文</a>。</p> </div> </div> <button class="change-btn" @click="changeBgHandler">切换皮肤</button> </div> </template> <script> export default { methods: { changeBgHandler() { if (document.documentElement.getAttribute('theme')) { document.documentElement.removeAttribute('theme') } else { document.documentElement.setAttribute('theme', 'light') } } } } </script> <style lang="scss" scoped> .center-cont{ background: var(--bg-color); .h3-css{ color: var(--text-color); } .p1-cont{ color: var(--text-color); } } </style>
还有没有更加简单的切换模式 --有的
给body加 filter: invert(1);
但是这一种只能够临时解决问题。