css variable 解析

给一个开源项目做的css variable支持,外部逻辑都没啥复杂的,主要难点在于解析variable值.

CSS value合理类型

.two {
  color: var(—my-var, red); /* Red if —my-var is not defined */
}

.three {
  background-color: var(--my-var, var(--my-background, pink)); /* pink if --my-var and --my-background are not defined */
}

.three {
  background-color: var(--my-var, --my-background, pink); /* Invalid: "--my-background, pink" */
}

处理思路

首先对字符串进行解析,分割出最外层var(),记录一个css值内包含多少个成立的变量. 直接拿取var(位置,然后步进查询)中间遇到(做括号层级的增加,匹配到第一个符合条件的)结束,然后递归处理剩下的字符串

然后再逐个对var()值进行解析,根据css var的规则其实可以很简单的发现,文件的替换关系值采用从左到右的规则,具体的var()层级关系不关键,所以只要抽离 成对的var()然后再以 ,字符做分割就好.

要注意的是可能会存在rgba(1,1,1)这样的css值,所以在进行逗号拆分时要排除掉括号内的逗号,正则:/,(?![^(]*\))/

最后在实际使用时顺序匹配关键字数组就可以了,以--开头的是css变量.反之为变量值.

拿到css var 具体值后用getComputedStyle(element).getPropertyValue("--my-var") 拿取目标dom上需要替换的css变量值就好

源码:

最后更新于