CSS 变量,也叫自定义属性,是现代 CSS 中非常实用的能力。它可以把颜色、间距、字号、圆角、阴影等设计参数统一管理,让主题切换、组件复用和样式维护变得更轻松。
以前我们经常在多个 CSS 文件里重复写同一个颜色值,改主题时要全局搜索替换,很容易漏掉。使用 CSS 变量后,可以把这些值集中定义,再在组件中引用。本文从基础语法讲起,再介绍主题切换、颜色管理和组件复用技巧。
基础语法
CSS 变量使用双短横线开头定义,通过 var() 函数读取。通常会把全局变量定义在 :root 上,让整个页面都能访问。
:root {
--primary-color: #1677ff;
--text-color: #1f2937;
--border-radius: 8px;
}
.button {
color: #fff;
background: var(--primary-color);
border-radius: var(--border-radius);
}
变量名应该表达含义,而不是只描述颜色本身。比如 --primary-color 比 --blue 更适合长期维护,因为主题切换后主色不一定还是蓝色。
作用域
CSS 变量有作用域。定义在 :root 上是全局变量,定义在某个组件选择器里,则只在该组件及其子元素中生效。
.card {
--card-padding: 20px;
padding: var(--card-padding);
}
局部变量适合组件内部参数,比如卡片内边距、按钮高度、局部背景色。这样组件复制到其他页面时,也更容易调整。

默认值
var() 可以设置默认值。当变量不存在时,浏览器会使用默认值,避免样式完全失效。
.tag {
background: var(--tag-bg, #f3f4f6);
color: var(--tag-color, #374151);
}
默认值适合可选配置项。组件如果允许外部覆盖变量,但又需要在没有配置时正常显示,就可以给 var() 加默认值。
主题切换
CSS 变量最常见的用途是主题切换。可以在根节点或 body 上切换一个主题类,再覆盖变量值。
:root {
--bg-color: #ffffff;
--text-color: #111827;
}
.theme-dark {
--bg-color: #111827;
--text-color: #f9fafb;
}
body {
background: var(--bg-color);
color: var(--text-color);
}
当页面切换到深色主题时,不需要改每个组件的样式,只要改变量值,引用这些变量的组件就会自动更新。
配合 JavaScript
如果需要让用户手动选择主题,可以通过 JavaScript 给根元素添加主题类,或者直接修改变量值。
document.documentElement.classList.toggle('theme-dark');
对于简单主题切换,切换 class 更清晰;对于用户自定义颜色、动态品牌色等场景,可以直接设置变量值。
document.documentElement.style.setProperty('--primary-color', '#22c55e');
颜色管理
做颜色管理时,不建议只按色值命名变量,比如 --red、--blue。更推荐按语义命名,比如 --color-primary、--color-danger、--color-muted、--color-border。
:root {
--color-primary: #1677ff;
--color-danger: #dc2626;
--color-border: #e5e7eb;
--color-muted: #6b7280;
}
语义命名能让样式更稳定。即使以后品牌主色从蓝色换成紫色,变量名仍然不用改,只需要调整变量值。
组件复用
组件可以通过 CSS 变量暴露可配置项。比如按钮组件可以支持不同主色、圆角和高度,而不必写大量额外 class。
.button {
--button-bg: var(--color-primary);
--button-radius: 8px;
background: var(--button-bg);
border-radius: var(--button-radius);
}
外部页面可以覆盖这些变量,实现局部定制。
.danger-area .button {
--button-bg: var(--color-danger);
}
这种方式比复制一套按钮样式更好维护,也更适合设计系统和组件库。
响应式参数
CSS 变量也可以配合媒体查询使用。比如在桌面端和移动端设置不同间距。
:root {
--page-padding: 32px;
}
@media (max-width: 768px) {
:root {
--page-padding: 16px;
}
}
页面中所有引用 --page-padding 的地方都会自动响应变化。这样比在多个组件里重复写媒体查询更统一。
计算与组合
CSS 变量可以和 calc() 配合,做一些简单计算。
:root {
--space: 8px;
}
.card {
padding: calc(var(--space) * 3);
}
这样可以建立统一的间距体系。比如以 4px 或 8px 为基础单位,再通过倍数生成页面间距。
常见错误
第一种错误是变量名太随意,后续没人知道该怎么用。第二种错误是把所有值都变量化,导致样式表反而难读。第三种错误是按颜色命名而不是按语义命名,主题切换时容易混乱。
还有一种问题是变量层级太深,一个变量套另一个变量,最后排查样式来源很麻烦。变量应该让维护更简单,而不是制造新的复杂度。
实践建议
可以先从颜色、字号、间距、圆角、阴影这些全局设计参数开始变量化。组件内部再定义少量局部变量,用于暴露可配置项。主题切换时,只覆盖语义变量,不要到处改具体组件样式。
CSS 变量最适合用来建立设计一致性。它不是为了替代所有 CSS,而是把频繁复用、需要统一管理、可能被主题覆盖的值抽出来。用得克制,维护体验会明显变好。














暂无评论内容