CSS自定义属性全局变量必须在:root中以--开头声明,作用域覆盖全部后代,仅通过JS的style.setProperty()可动态更新,拼写错误或提前引用会导致静默失效。
在
里声明 CSS 自定义属性就是定义全局变量
浏览器把
当作文档最高层的元素(等价于
),所有在它里面用
开头声明的属性,都会被注入到整个 CSS 作用域中,后续任意选择器都能通过
访问。这不是“模拟”全局变量,是原生支持的真全局。
必须以两个短横线
开头,比如
,否则不被识别为自定义属性
声明位置不一定要写在
最顶层;只要在
块内,哪怕嵌套在媒体查询或条件规则里,也属于全局作用域
不能在内联样式(
)里声明
并指望它变成全局变量——内联声明只对当前元素生效
为什么不能在
或普通类里声明全局变量
因为 CSS 自定义属性的作用域是“继承+级联”,不是“命名空间”。在
里声明
,子元素能读到,但
自身、同级的
里的样式、或者通过
加载的外部 CSS 都无法访问它。只有
是唯一能覆盖全部后代且不被其他选择器遮蔽的锚点。
和
效果一样,但
更明确、更常用,且兼容性略好(IE 不支持,但没人会在意)
如果在
里声明,那这个
只对
及其后代有效,不是全局
多个
块会合并,后声明的同名变量会覆盖前面的,类似 CSS 级联规则
读取失败的常见原因
报错不明显,往往只是值没生效,颜色/尺寸回退到初始值。问题通常不在语法,而在作用域或拼写。
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
拼写大小写敏感:
和
是两个变量
引用时名字写错,比如声明了
,却写了
,此时会直接使用属性默认值(如
就是
),控制台也不报错
在未声明变量的上下文中提前使用,例如在
声明之前就有一个
—— 这时
无效,浏览器忽略该声明
不能用于
的关键帧内部作为动画属性值(部分浏览器限制),也不能直接用在
查询条件中
动态更新
变量要靠 JavaScript
CSS 本身没有“重新赋值”语法,所有修改都得走 JS 的
。这是最常被忽略的一环:很多人以为改了 CSS 文件里的
就能热更新,其实不行。
立即学习
“
前端免费学习笔记(深入)
”;
正确做法:
批量更新建议封装函数,避免重复写
注意单位:JS 设置时如果漏掉单位(如把
当成
),CSS 不会自动补,会导致计算失败(
若
是
,实际是
,非法)
服务端渲染或构建时替换变量?那得用 PostCSS 或构建插件,纯 CSS 不支持
CSS 自定义属性的“全局性”很实在,但也只限于 CSS 层。它不参与 JS 变量作用域,也不能跨 shadow DOM 自动穿透,这些边界一旦混淆,调试起来特别安静——什么错误都不报,就只是不动。
:root:roothtml--var(--xxx)----primary-color:root:root--xxxbodybody--colorhtmlhead@import:roothtml { --x: red; }:root { --x: red; }:root.theme-dark { --bg: #111; }--bg.theme-dark:rootvar(--name)--MainColor--maincolor--spacing-mvar(--spacing-s)margin0:rootdiv { color: var(--text); }var()var()@keyframes@media:rootstyle.setProperty():rootdocument.documentElement.style.setProperty('--primary', '#007bff');document.documentElement.style'16'pxfont-size: var(--size)--size'16'font-size: 16;