CSS 变量(自定义属性)最佳实践

CSS 变量最佳实践

范式

1. token 分类

把变量按"功能"分组,不要按"组件"分组

:root {
  /* 颜色 */
  --color-bg: #fff;
  --color-text: #1a1a1a;
  --color-accent: #0070f3;

  /* 间距 */
  --space-xs: 4px;
  --space-sm: 8px;
  --space-md: 16px;
  --space-lg: 24px;

  /* 字体 */
  --font-size-base: 16px;
  --font-weight-bold: 700;

  /* 圆角 */
  --radius-sm: 4px;
  --radius-md: 8px;

  /* 动效 */
  --transition-fast: 150ms ease;
}

2. 主题切换

html[data-theme="dark"] {
  --color-bg: #0a0a0a;
  --color-text: #f5f5f5;
  --color-accent: #58a6ff;
}

<html data-theme="dark"> 一加,整个站点主题切换——不需要任何 JS 重渲染。

3. 继承的优雅

子组件的局部变量覆盖 token 即可:

.alert {
  --color-accent: #dc2626;  /* 局部红色 */
  background: var(--color-accent);
}

1. 不要在 calc 里"硬编码"倍数

/* ❌ 难维护 */
padding: calc(var(--space-md) * 2);

/* ✅ 抽象新 token */
:root {
  --space-double: 32px;
}
padding: var(--space-double);

2. 响应式

@media重定义变量比覆盖每个属性优雅:

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

@media (max-width: 760px) {
  :root {
    --font-size-base: 15px;
  }
}

3. JS 读取

const accent = getComputedStyle(document.documentElement).getPropertyValue('--color-accent');

不要读 style.cssText——可能拿不到 :root 里的值。

何时不要用

  • 一处一用的 magic number:变量反而增加间接层
  • 跨站点设计系统:SCSS/Less 变量更合适(编译时静态化)

我的应用

sslepy.online 所有颜色、间距、圆角、过渡时长都走 token。整个站点不到 50 个变量,但支持亮/暗主题切换 + 站点风格可整体调整

评论