什么是 CSS 变量
在 CSS 中,在整个代码中重复使用单一颜色或文本大小是很普遍的,这意味着在整个文档中多次重复使用相同的颜色或文本大小。 使用 CSS 变量,可以将颜色或文本大小值分配给变量,并在多个位置使用。 与使用传统 CSS 值相比,这使更改值更容易并且更方便。 如果不懂 CSS 变量 的话可以去看 这篇文章 CSS 变量
具体实现
创建两个保存不同样式的 JS 文件,把 CSS变量挂载到根元素上,在指定的元素上面使用 CSS变量 ,在切换主题的时候动态改变 Vuex 中的主题标识,动态切换不同的样式。
主要逻辑
import lightStyle from './light'
import drakStyle from './drak'
export function getThemeMap(theme = 'light') {
return theme == 'light' ? lightStyle : drakStyle
}
export function setTheme(theme = 'light') {
const themeMap = getThemeMap(theme)
let body = document.body
Object.keys(themeMap).forEach(key => {
body.style.setProperty(`--${key}`, themeMap[key])
})
}
light 文件
export default {
color: 'black',
background: '#f3f3f3'
}
drak 文件
export default { color: ‘#fff’, background: ‘#999’ }
使用变量
<template>
<div class="theme">
<button @click="handleCheckTheme">{{GET_THEME}}</button>
<p>themethemethemethemethemethemethemethemethemethemethemethemethemethemethemethemethemethemethemethemetheme</p>
</div>
</template>
<script>
import { mapGetters } from "vuex";
import { setTheme } from "./theme";
export default {
computed: {
...mapGetters(["GET_THEME"]),
},
mounted() {
setTheme();
},
methods: {
handleCheckTheme() {
let theme = this.GET_THEME == "light" ? "drak" : "light";
setTheme(theme);
this.$store.commit("SET_THEME", theme);
},
},
};
</script>
<style lang="scss" scoped>
.theme {
width: 100%;
height: 100%;
color: var(--color);
background: var(--background);
}
</style>
效果参考
drak 模式
light 模式
以上即可实现使用 CSS变量 切换主题色的功能,如有疑问敬请留言 ~
|