方法一:link标签动态引入

流程

​ 准备几套CSS主题样式文件,在切换主题时,动态改变link标签的href属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 准备dark.css和light.css -->
<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方法。

  • header.less与style.less
1
2
3
4
5
6
7
8
9
10
11
12
// header.less
@primary-color: #15eaf0;
@success-color: #52c41a;

.header{
height: 80px;
background-color: @primary-color;
color: @success-color;
}

// style.less
@import 'header.less';
  • 在入口html文件中引入style.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>
  • 在切换主题的事件中调用modifyVars方法
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('修改成功');
})
}

优点

  • 样式颜色修改灵活