Skip to content

CSS 变量

在父级标签样式内可定义一个 CSS 变量(变量内为正常的样式),在子标签的样式内可以直接使用该变量名。

优势:方便复用、修改样式。

定义 CSS 变量

需要注意的是:

  • 变量名必须以 -- 开头(这是 CSS 变量的标识,区分于普通 CSS 属性)
  • 变量名大小写敏感(--main-color 和 --Main-Color 是两个不同的变量)
  • 该变量具备作用域特性(全局 / 局部生效,可继承)。在 :root 伪类内定义的变量是全局的,可在整个页面的所有 CSS 选择器中使用,是最常用的定义方式。
css
:root {
  /* 定义全局CSS变量,--开头 + 自定义变量名 + 样式值 */
  --main-bg-color: #2c3e50;    /* 全局背景色 */
  --text-primary: #ffffff;     /* 全局主文本色 */
  --base-font-size: 16px;      /* 全局基础字体大小 */
  --spacing-unit: 8px;         /* 全局间距单位(方便统一调整间距) */
}
css
/* 局部变量:仅在.btn类及其后代中生效 */
.btn {
  --btn-bg: #007bff;
  --btn-text: #fff;
  --btn-padding: var(--spacing-unit) calc(var(--spacing-unit) * 2); /* 可嵌套引用其他变量 */
}

使用 CSS 变量

使用 CSS 变量的唯一方式:通过 var() 函数来引用。

css
/* 语法:var(变量名) */
:root {
  --main-bg-color: #2c3e50;
  --text-primary: #ffffff;
  --base-font-size: 16px;
}

/* 引用全局CSS变量 */
body {
  background-color: var(--main-bg-color); /* 引用全局背景色变量 */
  color: var(--text-primary);             /* 引用全局文本色变量 */
  font-size: var(--base-font-size);       /* 引用全局字体大小变量 */
}
css
/* 语法:var(变量名, 默认值) */
/* 当引用的 CSS 变量未定义、无效或不存在时,会自动使用该默认值 */

/* 引用一个可能未定义的变量,同时指定默认值 */
.card {
  /* 若--card-border-color未定义,则使用 #e0e0e0 作为边框色 */
  border-color: var(--card-border-color, #e0e0e0);
  /* 默认值可以是复杂样式,甚至嵌套var()函数 */
  padding: var(--card-padding, var(--spacing-unit, 10px));
}
css
/* 像普通的样式一样,可以配合 calc() 函数实现数值计算(如间距缩放、尺寸调整等),这是实现动态样式的常用技巧。 */

:root {
  --base-font-size: 16px;
  --spacing-unit: 8px;
  --container-width: 1200px;
}

/* 运算1:字体大小放大1.2倍 */
h1 {
  font-size: calc(var(--base-font-size) * 1.2); /* 16px * 1.2 = 19.2px */
}

/* 运算2:间距叠加 */
.section {
  margin-top: calc(var(--spacing-unit) * 3); /* 8px * 3 = 24px */
  margin-bottom: calc(var(--spacing-unit) * 2); /* 8px * 2 = 16px */
}

/* 运算3:宽度自适应(减去边距) */
.container {
  width: calc(var(--container-width) - 40px); /* 1200px - 40px = 1160px */
  margin: 0 auto;
}