必须用 CSSUnitValue 实例(如 CSS.px(100))才能启用 Typed OM 类型计算,字符串赋值不触发单位解析;加减乘除需用 CSSMathSum 等构造函数,computedStyleMap 值只读不可修改。
attributeStyleMap.set 传 CSSUnitValue 才算真正启用类型计算
直接写
或用字符串调
都不会触发 Typed OM 的单位计算能力——值会静默转为字符串,后续无法做加减、单位换算。必须显式构造
实例,比如
、
,才能让浏览器识别为可运算的类型化值。
常见错误现象:
看似生效,但
是
,
也是
;而用
后,
是数字
,
是字符串
。
、
、
是最常用构造方式,单位名必须严格匹配(如不能写
)
不支持复合单位(如
),也不能传带单位的字符串(
)
注意 Safari 15.4+、Chrome 85+、Edge 85+ 原生支持;Firefox 目前仍需 polyfill(如
)
用 CSSUnitValue.value 和 CSSUnitValue.unit 拆解并安全转换单位
实例不是“原始数字”,它把数值和单位分开放在
和
两个属性里。这意味着你不能直接拿它参与算术,必须先确认单位是否兼容——比如
和
不能直接相加,但
和
在已知根字体大小时可通过计算对齐。
典型使用场景:动态调整尺寸时保持比例,或响应式缩放中统一转为视口单位。
立即学习
“
前端免费学习笔记(深入)
”;
获取当前值:
,再判断
才能安全访问
单位一致性检查:
成立才可与另一个
值相加;否则需手动换算(例如查
获取
再算
)
不要依赖
——它返回类似
的字符串,丢失类型信息,也破坏后续计算链
加减乘除必须用 CSSMathValue,不能直接用 + - * /
本身不支持
或
运算符。想做
或
,必须用
、
等构造函数包装,最终再塞回
。
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
错误做法:
——这纯属数字相加,完全忽略单位语义,结果毫无意义。
正确加法:
正确乘法:
(注意
不是数字
)
所有
构造结果仍是类型化对象,可继续参与下一轮计算,也能被浏览器原生解析为
表达式
不支持除法直接写
,要用
computedStyleMap 返回的 CSSUnitValue 是只读的,别试图 set
返回的
是只读快照,它的
和
可读,但调
会报
。这是设计使然——它只用于观察,不用于修改。
容易踩的坑:拿到 computed 值后想“顺手改一下再设回去”,结果发现没反应或报错。必须用
或 CSS 变量(
)配合
注册来实现可变样式。
读取用
,写入用
,二者职责分明
若需基于 computed 值做运算后再写入,先解构出
和
,构造新
或
,再
注意
不支持简写属性(
),必须用
、
等长名
Typed OM 的单位计算不是“自动聪明”,它把类型和单位显式暴露出来,意味着你得自己决定何时换算、何时禁止混用。最常被忽略的一点:没有运行时单位自动归一化——
加
不会自动转成同一单位,它要么报错,要么生成一个
表达式交由 CSS 引擎处理。
element.style.width = '100px'attributeStyleMap.set('width', '100px')CSSUnitValueCSS.px(100)CSS.em(1.5)attributeStyleMap.set('width', '100px')attributeStyleMap.get('width').valueundefined.unitundefinedCSS.px(100).value100.unit"px"CSS.px(100)CSS.percent(80)CSS.ms(200)CSS.millisecond(200)calc(100px - 2em)"100px"css-typed-omCSSUnitValue.value.unitpxempxremconst w = element.attributeStyleMap.get('width');w instanceof CSSUnitValue.valuew.unit === 'px'pxgetComputedStylefont-sizeem → px.toString()"100px"CSSUnitValue+*100px + 2em50% * 2CSSMathSumCSSMathProductattributeStyleMap.setconst a = CSS.px(100); const b = CSS.em(2); const sum = a.value + b.value;CSSMathSum(CSS.px(100), CSS.em(2))CSSMathProduct(CSS.percent(50), CSS.number(2))CSS.number(2)2CSSMath*calc()/CSSMathProduct(val, CSS.number(1 / x))element.computedStyleMap().get('width')CSSUnitValue.value.unit.set()TypeError: Cannot set propertyattributeStyleMap--my-width@propertycomputedStyleMapattributeStyleMap.value.unitCSSUnitValueCSSMathValuesetcomputedStyleMapmarginmarginTopmarginBottompxremcalc()