前端开发如何灵活使用 css 变量

🧩 一、CSS 变量的定义与使用基础

定义方式

css 复制代码
:root {
  --primary-color: #409eff;
  --font-size-base: 14px;
}

:root 选择器相当于全局作用域(类似全局变量)。

使用方式

css 复制代码
button {
  color: var(--primary-color);
  font-size: var(--font-size-base);
}

var() 语法:

css 复制代码
color: var(--text-color, #333); /* 第二个参数是默认值 */

⚙️ 二、动态修改 CSS 变量(核心)

CSS 变量是运行时动态的,可以通过 JS 修改而立即生效,无需重新渲染整个页面。

✅ 方法 1:修改根节点变量

javascript 复制代码
document.documentElement.style.setProperty('--primary-color', '#ff4d4f');

✅ 方法 2:修改某个局部作用域

CSS 变量有作用域,可以定义在某个元素上:

css 复制代码
.card {
  --card-bg: white;
  background: var(--card-bg);
}

JS 动态改它:

dart 复制代码
document.querySelector('.card').style.setProperty('--card-bg', '#f5f5f5');

🧭 三、灵活应用场景

1. 主题切换(暗色 / 亮色)

css 复制代码
:root {
  --bg-color: #fff;
  --text-color: #000;
}

[data-theme="dark"] {
  --bg-color: #121212;
  --text-color: #fff;
}

JS 切换:

javascript 复制代码
document.documentElement.setAttribute('data-theme', 'dark');

🔥 推荐做法:通过 data-themeclass 切换主题,CSS 自己处理颜色映射。


2. 响应式设计 + 动态计算

利用 calc()clamp() 等函数与变量结合:

css 复制代码
:root {
  --base-size: 16px;
}

.card {
  font-size: calc(var(--base-size) * 1.2);
}

在 JS 中动态调整全局字号:

javascript 复制代码
document.documentElement.style.setProperty('--base-size', '18px');

3. 组件参数化

在组件封装中(如 React / Vue / Web Components),可通过变量让组件样式可配置:

css 复制代码
.my-button {
  --btn-color: #409eff;
  background-color: var(--btn-color);
}

父组件通过 style 传入:

ini 复制代码
<MyButton style="--btn-color: #ff4d4f" />

4. 配合动画 / 动态过渡

CSS 变量可以和 transition 配合使用:

css 复制代码
:root {
  --panel-height: 100px;
}

.panel {
  height: var(--panel-height);
  transition: height 0.3s ease;
}

JS 动态修改:

javascript 复制代码
document.documentElement.style.setProperty('--panel-height', '200px');

面板高度会平滑过渡。


🧠 四、CSS 变量 vs 预处理器变量(LESS/SASS)

特性 CSS变量 LESS/SASS变量
生效时机 运行时 编译时
动态修改 ✅ 可运行时修改 ❌ 需重新编译
可作用域化 ✅ 有作用域(继承) ❌ 全局或局部编译作用域
浏览器支持 ✅ 现代浏览器全支持 ✅ 依赖编译

💡 通常结合使用:

  • LESS 变量负责 编译时样式结构
  • CSS 变量负责 运行时动态主题

🧰 五、实践建议

  1. 定义命名规范:

    css 复制代码
    --color-primary
    --font-size-sm
    --layout-header-height
  2. 建立统一入口文件:
    variables.css 管理所有变量,通过 @import 或构建工具引入。

  3. 避免滥用:

    动态改动频繁的变量可使用 JS 样式或 class 切换,静态主题类变量用 CSS 变量即可。

  4. 可结合存储:

    ini 复制代码
    const theme = 'dark';
    localStorage.setItem('theme', theme);
    document.documentElement.dataset.theme = theme;

🎨 示例:多主题动态切换

xml 复制代码
<style>
  :root {
    --bg: #fff;
    --text: #000;
  }

  [data-theme='dark'] {
    --bg: #1e1e1e;
    --text: #fff;
  }

  body {
    background: var(--bg);
    color: var(--text);
    transition: background 0.3s, color 0.3s;
  }
</style>

<body>
  <button id="toggleTheme">切换主题</button>

  <script>
    const root = document.documentElement;
    document.getElementById('toggleTheme').onclick = () => {
      const isDark = root.dataset.theme === 'dark';
      root.dataset.theme = isDark ? 'light' : 'dark';
    };
  </script>
</body>
相关推荐
wordbaby5 分钟前
TanStack Router 路径参数(Path Params)速查表
前端
盟接之桥1 小时前
盟接之桥--说制造:从“找缝隙”到“一万米深”——庖丁解牛式的制造业精进之道
大数据·前端·数据库·人工智能·物联网·制造
巴拉巴拉~~1 小时前
Flutter 通用滑块组件 CommonSliderWidget:单值 / 范围 + 刻度 + 标签 + 样式自定义
开发语言·前端·javascript
韭菜炒大葱1 小时前
现代前端开发工程化:Vue3 + Vite 带你从 0 到 1 搭建 Vue3 项目🚀
前端·vue.js·vite
栀秋6661 小时前
面试常考的最长递增子序列(LIS),到底该怎么想、怎么写?
前端·javascript·算法
Melrose1 小时前
Flutter - 使用Jaspr来构建SEO友好网站
前端·flutter
有点笨的蛋1 小时前
Vue3 项目:宠物照片变身冰球运动员的 AI 应用
前端·vue.js
盖头盖2 小时前
【nodejs中的ssrf】
前端
江城开朗的豌豆2 小时前
TypeScript和JavaScript到底有什么区别?
前端·javascript
鸡吃丸子2 小时前
初识Docker
运维·前端·docker·容器