
怎么用JS给 :root 设置 CSS 变量
直接改 :root 的 style 属性最稳妥,兼容性好、无副作用。别碰 document.styleSheets 去遍历规则——跨域样式表会报错,动态插入的也容易漏掉。
实操建议:
- 用
document.documentElement.style.setProperty('--color-primary', '#3b82f6'),这是标准写法,所有现代浏览器都支持 - 如果变量值含单位(比如
px、rem),必须连单位一起传进去,setProperty('--size', '1.25')是错的,得写成'1.25rem' - 想批量设多个变量?别链式调用
setProperty,先缓存document.documentElement.style,再挨个设,减少 DOM 访问开销
修改内联 style 标签里的 CSS 变量行不行
可以,但不推荐。手动拼接字符串往 <style id="dynamic-vars"></style> 里写 :root { --x: y },看着灵活,实际坑多。
常见错误现象:
立即学习“前端免费学习笔记(深入)”;
- 多次重写整个
<style></style>内容时,旧变量被清空,导致页面闪动或样式丢失 - 没做转义,变量值含
;或}就直接破坏 CSS 结构 - 服务端渲染(SSR)场景下,JS 还没执行时,
<style></style>里没变量,首屏样式错乱
真要用,就只更新内容,别替换整个 textContent:styleEl.textContent = ':root { --color-bg: #f9fafb; }',且确保该 <style></style> 标签在 里、且没被其他逻辑覆盖。
getComputedStyle 能不能读到 JS 设置的 CSS 变量
能,但得注意时机和写法。刚调完 setProperty 立刻读,不一定拿到新值——浏览器可能还没触发样式计算。
使用场景:
- 读取变量用于后续逻辑(比如根据
--theme切换 class),建议加个微任务延迟:Promise.resolve().then(() => getComputedStyle(...)) - 别用
getComputedStyle(el).getPropertyValue('--my-var')去读根变量,要读getComputedStyle(document.documentElement).getPropertyValue('--my-var') - 返回值是字符串,包括空格和单位,比如
' 16px ',需要.trim()后再处理
为什么有些 CSS 变量改了但页面没反应
大概率是变量没被实际用到,或者作用域不对。CSS 变量不是全局广播,它遵循级联和作用域规则。
容易踩的坑:
- 在
.box { --color: red }里设变量,却在body下的元素里用color: var(--color)—— 没继承,读不到 - JS 设置了
--size,但 CSS 里写的是font-size: var(--size-1),拼写错了,自然无效 - 变量值是
invalid(比如设成空字符串或非法颜色),var(--x, fallback)会退回到 fallback,但没 fallback 就按默认值渲染,看起来像“没变”
调试时,打开 DevTools 的 Computed 面板,搜 var(--xxx),看最终解析出的值是多少,比猜快得多。










