css - 在线主题切换(换肤)方案_个人文章 - SegmentFault 思否
在SaaS平台中需要实现千人千面,每个租户需要当前平台尽量跟客户公司其他系统在风格上保持一致。为了尽量减低成本,采取在线换肤的方式解决,做到同一系统线上同时支持任意套皮肤(主题)和新租户无需新的开发。
顺晟科技
2021-08-07 11:10:23
283
说起换肤功能,前端肯定不陌生,其实就是颜色值的更换,实现方式有很多,也各有优缺点
对于只提供几种主题方案,让用户来选择的,一般就简单粗暴的写多套主题
<body class=\'dark\'></body>
<link id=\'link_theme\' href="skin.css" rel="stylesheet" type="text/css"/>
<script>
document.getElementById(\'link_theme\').href=\'skin-dark.css\'
</script>
可以参看 Element-UI 的换肤实现,就是先把样式中颜色全部替换后在塞到<style>标签里面
modifyVars方法是是基于 less 在浏览器中的编译来实现。所以在引入less文件的时候需要通过link方式引入,然后基于less.js中的方法来进行修改变量
// styles.less
@color: red;
.card {
color: @color;
}
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet/less" type="text/css" href="styles.less" />
<script src="//cdn.jsdelivr.net/npm/less"></script>
</head>
<body>
<div class="card">
card
</div>
<button id="themeBtn">更改颜色</button>
</body>
<script>
document.getElementById("themeBtn").addEventListener(\'click\', function () {
let color = \'#\' + Math.floor(Math.random() * 256 * 1000000000).toString(16).slice(0, 6)
less.modifyVars({
\'@color\': color
}).then(() => {
console.log(`color: ${color}F`);
});
})
</script>
css 原生变量 兼容性,大部分主流浏览器还是支持的,而且主要是操作起来够简便。
定义变量
// 加上前缀 -- 就可以了
:root{
--color:red;
}
//使用 当--color 不生效的时候会使用后面参数替代
body:{
color:var(--color,#000)
}
使用 js 去修改
// 获取根
let root = document.documentElement;
root.style.setProperty(\'--color\', \'#f00\');
如果需要动态替换颜色主题,使用第二种比较合适也方便.如果每套主题有很大差异性不仅仅只是颜色的替换,种的方式就好了很多,使用第二种就不太合适了.如果都需要满足也可以两种相结合使用
17
2022-11
22
2022-10
19
2022-10
19
2022-10
19
2022-10
19
2022-10