在网上找了很多的换肤方案,其中我认为写的最好的也是有demo 的无疑是这篇,但是同时也发现了一些问题,就是太多方案不知道选哪个,而且没有做持久化处理,并且没有把图片切换的代码放在一起。我这边的需求是需要换背景,同时也是需要切换图片的,为了大家便于理解,于是我根据他的demo改写了一下,做了持久化和图片的切换。
这篇文章写的换肤的方案有很多种,但是根据多方的调查以及搜索,最终我这边确定的是通过 CSS变量兼容性实现-2 这个方案来做的,最大的原因是便于维护,且不会对现有项目做很大的变更。这个方案也是一个比较成熟且很多人都在用的一种换肤方案。
1.首先需要建一个存放公共css变量的js文件,将需要定义的css变量存放到该js文件,例如
(variable.js)
// 字体变量
const baseSize = {
"--font-size-large-x": "22px",
"--font-size-large": "18px",
"--font-size-medium": "14px",
"--font-size-medium-x": "16px",
"--font-size-small-s": "10px",
"--font-size-small": "12px",
};
//浅色
export const lightTheme = {
"--left-bg": "rgb(182, 23, 23)",
"--right-bg": "rgb(63, 9, 9)",
"--top-bg": "rgb(6, 36, 65)",
"--bottom-bg": "rgb(55, 214, 10)",
...baseSize,
};
// 深色
export const darkTheme = {
"--left-bg": "#0094ff",
"--right-bg": "blue",
"--top-bg": "red",
"--bottom-bg": "pink",
...baseSize,
};
2.页面中使用css变量,例如:
<style lang="less">
.left {
background-color: var(--left-bg);
height: 500px;
flex: 1;
}
</style>
3.安装css-vars-ponyfill 插件
npm i css-vars-ponyfill
❝
「css-vars-ponyfill」 官方概念:在传统浏览器和现代浏览器中为CSS自定义属性(又名“CSS变量”)提供客户端支持的ponyfill。 (具体用法与概念请查阅官方网站:「css-vars-ponyfill」)
❞
4.封装切换主题的js,在main.js做初始化调用
// theme.js
import { lightTheme, darkTheme } from "../src/assets/js/variable";
import cssVars from "css-vars-ponyfill";
export const initTheme = (theme) => {
document.documentElement.setAttribute("data-theme", theme ? "light" : "dark");
cssVars({
watch: true, // 当添加,删除或修改其或