CSS变量如何在JS中使用详解
时间:2026-02-19 18:47:05 129浏览 收藏
CSS变量与JavaScript的协同应用看似简单,实则暗藏诸多细节陷阱:最稳定可靠的读取方式是通过getComputedStyle().getPropertyValue()获取计算后样式,而非直接访问element.style;修改则统一使用setProperty()动态注入内联样式,适用于主题切换、响应式控制等场景;但必须警惕作用域错位、拼写差异、执行时机不当等常见错误,更要规避强制同步布局带来的性能风险——频繁读取可能触发重排,而JS本身无法原生监听变量变化,需手动封装响应逻辑。真正决定成败的,不是语法本身,而是对变量定义、读取、修改与响应这一完整生命周期的严谨管理。

怎么在 JavaScript 里读取 CSS 自定义属性(--xxx)
直接用 getComputedStyle + getPropertyValue,这是最稳定、兼容性最好的方式。别试图去解析 style 属性或遍历 cssRules,那些要么拿不到全局变量,要么跨 shadow DOM 失效。
常见错误现象:element.style.getPropertyValue('--color') 返回空字符串——因为 style 只读内联样式,不包含来自 :root 或选择器的变量。
- 先获取计算后样式:
const styles = getComputedStyle(document.documentElement)(读 :root)或getComputedStyle(el)(读元素最终生效值) - 再取值:
styles.getPropertyValue('--primary-color'),注意带两个短横线和引号 - 返回值总是字符串,哪怕你设的是数字,比如
'24'而不是24,需要手动parseInt或parseFloat
怎么在 JavaScript 里动态修改 CSS 变量
改 :root 或任意元素的 style 属性即可,本质是写内联样式,优先级高于外部 CSS 中的同名变量。
使用场景:主题切换、尺寸响应式调整、动画中间态控制。不要用 JS 去重写整个 CSS 文件或操作 document.styleSheets,维护成本高且容易出竞态。
- 改全局变量:
document.documentElement.style.setProperty('--bg', '#ffeb3b') - 改某元素变量:
myEl.style.setProperty('--hover-scale', '1.2') - 删变量:
myEl.style.removeProperty('--hover-scale'),会回退到上级定义(如 :root)或初始值 - 批量设置建议用
Object.assign(el.style, { '--a': '1', '--b': '2' }),但注意这会覆盖其他内联样式,慎用
getPropertyValue 拿不到值?检查这三件事
不是 JS 写错了,大概率是 CSS 变量根本没生效,或者作用域不对。
常见错误现象:控制台打印 '' 或 'null',但开发者工具里明明看到变量存在。
- 确认变量已声明且拼写完全一致(区分大小写,
--MainColor≠--main-color) - 确认作用域:如果从
:root读,但变量只在.card里定义,那getComputedStyle(document.documentElement)就读不到 - 确认时机:脚本执行时 DOM 是否就绪?变量是否被后续 CSS 覆盖?建议在
DOMContentLoaded后读,或用MutationObserver监听style变化(极少需要)
CSS 变量传给 JS 的性能和边界要注意什么
读写本身极快,但频繁读取(比如在 requestAnimationFrame 里)可能触发强制同步布局(forced layout),尤其当依赖的变量影响几何属性时。
性能影响比想象中敏感:一次 getComputedStyle 调用可能让浏览器重排,连续读多个属性更糟。
- 读取尽量合并:用一个
getComputedStyle结果,多次getPropertyValue,别反复调用 - 避免在 scroll / resize 回调里直接读变量,缓存值或节流
- JS 无法监听 CSS 变量变化,想响应式更新得自己封装逻辑(比如配合
CustomEvent或Proxy包裹 setProperty) - IE 完全不支持 CSS 变量,如果还要兼容,得 fallback 到 data-attribute 或 class 切换
真正复杂的地方不在语法,而在变量生命周期管理——谁定义、谁读、谁改、改完谁响应。这些关系一旦松散,调试时就会发现值“好像变了又没变”。
文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《CSS变量如何在JS中使用详解》文章吧,也可关注golang学习网公众号了解相关技术文章。
-
502 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
105 收藏
-
494 收藏
-
392 收藏
-
198 收藏
-
335 收藏
-
489 收藏
-
499 收藏
-
465 收藏
-
486 收藏
-
118 收藏
-
343 收藏
-
478 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习