目录
背景
(强烈推荐)实现方法1:CSS中原生变量“--”和var()
步骤1:定义css变量
步骤2:使用CSS变量
步骤3:切换主题
实现完整案例
实现方法2:link 动态引入
背景
我们需要做一个功能,类似动态换肤这种功能。实现方式无非两种,一种是css变量、另一种是link动态引入
(强烈推荐)实现方法1:CSS中原生变量“--”和var()
步骤1:定义css变量
属性名:
- 属性名必须使用 --开头
- 在:root中定义(root后面的参数用来区分是哪个主题样式 :root[theme='主题名称'])
- 可以是数字、字母、下划线、中划线
属性值:
- css普通属性可以用的,比如:数字、文本、带单位的长度、角度等等都可以作为属性值
注意点
- 大小写敏感:大写 和 小写 不同 的2个属性名,将会是2个属性
- 计算时有效性:自定义属性值可以是任何内容,甚至可能不是css的有效数值,但这并不影响定义,只要保证在使用css自定义属性的地方,最终的计算结果是有效的就可以了。
案例
/* 默认主题 */:root {--color: yellow}/* 蓝色主题 */:root[theme='blue'] {--color: blue}/* 红色主题 */:root[theme='red'] {--color: red}
步骤2:使用CSS变量
- css提供了一个var()方法,进行自定义属性值的获取。可以在多个地方获取到自定义的属性值。
- css也提供了calc()方法,进行数值的计算。它里面就可以通过var()使用自定属性的值进行计算。
:root {--size: 100px;
}div1 {width: var(--size);
}div2 {width: calc(var(--size) - 2px);
}
步骤3:切换主题
思路
切换html标签上的theme属性的值,来实现切换对应的主题。
theme属性的值为root后的参数 主题名称(:root[theme="主题名称"]),如果无theme,或者未匹配上对应的就使用,默认的root。
document.documentElement.setAttribute('theme', "要切换的主题名称")
实现完整案例
<!DOCTYPE html>
<html lang="en" theme="blue"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<style>/* 默认主题 */:root {--color: yellow}/* 蓝色主题 */:root[theme='blue'] {--color: blue}/* 红色主题 */:root[theme='red'] {--color: red}h1 {color: var(--color)}
</style><body><h1>点击我切换主题</h1>
</body>
<script>const data = document.getElementsByTagName('h1')data[0].onclick = () => {document.documentElement.setAttribute('theme', "red")}
</script></html>
实现方法2:link 动态引入
通过改变link 标签的 href 属性实现动态修改样式(暂不推荐这种方案)
优点:实现了按需加载,提高了性能;
缺点:动态加载样式文件,可能会因为网络问题导致样式加载过慢;
可维护性较差,后续新增或修改主题较为麻烦。