圆角三部曲:一个角的二十年
一个圆角,在 CSS 里走了二十年。最早没有任何属性能画弧线 —— 圆角是图片:用 SVG 画圆角矩形、用 resvg 烘焙成 PNG,再靠滑动门(sliding doors)或 OOCSS 的角对象把它贴到可伸缩的盒子上。border-radius(CSS3,约 2010)用一行声明终结了这套切图工程,把圆角变成渲染时画出来的矢量弧。而 2025 年的 corner-shape 又更进一步:border-radius 只能画圆/椭圆弧,corner-shape 把它推广成超椭圆(superellipse)家族 —— squircle、bevel、scoop、notch 全部可达,还能平滑动画。
主线三页按时间线展开,另有两页横向展开:「只改四个角」用同一套参数拼出一整套图形,「渐变描边」讲边而非角。每页一块实时演示区,旁边的 CSS 与 SVG 同步生成。
/ 分水平垂直、4 个 longhand、百分比)、半径超界的等比收缩、它如何裁剪 overflow 并收缩命中区域;border-radius 之后 —— corner-shape 与 superellipse:round / squircle / bevel / scoop / notch / square 的统一参数化。在此之上,只改四个角 用逐角的半径与形状,把单个正方形拼成圆、叶、星、菱、房子一整套图形。border-radius 之前:圆角是图片
没有 border-radius 的年代圆角是切出来的:SVG 画圆角矩形、烘焙成定尺 PNG,再用 sliding doors 或 OOCSS 的角对象把固定尺寸的图贴到可变宽高的盒子上。
border-radius:一行写四个角
一个 shorthand 背后是 8 个半径:四角各有水平与垂直两个。本页拆 1~4 值的顺时针展开、斜杠分写椭圆角、四个 longhand、百分比基准、半径超界时的等比收缩,以及圆角对裁剪、协同与命中区域的影响。
border-radius 之后:corner-shape 与超椭圆
border-radius 只画圆弧。corner-shape 在同一个半径上换掉曲线类型,六个关键字都是 superellipse() 的取值;负参数给出的是凸弧的镜像,而非指数小于 1 的曲线。
只改四个角:把正方形拉成一整套图形
Illustrator 的 Live Corner Widget 三种角变形正对 corner-shape 的 round / scoop / bevel。配上逐角半径,单个正方形即可拼出圆、叶、星、菱与房子。
番外:边的故事
border 只吃纯色,border-image 能上渐变却无视 border-radius。渐变描边 一页收齐让渐变贴着圆角走的全部做法:background-clip 双层、mask-composite 遮罩环、@property + conic-gradient 旋转,及无 @property 时的降级。渐变描边:让渐变沿着圆角流动
原生 border 只接受纯色,border-image 能上渐变却抹平圆角。本页收齐让渐变贴着 border-radius 走的四种做法,从背景双层与遮罩环到旋转 conic 渐变及其降级。
border-radius 让半径成为一个可计算、可继承、可动画的样式值;corner-shape 再让「角的曲率类型」也变成一个连续参数。每一步都在做同一件事 —— 把原本固化在图片资产里的视觉,搬进 CSS 的声明式世界。相关链接
📐 规范 / 文档
-
CSS Backgrounds and Borders Module Level 3 · Corners
w3.org
border-radius 的规范本体:四个 longhand 的定义、
/分写水平垂直半径、百分比基准,以及当相邻半径之和超过边长时「按同一比例 f 收缩全部半径」的精确算法。 - CSS Borders Module Level 4 · Corner shaping drafts.csswg.org corner-shape / superellipse() 的规范草案:关键字与 superellipse 数值的映射、四个 corner-*-shape longhand 与逻辑属性、为何必须配合非零 border-radius 才生效。
-
border-radius · MDN
developer.mozilla.org
border-radius 总览:1~4 值的展开顺序、
/分写水平垂直半径、百分比基准、四个 longhand,以及 Baseline(2015 年起全面可用)的兼容性数据。 - corner-shape · MDN developer.mozilla.org 逐值文档与兼容性表:round / squircle / bevel / scoop / notch / square 的视觉效果、会跟随角形状的属性(background / border / outline / box-shadow / overflow / backdrop-filter)。
- Can I use · border-radius caniuse.com border-radius 及四个 longhand 的实时浏览器支持矩阵(全局可用率约 96%)。
- Can I use · corner-shape caniuse.com corner-shape 的实时浏览器支持矩阵:目前仅 Chromium 系(Chrome / Edge / Opera)实现。
- The corner cases of implementing CSS corner-shape in Blink developer.chrome.com Chrome 工程团队讲 corner-shape 的实现:superellipse 参数 s 如何映射到 Lamé 曲线指数、凹(scoop/notch)与凸(squircle/square)如何统一参数化、绘制与裁剪的边界情形。
- Sliding Doors of CSS · A List Apart alistapart.com Douglas Bowman 2003 年的经典文:两张背景图一左一右、随内容宽度「滑动」,在没有 border-radius 的年代做出可伸缩的圆角标签 —— 本系列第一页的技术原型。
- Object Oriented CSS · Nicole Sullivan github.com OOCSS 的两大原则(分离结构与皮肤、分离容器与内容)。可复用的「圆角对象」正是其示范:把四角图封装成与内容无关的皮肤组件,套到任意盒子上而不改语义。
🎨 渐变描边 / 动画
-
Create animated gradient borders with CSS · ibelick
ibelick.com
本系列番外页的来源:
background-clip双层、@property+conic-gradient旋转、以及伪元素旋转超大渐变的降级写法,三种渐变描边动画方案并列对比。 -
@property · MDN
developer.mozilla.org
注册自定义属性:
syntax/initial-value/inherits。把--angle声明成<angle>类型,它才能被@keyframes平滑插值 —— 渐变描边旋转动画的根基。 -
mask-composite · MDN
developer.mozilla.org
多层遮罩的合成模式。
exclude(Safari 的xor)取「整盒 减去 内芯」,把渲染裁成一圈边框环 ——遮罩法渐变描边的关键一步。 -
background-clip · MDN
developer.mozilla.org
控制背景绘制区域:
border-box/padding-box/content-box。双层背景法靠它把渐变限定在边框、纯色限定在内芯,从而让渐变描边跟随圆角。