方法一:link标签动态引入
流程
准备几套CSS主题样式文件,在切换主题时,动态改变link标签的href属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <head> <link href="dark.css"></link> </head> <body> <button onclick="changeTheme()"> 切换主题 </button> <script> function changeTheme(){ var links = document.getElementByTagNames('link'); links[0].href = "light.css"; } </script> </body>
|
优点
缺点
- 动态加载样式,文件过大网络情况不佳时可能会导致加载延迟,样式切换不流畅
- 主题样式表内样式定义不当时,会有优先级问题
- 各个主题样式是写死的,后续针对某一主题样式表修改或新增主题比较麻烦
方法二:提前引入主题样式,做类名切换
流程
提前将样式全部引入,在需要切换主题的时候将指定的根元素类名切换。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| <head> <style> body.light .box{ color: #f90; background: #fff; } body.dark .box{ color: #eee; background: #333; } .box{ width: 100px; height: 100px; border: 1px solid #000; } </style> </head> <body> <div class="box"> <p>hello</p> </div> <p> <button onclick="change('light')">light</button> <button onclick="change('dark')">dark</button> </p> <script> function change(theme){ document.body.className = theme; } </script> </body>
|
优点
缺点
- 首屏加载的时候会牺牲一些时间加载样式资源
- 主题样式表内样式定义不当时,会有优先级问题
- 各个主题样式是写死的,后续针对某一主题样式表修改或新增主题比较麻烦
方法三:less的modifyVars
流程
引入less。创建public文件夹,在里面创建header.less和style.less文件,header.less用来写样式,style.less作为样式的入口。在入口html中,引入style.less。在切换主题的事件中调用modifyVars方法。
1 2 3 4 5 6 7 8 9 10 11 12
| @primary-color: #15eaf0; @success-color: #52c41a;
.header{ height: 80px; background-color: @primary-color; color: @success-color; }
@import 'header.less';
|
1 2 3 4 5 6 7 8 9 10 11 12
| <!doctype html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, minimal-ui" /> <title>xxxx</title> </head> <body> <link rel="stylesheet/less" type="text/css" href="../../public/style.less" /> <div id="root"></div> </body> </html>
|
1 2 3 4 5 6 7 8 9
| import '../../public/header.less'; import less from 'less'; const changeTheme = ()=>{ less.modifyVars({ 'primary-color': '#ff4fff', }).then(()=>{ console.log('修改成功'); }) }
|
优点