携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
css变量
CSS中的变量是一个有用的和强大的功能,它能让我们的开发更容易、维护更快、定制化更简单。
兼容
使用caniuse.com看看兼容性。
可以看到兼容性还是不错的,毕竟现在已经没有IE了。
开始定义 CSS 变量
CSS 变量是名称以两个破折号开头的任何属性。
.test {
color: #1f1ff1;
--color: blue;
}
变量具有范围
CSS 变量可分为全局变量(global) 和局部变量(local)
global
:root 将定义最高级别根元素,用于全局范围,它与 scss 等预处理器不同,使用的时候需要用 var()
:root {
--primary-color: #1f1ff1;
}
/*使用*/
.test {
color: var(--primary-color)
}
local
局部变量
.test {
--local-primary-color: #1f1f1f;
}
.test.testA {
color: var(--local-primary-color)
}
.test .child {
color: var(--local-primary-color)
}
变量可以设置默认值
很简单,第二个参数就是这个变量的默认值,没有定义的时候使用
.test {
background-color: var(--color, blue);
}
例子一:使用 CSS 创建组件差异变量
有两个或者很多个基本风格相同,边框与背景颜色不同的按钮。
<button class="btn">默认</button>
<button class="btn red">红色</button>
如果不知道变量,你可能会这样写:
.btn {
background: transparent;
border: 2px solid black;
}
.btn:hover {
cursor: pointer;
background: black;
color: white;
}
.btn.red {
border-color: red;
}
.btn.red:hover {
background: red;
}
看起来效果还不错,但是如果现在需要 绿色、蓝色、...,是不是每次都要复制这段代码去修改
.btn.green {
border-color: green;
}
.btn.green:hover {
background: green;
}
.btn.blue {
border-color: blue;
}
.btn.blue:hover {
background: blue;
}
/*
...
*/
更好的方式
我们可以用 CSS 变量替换不同的颜色,添加一个变量的默认值,比如只有 btn,那它的 hover 效果就是 black
那么,你只需要在每个类提供一个变量就行了
<button class="btn">默认</button>
<button class="btn red">红色</button>
<button class="btn green">绿色</button>
<button class="btn blue">蓝色</button>
.btn {
background: transparent;
border-radius: 2px;
border: 2px solid var(--color, #1f1f1f);
}
.btn:hover {
cursor: pointer;
background: var(--color, #1f1f1f);
color: white;
}
.btn.red {
--color: red;
}
/* 再多也不怕 */
.btn.green {
--color: green;
}
.btn.blue {
--color: blue;
}
.btn.yellow {
--color: yellow;
}
可以对比一下,能看出来区别还是很大的。
例子二:网站主题
现在基本很多网站都会有这种修改主题的操作了,比如在黑暗环境下,我们想切换暗黑模式,对眼睛会友好一点,而在平时,我们希望是光亮模式阅读文章等等。
思路:通过 JavaScript 更新 CSS样式,来达到效果,当点击按钮上的颜色,设置一个或者多个全局的 CSS 变量,然后使用了这些变量的元素会自动更新主题色。
<div class="btns">
<button value="dark">暗黑模式</button>
<button value="light">明亮模式</button>
<button value="cyan">自定义颜色cyan</button>
</div>
<div class="theme-text">test code</div>
使用变量,并且设置默认值,默认全局是白底黑字的主题。
body {
background-color: var(--bg, white);
color: var(--bg-text, black);
}
CSSStyleDeclaration.setProperty() 方法接口为一个声明了 CSS 样式的对象设置一个新的值。
root.style.setProperty('--bg', 'black')
// <html style="--bg:black">
现在知道了吧,我们在上面使用了这个变量,那么我们就可以点击按钮,获取按钮的 value 值,设置变量,也就实现了主题色的切换。
const root = document.documentElement
const oBtns = document.querySelectorAll('.btns > button')
const handleThemeUpdate = (e) => {
switch (e.target.value) {
case 'dark':
root.style.setProperty('--bg', 'black')
root.style.setProperty('--bg-text', 'white')
break
case 'light':
root.style.setProperty('--bg', 'white')
root.style.setProperty('--bg-text', 'black')
break
case 'cyan':
root.style.setProperty('--bg', 'cyan')
root.style.setProperty('--bg-text', 'white')
break
}
}
oBtns.forEach(btn => {
btn.addEventListener('click', handleThemeUpdate)
})
灵活使用 CSS 变量,不仅能够提高我们开发效率,也能够提高代码的可阅读性和维护性。