G2 连续曲率与超椭圆几何
为什么标准 border-radius 圆弧倒角在高端界面中显得生硬?从 G0/G1 到 G2 曲率连续性推导与 Apple 平滑圆角实现。
G2 连续曲率与超椭圆几何
在高级工业制造(如汽车流线外壳)和现代高端操作系统界面(如 Apple macOS / iOS)中,曲率的连续性直接决定了光影反射的柔和度。
几何连续性阶数定义
几何连续性决定了两条曲线连接处的光滑程度:
- 连续(位置连续):两段曲线在端点重合,但切线方向发生突变(90 度直角)。
- 连续(切线连续):两段曲线在连接点处切线方向相同,一阶导数连续。CSS 标准的
border-radius就是典型的 连续(直线与圆弧相切)。 - 连续(曲率连续):两段曲线在连接点处曲率 保持完全相等,二阶导数连续。
为什么标准圆弧倒角存在视觉断裂?
对于标准圆弧倒角:
- 直线段曲率 。
- 进入圆弧瞬间,曲率突跃为 。 由于二阶导数的阶跃,人眼在光照或者折射材质下会敏锐察觉到连接处的“折痕感”(Specular Break)。
超椭圆方程与 Apple 平滑圆角
Apple 从 iOS 7 起把应用图标换成「连续圆角」,这种外形常被近似为超椭圆(Lamé 曲线): 时,超椭圆与直线相接处的曲率为 0,曲率接得上(); 时,那里的曲率变化率也为 0,曲率从 0 平缓爬升到 45° 方向的峰值。
示例加载中...
TuffEx 的工程实现方案
TuffEx 用 CSS corner-shape 画超椭圆圆角:border-radius 决定拐角占多大,superellipse(K) 的指数 。tx-squircle 把圆角放大到 ,再取让 45° 方向切入深度与半径 R 的圆弧相同的指数。默认 ,得到 与 superellipse(1.777)():
// packages/tuffex/packages/components/style/mixins.scss
@mixin tx-squircle($radius: 16px, $smoothness: $tx-squircle-smoothness, $inset: 0) {
border-radius: tx-squircle-inset($radius, $inset);
@supports (corner-shape: superellipse(2)) {
border-radius: tx-squircle-inset(tx-squircle-radius($radius, $smoothness), $inset);
corner-shape: superellipse(#{tx-squircle-exponent($smoothness)});
}
}
- 回退:不支持
corner-shape的浏览器(Safari、Firefox)保留普通圆角。TuffEx 不用 SVG 遮罩补形:遮罩会剪掉外侧阴影,还让内部的backdrop-filter取不到背景,默认的琉光材质会失效。 - 令牌与工具类:拿不到 mixin 的代码读
--tx-corner-smooth-scale与--tx-corner-smooth-shape;模板里用.tx-corner-smooth-sm、-md、-lg(8 / 16 / 24px)。 - 子层:用
border-radius: inherit复制外形的子层要同时写corner-shape: inherit,这个属性不会继承。在边框或内边距以内的子层不能直接继承,要给tx-squircle传$inset,半径减去这段距离,才与宿主同心。
TxCard、TxModal、TxCommandPalette、TxFlipOverlay 与各类 Dialog 已用上平滑圆角,CoreBox 在「圆角」外观下也是,琉光折射的边缘沿着同一条连续曲线走。