CSS 自定义属性(CSS 变量)的用法和优势?

基本用法

:root {
  --primary-color: #4f46e5;
  --text-size: 16px;
  --spacing: 1rem;
}

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

/* 带回退值 */
.text { color: var(--undefined-var, #333); }

优势(vs Sass/Less 变量)

特性 CSS 变量 Sass/Less 变量
运行时修改 ✅ ❌ 编译后固定
JS 读写 ✅ ❌
作用域 DOM 层级 文件层级
媒体查询内修改 ✅ ❌
继承 ✅ ❌

JS 操作 CSS 变量

// 读取
const color = getComputedStyle(document.documentElement)
  .getPropertyValue('--primary-color')

// 设置
document.documentElement.style.setProperty('--primary-color', '#ff0000')

主题切换

:root {
  --bg: #ffffff;
  --text: #1a1a1a;
  --border: #e0e0e0;
}

[data-theme="dark"] {
  --bg: #1a1a1a;
  --text: #ffffff;
  --border: #333333;
}

body {
  background: var(--bg);
  color: var(--text);
}
// 切换主题
function toggleTheme() {
  const current = document.documentElement.dataset.theme
  document.documentElement.dataset.theme = current === 'dark' ? 'light' : 'dark'
}

响应式调整

:root {
  --font-size: 16px;
}

@media (max-width: 768px) {
  :root {
    --font-size: 14px;
  }
}

/* 所有使用 var(--font-size) 的地方自动响应 */

组件级作用域

.card {
  --card-padding: 16px;
  --card-bg: #fff;
  padding: var(--card-padding);
  background: var(--card-bg);
}

.card--highlight {
  --card-bg: #fffbeb;  /* 仅影响此组件 */
}

注意事项

同分类其他题目