CSS 变量 (自定义属性)
CSS 变量(自定义属性)详解 · 难度:进阶 · +15XP
CSS 变量(自定义属性)详解
CSS 变量(Custom Properties)允许你在样式表中定义可重用的值,并在整个文档中引用它们。CSS 变量以 -- 为前缀,通过 var() 函数调用,极大地提升了样式代码的可维护性。
定义和使用 CSS 变量
通常将全局变量定义在 :root 选择器中,这样它们在整个文档中都可以使用。
:root {
--primary-color: #3498db;
--secondary-color: #2ecc71;
--text-color: #333333;
--bg-color: #f5f5f5;
--border-radius: 8px;
--spacing-unit: 16px;
--font-size-base: 16px;
--max-width: 1200px;
}
/* 使用变量 */
body {
color: var(--text-color);
background: var(--bg-color);
font-size: var(--font-size-base);
}
.btn-primary {
background: var(--primary-color);
border-radius: var(--border-radius);
padding: var(--spacing-unit) calc(var(--spacing-unit) * 2);
}
.container {
max-width: var(--max-width);
margin: 0 auto;
padding: 0 var(--spacing-unit);
}
var() 函数的后备值
当变量未定义时,可以提供一个后备值作为第二个参数:
/* 如果 --primary-color 未定义,使用 blue */
.header {
background: var(--primary-color, blue);
}
/* 多级后备:如果 --font-md 未定义,回退到 16px */
.text {
font-size: var(--font-md, 16px);
}
局部变量(组件级别)
变量不一定要定义在 :root,也可以定义在任意选择器内作为局部作用域:
.card {
--card-padding: 20px;
--card-bg: white;
--card-shadow: 0 2px 8px rgba(0,0,0,0.1);
padding: var(--card-padding);
background: var(--card-bg);
box-shadow: var(--card-shadow);
}
/* 子元素可以继承父级的变量 */
.card .title {
font-size: calc(var(--font-size-base) * 1.25);
}
结合 JavaScript 动态修改
// 读取 CSS 变量
const primaryColor = getComputedStyle(document.documentElement)
.getPropertyValue('--primary-color');
// 设置 CSS 变量(实现主题切换)
document.documentElement.style.setProperty('--primary-color', '#e74c3c');
暗色主题实现
:root {
--bg: #ffffff;
--text: #333333;
--card-bg: #f5f5f5;
}
[data-theme="dark"] {
--bg: #1a1a2e;
--text: #e0e0e0;
--card-bg: #16213e;
}
body {
background: var(--bg);
color: var(--text);
transition: background 0.3s, color 0.3s;
}
CSS 变量 vs 预处理器变量
| 特性 | CSS 变量 | Sass/Less 变量 |
|---|---|---|
| 作用域 | DOM 层级继承 | 编译时作用域 |
| 动态修改 | 支持 JS 修改 | 不支持 |
| 媒体查询内 | 支持重新定义 | 不可重新定义 |
| 运行时 | 浏览器实时 | 仅编译时 |
| 兼容性 | 现代浏览器 | 所有浏览器(编译后) |
???? 练习
- 在 :root 定义 5 个全局变量(主色、文字色、背景色、圆角、间距)并应用到页面
- 使用 var() 的后备值功能,为未定义的变量提供默认值
- 创建一个 .alert 组件,使用局部 CSS 变量定义其颜色变体
- 用 JavaScript 动态切换主题(修改 --primary-color)
- 使用 [data-theme="dark"] 实现一个完整的暗色主题切换