CSS 自定义属性(变量)

简单 🟢CSS 布局
4 个标签
预计阅读时间:9 分钟
CSS变量自定义属性主题

CSS 自定义属性(变量)

CSS 自定义属性(CSS Variables)允许定义可复用的值,提高代码的可维护性和灵活性。

基本语法

定义变量:

--variable-name: value;
必须在规则集内定义
通常定义在 :root 中作为全局变量

使用变量:

var(--variable-name)
var(--variable-name, fallback)
支持回退值

示例:

cssCode
:root {
  --primary-color: #007bff;
  --font-size: 16px;
}

.button {
  background-color: var(--primary-color);
  font-size: var(--font-size);
}

作用域和继承

全局变量:

定义在 :root 中
整个文档可用
如:--primary-color

局部变量:

定义在特定选择器中
仅在该选择器及其后代中可用
可以覆盖全局变量

继承:

变量遵循 CSS 继承规则
子元素继承父元素的变量值
可以重新定义覆盖

代码示例

定义和使用变量

cssCode
/* 全局变量 */
:root {
  /* 颜色 */
  --primary-color: #007bff;
  --secondary-color: #6c757d;
  --success-color: #28a745;
  --danger-color: #dc3545;
  --warning-color: #ffc107;
  
  /* 字体 */
  --font-family-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
  --font-size-base: 16px;
  --font-size-large: 1.25rem;
  --font-size-small: 0.875rem;
  
  /* 间距 */
  --spacing-unit: 8px;
  --spacing-sm: var(--spacing-unit);
  --spacing-md: calc(var(--spacing-unit) * 2);
  --spacing-lg: calc(var(--spacing-unit) * 3);
  
  /* 边框 */
  --border-radius: 4px;
  --border-width: 1px;
  --border-color: #dee2e6;
  
  /* 阴影 */
  --box-shadow: 0 2px 4px rgba(0,0,0,0.1);
  --box-shadow-lg: 0 4px 8px rgba(0,0,0,0.15);
}

/* 使用变量 */
.button {
  padding: var(--spacing-md) var(--spacing-lg);
  background-color: var(--primary-color);
  color: white;
  border: none;
  border-radius: var(--border-radius);
  font-family: var(--font-family-base);
  font-size: var(--font-size-base);
  box-shadow: var(--box-shadow);
  cursor: pointer;
  transition: all 0.3s ease;
}

.button:hover {
  background-color: var(--primary-color);
  box-shadow: var(--box-shadow-lg);
}

.button--secondary {
  background-color: var(--secondary-color);
}

.button--success {
  background-color: var(--success-color);
}

.button--danger {
  background-color: var(--danger-color);
}

主题切换

cssCode
/* 浅色主题(默认) */
:root {
  --bg-primary: #ffffff;
  --bg-secondary: #f8f9fa;
  --text-primary: #212529;
  --text-secondary: #6c757d;
  --border-color: #dee2e6;
  --shadow-color: rgba(0, 0, 0, 0.1);
}

/* 深色主题 */
[data-theme="dark"] {
  --bg-primary: #1a1a1a;
  --bg-secondary: #2d2d2d;
  --text-primary: #ffffff;
  --text-secondary: #b0b0b0;
  --border-color: #404040;
  --shadow-color: rgba(0, 0, 0, 0.3);
}

/* 使用变量 */
body {
  background-color: var(--bg-primary);
  color: var(--text-primary);
  transition: background-color 0.3s, color 0.3s;
}

.card {
  background-color: var(--bg-secondary);
  border: 1px solid var(--border-color);
  box-shadow: 0 2px 4px var(--shadow-color);
  color: var(--text-primary);
}

.text-secondary {
  color: var(--text-secondary);
}

/* JavaScript 切换主题 */
function toggleTheme() {
  const currentTheme = document.documentElement.getAttribute('data-theme');
  const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
  document.documentElement.setAttribute('data-theme', newTheme);
  localStorage.setItem('theme', newTheme);
}

// 初始化主题
const savedTheme = localStorage.getItem('theme') || 'light';
document.documentElement.setAttribute('data-theme', savedTheme);

与 calc() 结合使用

cssCode
:root {
  --spacing-unit: 8px;
  --border-width: 2px;
  --font-size: 16px;
}

.card {
  /* 使用 calc() 计算值 */
  padding: calc(var(--spacing-unit) * 2);
  margin: calc(var(--spacing-unit) * 1.5);
  border: var(--border-width) solid #ddd;
  font-size: calc(var(--font-size) * 1.125);
}

/* 复杂计算 */
.grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: calc(var(--spacing-unit) * 2);
}

@media (max-width: 768px) {
  .grid {
    grid-template-columns: repeat(2, 1fr);
    gap: calc(var(--spacing-unit) * 1.5);
  }
}

与预处理器变量的区别

CSS 变量:

运行时生效
可以动态修改
遵循级联和继承
需要浏览器支持

Sass/Less 变量:

编译时确定
不能运行时修改
无继承概念
编译为静态值

浏览器支持

支持情况:

现代浏览器完全支持
IE 不支持
可以使用 PostCSS 插件回退

回退策略:

提供静态回退值
使用 PostCSS 插件
渐进增强

最佳实践

使用语义化的变量名
建立变量命名规范
合理组织全局和局部变量
使用回退值
结合 calc() 进行计算
文档化变量用途
定期审查和优化