shape():能用 %、calc() 和 var() 的 path
path() 有两个先天限制:坐标是无单位的 px、整个形状不随盒子缩放(path 微语言本身见 path data 一页)。根因是 path 串只是一段「借来的 SVG 文本」,CSS 解析器不解析它的内部。shape() 把每个 path 命令改写成 CSS 自己的语法——于是坐标变成普通的 <length-percentage>,%、em、calc()、var() 都可使用,曲线能力与 path 完全一致。
1 · 两张票券:拖宽度看差别
同一张「两侧带半圆缺口」的票券,左边用 path() 按 320px 宽固定,右边用 shape() 写「缺口在 50% 高度、半径 var(--notch)」。320px 时两张一模一样——然后拖宽度:
左边的票券永远是 320px 那张:盒子变宽,超出 320px 的部分落在形状外被裁掉;盒子变窄,形状超出盒子、缺口直接丢失。右边的缺口始终对齐中线,半径还能用自定义属性实时调——这就是「形状参与布局语境」的含义。
2 · 命令对照:从 path 串翻译到 shape()
shape() 也能动画。 命令结构一致的两个 shape() 之间可以平滑插值,规则与 clip-path 进阶里的 polygon 同理。另外 offset-path 也接受 shape()——一条响应式的运动轨道。