如果你写过 CSS,可能会遇到这样的场景:同一个颜色值在好几个地方重复写,改起来得满页面找;或者想让主题切换更丝滑,却发现得改一堆样式。CSS 变量(也叫 CSS 自定义属性)就是来解决这些问题的“魔法”。它让样式管理更灵活、可维护,今天我们就来聊聊 CSS 变量的那些事儿,尽量说得接地气又实用。
CSS 变量是个啥?
CSS 变量,官方叫“CSS 自定义属性”(Custom Properties),简单说就是让你在 CSS 里定义可复用的值,类似编程里的变量。它的核心功能是把值存储在一个地方,然后在多个地方引用,改的时候只改一处就行。
基本语法长这样:
:root {
--main-color: #3498db;
--font-size: 16px;
}
.element {
color: var(--main-color);
font-size: var(--font-size);
}
--main-color
就是变量名,定义在 :root
(全局作用域)里,var()
是用来引用变量的函数。如果想改颜色,只需改 --main-color
的值,整个页面用它的地方都会更新。
为什么用 CSS 变量?
提高复用性
不用到处复制粘贴颜色、尺寸等值,改一处,全局生效。比如,品牌色改了,直接更新变量就完事。主题切换更简单
想做暗色模式?定义两套变量(亮色和暗色),切换时只改变量值,样式自动更新。动态调整
CSS 变量可以结合 JavaScript 动态修改,比如根据用户交互改变颜色或布局。语义化命名
变量名可以写得更有意义,比如--primary-color
比#3498db
更直观,维护起来也方便。比预处理器更灵活
像 Sass 或 Less 也有变量,但 CSS 变量是原生的,运行时可动态修改,不需要重新编译。
怎么用 CSS 变量?
1. 定义变量
通常在 :root
里定义全局变量,:root
相当于 HTML 的顶层元素,作用域覆盖整个页面:
:root {
--primary-color: #3498db;
--secondary-color: #2ecc71;
--padding: 20px;
}
也可以在具体元素上定义局部变量,只对该元素及其子元素生效:
.card {
--card-bg: #f0f0f0;
background: var(--card-bg);
}
2. 使用变量
通过 var()
函数引用变量:
button {
background: var(--primary-color);
padding: var(--padding);
}
如果变量未定义,可以设置一个默认值:
.element {
color: var(--undefined-color, #000); /* 如果 --undefined-color 不存在,用 #000 */
}
3. 动态修改变量
CSS 变量的强大之处在于可以通过 JavaScript 动态修改。假设要切换主题:
<button onclick="toggleTheme()">Toggle Theme</button>
<style>
:root {
--bg-color: #ffffff;
--text-color: #333333;
}
body {
background: var(--bg-color);
color: var(--text-color);
}
</style>
<script>
function toggleTheme() {
const root = document.documentElement;
const isDark = root.style.getPropertyValue('--bg-color') === '#ffffff';
root.style.setProperty('--bg-color', isDark ? '#333333' : '#ffffff');
root.style.setProperty('--text-color', isDark ? '#ffffff' : '#333333');
}
</script>
点击按钮,页面背景和文字颜色会切换,简单实现暗色模式。
4. 作用域与层叠
CSS 变量遵循作用域规则,局部变量会覆盖全局变量:
:root {
--color: blue;
}
.card {
--color: red; /* 局部覆盖 */
color: var(--color); /* 用 red */
}
.card p {
color: var(--color); /* 继承 card 的 red */
}
这让变量在不同组件或模块中可以灵活调整。
CSS 变量的妙用场景
1. 主题切换
前面提到了暗色模式,CSS 变量在这方面特别好使。定义多套主题变量,切换时只改 :root
里的值:
:root {
--bg-color: #ffffff;
--text-color: #333333;
}
[data-theme="dark"] {
--bg-color: #333333;
--text-color: #ffffff;
}
通过 JavaScript 或 HTML 属性切换主题:
document.documentElement.setAttribute('data-theme', 'dark');
2. 响应式设计
可以用变量动态调整布局,比如根据屏幕大小改变间距或字体:
:root {
--base-spacing: 10px;
}
@media (min-width: 768px) {
:root {
--base-spacing: 20px;
}
}
.element {
margin: var(--base-spacing);
}
小屏幕用 10px 间距,大屏幕自动变成 20px。
3. 动画与交互
CSS 变量可以结合 :hover
或 JavaScript 做动态效果。比如,按钮悬停时改变颜色:
button {
--btn-color: #3498db;
background: var(--btn-color);
transition: background 0.3s;
}
button:hover {
--btn-color: #2980b9;
}
4. 统一设计系统
在大型项目中,CSS 变量可以用来定义设计系统的核心值,比如颜色、字体、间距。团队成员直接引用变量,确保一致性:
:root {
--primary: #6200ea;
--secondary: #03dac6;
--font-stack: 'Arial', sans-serif;
}
.component {
color: var(--primary);
font-family: var(--font-stack);
}
注意事项与技巧
- 浏览器兼容性
CSS 变量在现代浏览器(Chrome、Firefox、Safari、Edge)中支持很好,IE11 不支持。如果需要兼容 IE11,可以用 CSS 预处理器(如 Sass)作为备用,或者用固定的值做降级处理:
.element {
color: #3498db; /* 降级值 */
color: var(--primary-color, #3498db); /* CSS 变量 */
}
命名规范
变量名以--
开头,建议用语义化的名字,比如--primary-color
而不是--color1
。可以用前缀区分模块,比如--button-bg
、--card-bg
。性能
CSS 变量在运行时解析,性能比固定值略差,但影响微乎其微。除非你定义了成百上千个变量,否则不用太担心。调试
在浏览器开发者工具中,CSS 变量会显示为var(--name)
,可以直接看到引用的值。如果变量未定义,检查作用域或拼写错误。与 calc() 结合
CSS 变量可以和calc()
一起用,做动态计算:
:root {
--base-size: 16px;
}
.element {
font-size: calc(var(--base-size) * 1.5);
}
CSS 变量的优缺点
优点
- 复用性强:集中管理样式,修改方便。
- 动态性:支持 JavaScript 动态修改,适合交互和主题切换。
- 原生支持:无需预处理器,浏览器直接解析。
- 作用域灵活:支持全局和局部变量,适配不同场景。
缺点
- 兼容性:IE11 不支持,需要降级方案。
- 学习成本:新手可能需要适应变量的定义和引用方式。
- 运行时解析:相比固定值,性能略低(但影响不大)。
一个小例子:主题切换的卡片组件
下面是一个用 CSS 变量实现的卡片组件,支持主题切换:
<!DOCTYPE html>
<html>
<head>
<style>
:root {
--card-bg: #ffffff;
--card-text: #333333;
--card-border: #e0e0e0;
}
[data-theme="dark"] {
--card-bg: #333333;
--card-text: #ffffff;
--card-border: #555555;
}
.card {
background: var(--card-bg);
color: var(--card-text);
border: 1px solid var(--card-border);
padding: 20px;
border-radius: 8px;
width: 300px;
margin: 20px auto;
transition: all 0.3s;
}
button {
padding: 10px;
cursor: pointer;
}
</style>
</head>
<body>
<button onclick="toggleTheme()">Toggle Theme</button>
<div class="card">
<h2>Sample Card</h2>
<p>This is a card with dynamic theming using CSS variables.</p>
</div>
<script>
function toggleTheme() {
const root = document.documentElement;
const currentTheme = root.getAttribute('data-theme');
root.setAttribute('data-theme', currentTheme === 'dark' ? '' : 'dark');
}
</script>
</body>
</html>
点击按钮,卡片的背景、文字和边框颜色会切换,丝滑又直观。
总结
CSS 变量就像样式表的“超级助手”,让你的代码更简洁、可维护,还能轻松实现主题切换、响应式设计和动态交互。它的原生支持和灵活性让前端开发省心不少,尤其在大型项目或设计系统中更是如鱼得水。虽然有兼容性问题,但现代浏览器支持良好,降级方案也能搞定。希望这篇博客能让你对 CSS 变量有更深的理解,赶紧试试在你的项目里用起来吧!有啥好玩的 CSS 变量用法,欢迎留言分享!
点个收藏,关注前端结城,一起用代码点亮前端世界!🚀