圆角三部曲:一个角的二十年
一个圆角,在 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 画一张圆角矩形→用 resvg 烘焙成 PNG(像素精确、老浏览器也认),再用 sliding doors 让两张「门」图随文字宽度滑动、圆角永远贴边;或用 OOCSS 的可复用「角对象」把四张角图嵌进四层 div,套到任意内容上。本页现场生成 SVG 圆角图、演示滑动门的滑动与四角拼贴,并回顾 -moz- / -webkit- 私有前缀的过渡期。
border-radius:一行写四个角
一个 shorthand 背后是 8 个半径:四角 × 水平/垂直。看懂 1~4 值的顺时针展开(TL→TR→BR→BL)、/ 前后分写水平与垂直半径造椭圆角、4 个 longhand、百分比(50%=圆/胶囊)、以及半径之和超过边长时浏览器如何等比收缩所有角。还演示它怎样裁剪 overflow、与 border / box-shadow / outline 的协同——而不改变命中区域与布局。
border-radius 之后:corner-shape 与超椭圆
border-radius 只会画圆弧。corner-shape(CSS Borders L4,Chrome 139+)在同一个半径上换曲线类型:round / squircle / bevel / scoop / notch / square,本质都是 superellipse(<n>) 的取值(round=se(1)、bevel=se(0)、squircle=se(2)、scoop=se(-1)…)。本页用 SVG 实时画出超椭圆角的轮廓(任意浏览器都能看原理),并用真实 CSS 渲染、@supports 探测支持度,演示 Apple 式 squircle 与「票根」凹角。
只改四个角:把正方形拉成一整套图形
把 Illustrator「只变形正方形四个角」的造形法搬进浏览器。三种角变形(外側角丸 / 内側角丸 / 面取り)正对 corner-shape 的 round / scoop / bevel;配上每个角各自的 border-radius,就能用单个正方形拼出圆、拱、叶、扇、水滴、四角星、菱形、八边形、房子。本页一个逐角探索器(真实 CSS + SVG 手绘并排)+ 一个全部用 corner-shape 渲染的造形画廊(每个附完整配方)。
番外:边的故事
border 只吃纯色,border-image 能上渐变却无视 border-radius。渐变描边 一页收齐让渐变贴着圆角走的全部做法:background-clip 双层、mask-composite 遮罩环、@property + conic-gradient 旋转,及无 @property 时的降级。渐变描边:让渐变沿着圆角流动
原生 border 只接受纯色,border-image 能上渐变却抹平圆角。本页收齐让渐变贴着 border-radius 走的做法:background-clip 双层(padding-box 内芯 + border-box 渐变)、mask + mask-composite: exclude 遮罩环、@property 把 --angle 注册成 <angle> 后用 conic-gradient 让描边旋转,以及无 @property 时「overflow:hidden 裁圆角 + 旋转超大渐变层」的降级。三部曲讲角,这页讲边。
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 stubbornella.org 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。双层背景法靠它把渐变限定在边框、纯色限定在内芯,从而让渐变描边跟随圆角。