← CSS 函数 · 值是「算」出来的 / progress(): 把任意值线性映射到 0–1 待审核 4 / 9
映射 · progress()

progress(): 把任意值线性映射到 0–1

progress(value, start, end) 只做一件事:(valuestart)/(endstart)(value - start) / (end - start),再把结果夹进 [0, 1]——标准的归一化。拿到 0–1 的数,乘什么就插值什么:乘 100% 是进度条、乘 240° 是色相、乘 30px 是圆角。

1 · 公式与钳制:拖动三个滑块观察

钳制行为: value 拖出 [start, end] 之外,结果停在 0 或 1,不会给出负数或大于 1 的数(按当前规范与 MDN;早期草案不夹,留意实现差异)。三个参数必须同类型: 全是 number、全是 length、全是 percentage 都行,progress(3s, 0px, 100px) 这种混搭非法。

2 · 它真正的价值:长度除长度

calc() 不允许「长度除长度」——所以 (100vw320px)/880px(100vw - 320px) / 880px 这个非常自然的归一化,手写竟无法表达。progress(100vw, 320px, 1200px) 把三个同类型参数收进去,内部约掉单位、输出纯粹的 number——这是它对 calc 家族的真正补充。下面的卡片在不支持 progress() 的浏览器也能运行,因为我们把宽度存成了无单位数 --w: 640,数除以数始终合法——这正是 progress() 出现前的通行做法。

两点补充: MDN 把 progress() 和 round/mod/rem 一起归在 math functions 的 stepped value 小组里——虽然它做的是映射而非取整,查阅时按此分类;在 progress() 之前,把长度转成数字的方法是 tan(atan2(任意长度, 1px))——atan2 接受两个同类型量纲、tan 再还原数值,一对三角函数充当单位消除器,tan(atan2()) 页专门拆解它。

3 · 🔗 相关链接

  • progress() · developer.mozilla.org——本页主要来源:语法、钳制行为、同类型参数要求与响应式示例。
  • <calc-sum> · developer.mozilla.org——progress() 三个参数的实际类型:任何能进 calc 的求和表达式。