css variable 解析2.0
上一版实在过于又臭又长,循环嵌套太多了,在大佬的指点下进行了一下代码重构.
整体思路
这一版其实压缩了一多半的代码量,底层思路其实也改动了很多.因为css variable最多只会有一层嵌套,而且一单匹配到正确值可以立刻退出,所以在没必要像上一版那样过多用for循环嵌套. 为了代码的整体性,新版设计成了只穿一个css key参数的版本,而整体的mostSpecificRule通过闭包获取. 因为用了递归的实现思路,而一个程序同时进行 实际cssKey 实际cssvalue css variable 以及_css variable fallback_等多种数据进行处理,所以乍一看其实还是有些吃力的.
具体逻辑
color: var(--varOne,var(--varTwo,red)) 首先我们要明确函数的入参都会有什么
color:具体的css key 要进行 getPropertyValue拿取值,
--varOne:cssVar key要进行 getPropertyValue拿真实值,
var(--varTwo,red): 查不到值时的fallback 不需要进行getPropertyValue,
red:真实的css value 或者fallback后的实际备选值,不需要进行getPropertyValue
函数处理的最一开始,通过是否包含var( 判断,来条件执行getPropertyValue方法
但实际上我们只能通过 var( 的检查判断出第三种情况不执行getPropertyValue方法,第四种情况还是会进行getPropertyValue操作,这是错误的
还好这里我们可以在函数返回的时候进行补救判断
return propertyValue || propertyCss.startsWith('--') ? propertyValue : propertyCss
成功查值则肯定返回查询结果,对应情况一 和 情况二(有对应值的时候)
查值不成功,则需要进一步判断是否以- -开头,
不是就返回自身代表它是真实css value.(第四种情况)
是那就返回查询结果 代表为情况二(无对应值的时候)
递归构建
最后在函数递归入口进行退回处理,
查到v.key直接替换,
查不到则用getPropertyCssValue(v.fallback)替换,完善整个递归流程
完整代码:
最后更新于