目录
背景
(强烈推荐)实现方法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 属性实现动态修改样式(暂不推荐这种方案)
优点:实现了按需加载,提高了性能;
缺点:动态加载样式文件,可能会因为网络问题导致样式加载过慢;
可维护性较差,后续新增或修改主题较为麻烦。