CSS/SCSS中未知选择器#{if(&, '&', '*')}含义咨询
关于SCSS选择器
#{if(&, '&', '*')}.e-control-wrapper的含义说明 你的理解仅在顶层无嵌套的SCSS场景下成立,该表达式是SCSS内置语法的组合用法,具体逻辑如下:
语法拆解
#{}是SCSS的插值语法,用于把表达式的运算结果直接插入到选择器、属性名等位置if(condition, 真值返回值, 假值返回值)是SCSS内置的三元判断函数&是SCSS的父选择器标识符,仅在嵌套规则的上下文下存在,代表外层的父选择器
所以整个表达式#{if(&, '&', '*')}的逻辑是:
如果当前代码存在父选择器上下文(
&有值),就输出父选择器&;如果当前是顶层无嵌套的代码上下文(&不存在),就输出通配选择器*
对应你给出的代码场景含义
顶层选择器位置的使用
你给出的代码中顶层的两个选择器:
#{if(&, '&', '*')}.e-control-wrapper.e-bigger .e-input-group-icon.e-date-icon, #{if(&, '&', '*')}.e-bigger .e-control-wrapper .e-input-group-icon.e-date-icon
如果这段代码是直接放在SCSS文件顶层、没有外层父选择器包裹,表达式会输出*,上述两个选择器等价于:
*.e-control-wrapper.e-bigger .e-input-group-icon.e-date-icon, *.e-bigger .e-control-wrapper .e-input-group-icon.e-date-icon
而CSS中*.类名和直接写.类名的匹配效果完全一致,此时确实是匹配所有带对应类的元素,和你的猜测一致。
嵌套规则内的使用
代码内部嵌套的:
#{if(&, '&', '*')}::before { ... } #{if(&, '&', '*')}:focus { ... }
因为处于父选择器嵌套的上下文内,&必然存在,所以表达式直接输出&,等价于原生的SCSS写法:
&::before { ... } &:focus { ... }
作用是给当前父选择器匹配的元素添加伪元素、伪类样式。
代码精简建议
这是Syncfusion主题生成工具的通用模板写法,为了适配嵌套、非嵌套等所有输出场景才做的兼容写法,冗余度很高。你整理代码时可以直接把所有#{if(&, '&', '*')}统一替换:
- 顶层位置直接删除该表达式即可,
*.类名等价于.类名 - 嵌套位置直接替换为
&即可,功能完全一致
内容的提问来源于stack exchange,提问作者Andrew Corrigan
相关产品推荐
相关产品推荐

