换肤
方案一:CSS 样式覆盖实现
核心原理:
通过切换 css 选择器的方式实现主题样式的切换.
- 在组件中保留不变的样式,将需要变化的样式进行抽离
- 提供多种样式,给不同的主题定义一个对应的 CSS 选择器
- 根据不同主题设置不同的样式
css
/* 通过 .light 和 .dark 两个类选择器来区分明亮主题和暗黑主题,
并且事先准备了它们对应的样式 */
/* light 默认主题*/
body.light {
background-color: #fff;
}
/* dark 暗黑主题 */
body.dark {
background-color: rgb(51, 50, 50);
}
缺点:
- 多种主题样式都要引入,导致代码量增大
- 当主题样式复杂时,需要维护大量的 CSS 类和规则,可能导致 CSS 文件臃肿
方案二:多套 CSS 主题样式
核心原理
: 根据用户切换操作,通过 link 标签动态加载不同的主题样式,解决所有主题打包到一个文件导致体积过大问题
js
// 关键代码
function swapStylesheet(themeurl) {
document.getElementById("themelink").setAttribute("href", themeurl);
}
缺点:
- 需要预先把
多套主题的样式都编译好
并存储在服务器上,增加了资源占用。且如果主题数量较多,可能会影响首次加载速度 - 需要提前知道打包后的文件路径,否则可能导致主题样式引入错误
方案三:CSS 自定义变量
缺点:
对老版本浏览器兼容性较差,需要做兼容处理。同时,CSS 变量无法在 IE 浏览器中使用
MDN 解释:
var() CSS 函数可以插入一个自定义属性(有时也被称为“CSS 变量”)的值,用来代替非自定义属性中值的任何部分
css
/* default css */
:root {
--primary-color: #3498db;
--secondary-color: #2ecc71;
--text-color: #333;
}
/* test2.css */
:root {
--primary-color: #34db58;
--secondary-color: #cc2e2e;
--text-color: #6520dc;
}
js
// 关键函数: 通过link标签外链切换主题样式
function changeTheme() {
let link = document.getElementById("themelink");
link.setAttribute(
"href",
link.href.includes("default.css") ? "test2.css" : "default.css"
);
}
</script