源本科技 | 码上会

CSS 变量

2026/03/06
14
0

学习目标

  • 理解 CSS 变量(自定义属性)的核心概念及其在现代 Web 开发中的作用

  • 掌握 CSS 变量的定义语法(--variable-name)与使用方法(var()

  • 学会利用 :root 选择器管理全局主题,实现一键换肤

  • 了解 CSS 变量的级联特性,能够灵活地在局部作用域中覆盖变量值


正文内容

什么是变量

CSS 变量,官方称为自定义属性,是一种允许开发者将特定的值(如颜色、字体大小、间距等)存储在命名变量中的机制。这些变量可以在整个样式表中重复使用,极大地提高了代码的效率和维护性。

核心优势包括:

  • 集中管理:将颜色、尺寸或字体等值统一存储在一个地方,修改一处即可全局更新。

  • 复用性强:通过 var() 函数在 CSS 的任何位置调用这些变量。

  • 提升可读性:使用语义化的变量名代替魔术数字或十六进制颜色码,使样式表更易于理解和维护。

定义和使用 CSS 变量的语法非常直观:

/* 定义变量 */
--custom-name: value;

/* 使用变量 */
property: var(--custom-name, fallback-value);

参数说明:

  • --custom-name(必填):自定义属性的名称,必须以两个连字符(--)开头。

  • fallback-value(可选):后备值。当自定义属性未定义或无效时,浏览器将使用此值。

基础示例:全局主题设置

最常見的用法是在 :root 伪类中定义全局变量。:root 选择器匹配文档的根元素(在 HTML 中通常是 <html>),在此处定义的变量具有最高的可用性,可以被文档中的所有元素访问。

以下示例展示了如何定义背景色和文字颜色变量,并应用到页面中:

<!DOCTYPE html>
<html>
<head>
    <style>
        /* 在 :root 中定义全局变量 */
        :root {
            --main-bg-color: lightblue;
            --main-text-color: darkblue;
        }

        body {
            /* 使用 var() 函数调用变量 */
            background-color: var(--main-bg-color);
            color: var(--main-text-color);
        }
    </style>
</head>
<body>
    <h1>欢迎来到我的网站</h1>
    <p>这是一个演示 CSS 变量用法的示例段落。</p>
</body>
</html>

代码解析:
在这个例子中,我们将主背景色和主文字颜色定义为变量。如果需要将网站从“蓝色主题”切换到“深色主题”,只需修改 :root 中的两个变量值,无需逐个查找并替换每个元素的颜色属性。

应用场景

1. 基于变量的主题按钮

通过 CSS 变量,我们可以轻松创建可复用的组件样式。当需要调整组件的主题色时,只需修改变量定义,所有使用该变量的组件都会自动更新。

<!DOCTYPE html>
<html>
<head>
    <style>
        :root {
            /* 定义按钮相关的变量 */
            --button-bg: #4CAF50;
            --button-text: white;
            --button-padding: 10px 20px;
        }

        .btn {
            /* 应用变量 */
            background-color: var(--button-bg);
            color: var(--button-text);
            padding: var(--button-padding);
            border: none;
            cursor: pointer;
            transition: background-color 0.3s;
        }

        /* 悬停状态直接修改颜色,不依赖变量,或者也可以定义 --button-hover-bg */
        .btn:hover {
            background-color: darkgreen;
        }
    </style>
</head>
<body>
    <button class="btn">点击我</button>
</body>
</html>

场景分析:

  • :root 中定义了按钮的背景色 --button-bg、文字颜色 --button-text 和内边距 --button-padding

  • .btn 类通过 var() 函数引用这些变量。

  • 优势:如果设计师决定将品牌色从绿色改为蓝色,开发者只需更改 :root 中的 --button-bg 值,页面上所有带有 .btn 类的按钮都会立即生效,无需手动修改每个按钮的样式。

2. 动态间距管理

在大型项目中,保持间距(Margin、Padding)的一致性至关重要。使用变量可以确保全站间距标准的统一。

<!DOCTYPE html>
<html>
<head>
    <style>
        :root {
            /* 定义统一的间距标准 */
            --spacing: 20px;
        }

        .box {
            width: 100px;
            height: 100px;
            background-color: lightcoral;
            /* 使用变量控制外边距 */
            margin: var(--spacing);
        }
    </style>
</head>
<body>
    <div class="box"></div>
    <div class="box"></div>
</body>
</html>

场景分析:

  • 通过 --spacing 变量统一管理盒子的间距。

  • 当需要调整布局密度时(例如从宽松模式切换到紧凑模式),只需在 :root 中将 --spacing20px 改为 10px,所有 .box 元素的间距会自动调整。

最佳实践

为了充分发挥 CSS 变量的优势,建议遵循以下规范:

  1. :root 中定义全局变量
    将需要在整个站点范围内使用的变量声明在 :root 选择器中。这确保了它们在全局样式表中的可访问性,是管理主题颜色的标准做法。

  2. 使用语义化的命名
    避免使用 --color1--size-a 这样晦涩的名称。应选择清晰、描述性强的名称,如 --primary-brand-color--base-font-size--section-spacing。这能显著提升代码的可读性和可维护性,让其他开发者一眼就能理解变量的用途。

  3. 利用级联特性
    CSS 变量遵循 CSS 的级联规则。这意味着你可以在特定作用域(如某个类、ID 或媒体查询内部)重新定义变量,从而覆盖全局值。

    • 应用场景:你可以为网站的“深色模式”创建一个 .dark-mode 类,在其中重新定义 --main-bg-color 为黑色。当将该类添加到 <body> 标签时,所有继承该变量的元素会自动切换为深色主题,而无需编写额外的覆盖样式规则。


总结

  • 定义与使用:CSS 变量以 -- 开头定义,通过 var() 函数调用。

  • 全局作用域:通常在 :root 中定义全局变量,以便在整个文档中使用。

  • 后备机制var(--name, fallback) 允许在变量未定义时提供默认值,增强样式的健壮性。

  • 级联能力:变量可以被局部作用域重新定义,这是实现动态主题(如深色 / 浅色模式切换)的关键技术。

  • 维护效率:通过集中管理设计令牌(Design Tokens),大幅减少重复代码,降低维护成本。


思考题

  1. 级联覆盖:如果在 :root 中定义了 --main-color: red;,而在某个特定的 .container 类中定义了 --main-color: blue;,那么 .container 内部的 <p> 标签的文字颜色会是什么?请解释其背后的级联原理。

  2. 后备值的应用:假设你正在为一个旧浏览器开发网页,该浏览器不支持 CSS 变量。你写了 color: var(--text-color, black);。请问在不支持 CSS 变量的浏览器中,这段代码会如何表现?如果去掉 , black 这个后备值,又会发生什么?

  3. 计算与组合:CSS 变量是否可以用于 calc() 函数中?例如 width: calc(var(--base-width) * 2); 是否合法?请尝试构思一个场景,说明这种用法的好处。