前端【免费下载链接】sassSass makes CSS fun!项目地址https://gitcode.com/gh_mirrors/sa/sass点击查看免费下载导读CSS 的min()与max()既是 Sass 自 Ruby Sass 3.2 起就提供的 SassScript 数值函数又是 CSS Values and Units Level 4 中拥有calc()式特殊语法的数学函数。当两者同名冲突时Sass 通过引入MinMaxExpression产生式依据参数语法在CSS 数学函数与SassScript 函数调用之间自动分派从而在不破坏存量样式表的前提下拥抱浏览器原生能力。本文将基于 Sass 官方提案文档 accepted/min-max.mdDraft 3结合仓库中 spec/functions.md、spec/types/calculation.md、accepted/first-class-calc.md 等正式规范与配套变更记录系统讲解这一双语法机制的背景、文法、优先级规则、语义评估与演进脉络。背景一石二鸟的历史包袱Sass 自 Ruby Sass 3.2 起便提供min()与max()函数用于返回一组 SassScript 数值中的最小值或最大值。与此同时CSS Values and Units Level 4css-values为一系列数学函数引入了与calc()类似的特殊语法min()与max()也位列其中。这给 Sass 带来了一个直接的冲突向后兼容存量 Sass已有的 Sass 样式表大量使用min()/max()作为 SassScript 函数必须继续可用兼容现代 CSS浏览器已原生落地min()/max()数学函数Sass 用户急切需要将min(100%, 50vw)这类写法原样传递到输出 CSS 中。根据 min-max.md 的 Background 一节该节为非规范性说明这一兼容问题在当时被标记为需要紧迫解决should be solved with some urgency因为浏览器支持已经就绪、用户诉求明确。方案总览合并语法Merged Syntax提案给出的核心方案是让min()/max()的解析结果取决于其参数的语法形态。若调用中所有参数都满足 CSS 数学函数的参数要求可能包含var()或env()调用则该表达式被解析为CSS 数学函数即CssMinMax否则它被解析为SassScript 函数调用即FunctionExpression继续走原来的求值路径。换句话说Sass 并不会二选一地放弃任何一边而是让同名的两种含义在语法层面共存由解析器按参数形态自动分派。注意由于CssMinMax的解析优先级更高凡是能按 CSS 数学函数解析的调用都会优先走 CSS 路径反之带有关键字参数、具名参数、$variable: value或不符合calc()语法约束的调用则会落入 SassScript 函数调用路径。设计取舍为什么不做函数重命名或模块化在正式规范中Design Decisions 一节还讨论了两种被否决的替代方案重命名 Sass 的min()/max()函数使其不再与 CSS 冲突借助模块系统当时的提案见 accepted/module-system.md将函数放入带命名空间的模块中调用。这两种方案都意味着现有函数调用必须被弃用deprecate并且所有使用了min()/max()的存量样式表都要迁移。这会造成弃用周期显著拉长 CSS 数学函数可用的时间最终移除 SassScript 版本的min()/max()会给用户带来长期、大规模的迁移阵痛。而双语法共存方案虽然存在风险——用户打错字或误解语法可能被放大成费解的错误甚至错误的输出——但提案同时指出CSS 的语法空间相对狭窄多数情况下出错会表现为 SassScript 路径下的单位不匹配或类型错误反而能很快暴露问题即便某些 SassScript 用法恰好同时是合法 CSS要么本身无用、要么在运行时失败没有类型错误的调用编译后输出的 CSS 语义也基本等价实际影响可以忽略。这一取舍与后续 accepted/calc-functions.md 中合并语法Merged Syntax的设计一脉相承计算函数与普通 Sass 函数的唯一差异只体现在求值方式上解析层面完全融合。语法定义MinMaxExpression产生式提案在 Syntax 一节定义了一个全新的产生式MinMaxExpression在 SassScript 上下文中、当期望出现表达式且输入流以min或max忽略大小写后紧跟(开头时进入该产生式的解析MinMaxExpression :: CssMinMax | FunctionExpression且解析为CssMinMax的优先级高于FunctionExpression。CssMinMax与CalcValue的完整文法如下MinMaxExpression :: CssMinMax | FunctionExpression CssMinMax :: (min( | max() CalcValue (, CalcValue)* ) CalcValue :: CalcValue (( | - | * | /) CalcValue) | ( CalcValue ) | (calc( | env( | var() InterpolatedDeclarationValue ) | CssMinMax | Interpolation | Number文法要点解读CssMinMax必须以min(或max(开头后跟一个或多个由,分隔的CalcValue最后以)收尾CalcValue的递归结构允许 - * /四则运算的嵌套、括号分组以及calc(、env(、var(三种函数形式内部参数为宽松的InterpolatedDeclarationValue可含插值嵌套的CssMinMaxCalcValue可以递归引用CssMinMax因此min(max(10px, 2em), 5vw)这类嵌套写法是合法的Interpolation与Number插值表达式与 Sass 数字同样被允许作为CalcValue的取值形态。求值结果当MinMaxExpression解析为CssMinMax时返回一个与源码文本按 CSS 语义等价的未加引号插值字符串表达式Draft 3 的原始表述并在后续的一等计算first-class calculation演进中被替换为真正的计算对象见下文当解析为FunctionExpression时按普通函数表达式返回。提案还特别注释了一个有意思的事实严格来说所有CssMinMax产生式同时都是合法的FunctionExpression。但在实践中任何可用的CssMinMax若按函数表达式求值都会在运行时失败例如min(10px, 5vw)无法被 SassScript 数值函数直接处理因此这种优先级的设定不会造成实际混乱。与一等calc()演进的衔接CssMinMax的正式语义min-max.md 是 Draft 3 阶段的早期提案其后的 accepted/first-class-calc.mdDraft 2将CssMinMax从未加引号的插值字符串升级为一等计算对象calculation并给出了正式的求值语义求值一个CssMinMax时创建一个名为min或max取决于首个 token的 calculation其参数为对各个CalcArgument求值的结果然后返回对该 calculation化简simplify的结果。同时该提案把CssMinMax文法中的CalcValue替换为更宽松的CalcArgument这扩大了被解析为CssMinMax的调用范围——例如min($foo, $bar)这种纯 Sass 变量调用现在也会被解析为CssMinMax。提案特别说明这是向后兼容的因为此前所有合法的这类表达式在化简后都会得到与原来相同的数值。一等计算的数据结构定义在 spec/types/calculation.md 中interface Calculation { name: string; arguments: CalculationValue[]; } type CalculationValue | Number | UnquotedString | CalculationOperation | Calculation; interface CalculationOperation { operator: | - | * | /; left: CalculationValue; right: CalculationValue; }由此min(10px, 5%)在编译期被化简为min(10px, 5%)计算对象原样输出而min(10px, 20px)这类可完全解析的表达式会被化简为单一数字10px。解析优先级与特殊值规范层面的落实正式规范 spec/functions.md 把CssMinMax的优先级写进了FunctionExpression的文法第 72–73 行1: BothCssMinMaxandEmptyFallbackVartake precedence overFunctionCallif either could be consumed.即CssMinMax与EmptyFallbackVar即var(expr,)空回退形式都优先于普通函数调用被消费。这与提案中Parsing aCssMinMaxtakes precedence over parsing aFunctionExpression的规定一一对应。同时spec/functions.md 的 Definitions 一节定义了Special Number任何以calc(、env(、clamp(、min(、max(开头的未加引号字符串大小写不敏感都被视为特殊数值。这意味着凡是在 CSS 中允许出现数字的位置这些字符串形态都可以原样穿透——例如在hsl()等颜色函数中混用min()/max()表达式。从 spec/functions.md 第 118–122 行的FunctionCall求值算法还可以看到完整的分派逻辑若function未解析到且函数名忽略大小写等于min、max、round或abs且参数列表没有关键字参数、没有 rest 参数且所有参数都是calculation-safe 表达式定义见 spec/types/calculation.md则按计算函数求值若仍解析不到则回退到全局函数min()/max()若全局也没有则输出一个原样的 CSS 函数调用字符串。这一算法直接印证了 min-max.md 中按参数语法自动分派的设计只有计算安全、无关键字/rest 参数的纯数值类调用才会走 CSS 数学函数路径其余一律保留给 SassScript 函数。全局函数与模块化访问math.min()/math.max()在模块系统落地后SassScript 原生的min()/max()被收纳进sass:math内置模块。见 spec/built-in-modules/math.md第 156–170 行max($numbers...) min($numbers...)两份规范都注明该函数同时以全局函数min()/max()的形式可用以保持对旧样式表的兼容。也就是说今天的 Sass 用户拥有两条互不干扰的路径用途写法行为编译期数值比较math.min(10px, 20px)或min(10px, 20px)返回 Sass 数字10px可参与 SassScript 运算输出原生 CSS 数学函数min(10px, 5%)、min(100%, 50vw)、min($a, $b)按CssMinMax解析编译/化简后原样输出给浏览器一个常见的实践建议若想在输出 CSS 中保留min()表达式交由浏览器计算例如混入百分比、视口单位时应确保参数使用计算安全的写法若需要 Sass 在编译期算出确定数值则可显式调用math.min()/math.max()。演进与现状CalcValue更名及计算函数家族扩张配套变更记录 accepted/min-max.changes.md 记录了该提案的三个草稿迭代Draft 1初始草案Draft 2修正笔误——将CalcArithemtic更正为CalcValueDraft 3使用CssMinMax而非MinMaxExpression作为CalcValue的一个候选理由是我们不希望 SassScript 函数调用出现在纯 CSS 数学函数中。这一修改至关重要Draft 3 之后嵌套在min()/max()内部的子表达式只能递归解析为CssMinMax而不能落入任意FunctionExpression从而把min(max(1px, 2px), 3px)限定在纯 CSS 数学函数的语义空间内杜绝了 SassScript 函数调用被悄悄带入 CSS 数学函数的问题。在随后的 accepted/calc-functions.mdDraft 3.2中同样的机制被推广到round()、mod()、rem()、sin()、cos()、tan()、asin()、acos()、atan()、atan2()、pow()、sqrt()、hypot()、log()、exp()、abs()、sign()等 CSS Values and Units 4 的全部数学函数其中与 Sass 全局函数重名的round()与abs()采用与min()/max()完全相同的计算安全则走计算路径否则回退到 Sass 函数策略。该提案还进一步把计算解析与标准 Sass 表达式语法合并使计算结果能与同名用户自定义函数共存进一步印证了 min-max.md 双语法方案的前瞻性。实践要点速查纯数值、纯单位min(1px, 2px)会被 Sass 在编译期化简为数字1px混入百分比/视口单位min(100%, 50vw)无法在编译期合并将作为计算对象或未加引号字符串原样输出给浏览器解析变量参数min($a, $b)在 Draft 3经CalcArgument放宽后同样可解析为CssMinMax并化简与旧版 SassScript 行为兼容var()/env()参与min(100%, var(--side))合法参数内允许插值InterpolatedDeclarationValue避免关键字/rest 参数带$kw: v或$args...的调用会落入 SassScript 路径若目标是输出原生 CSS请保持参数形态为计算安全表达式优先级是硬规则CssMinMax优先于FunctionExpression这是写进 spec/functions.md 文法注释的强制约束。延伸阅读提案正文与变更记录accepted/min-max.md、accepted/min-max.changes.md一等计算对象与CssMinMax求值语义accepted/first-class-calc.md计算函数家族扩张含round()/abs()回退策略accepted/calc-functions.md正式规范函数分派与 Special Number 见 spec/functions.mdcalculation 类型见 spec/types/calculation.mdsass:math模块见 spec/built-in-modules/math.md赞分享前端【免费下载链接】sassSass makes CSS fun!项目地址https://gitcode.com/gh_mirrors/sa/sass点击查看免费下载相关推荐MeloTTS 安装教程多语言文本转语音TTS系统 6 语种快速上手指南MeloTTS 安装教程多语言文本转语音TTS系统 6 语种快速上手指南 MeloTTS 是一个高质量的 多语言文本转语音TTS 库能把英语、中文、人工智能语音音频StarRocks positive() 数学函数详解语法、数据类型支持与源码实现原理StarRocks positive 数学函数详解语法、数据类型支持与源码实现原理 positive x 是 StarRocks 提供的一元数学函数功能是将数据库OLAP数据仓库大数据湖仓一体数据分析StarRocks negative() 数学函数详解语法、数据类型支持与向量化实现原理StarRocks negative 数学函数详解语法、数据类型支持与向量化实现原理 negative 是 StarRocks 提供的一元数学函数用于返回输数据库OLAP数据仓库大数据湖仓一体数据分析上一篇5步自动化获取Oracle Cloud免费ARM服务器彻底告别容量不足错误下一篇Unstorage 开源项目教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
