← 圆角三部曲:一个角的二十年 / border-radius:一行写四个角 待审核 2 / 5
border-radius · 圆角本体

border-radius:一行写四个角

border-radius 把上一页那套切图工程压成一行声明:圆角不再是图片资产,而是浏览器在渲染时画出的矢量弧——能继承、能动画、随字号与主题色自由变化。它看似简单,背后却是 8 个半径:四个角各有水平垂直两个半径。本页拆解它的全部语法:1~4 值的顺时针展开、/ 分写水平垂直造椭圆角、4 个 longhand、百分比基准、半径超界时的等比收缩,以及它如何裁剪 overflow、与 border / box-shadow / outline 协同。

1 · 四角语法:1~4 值如何顺时针展开

border-radius 的 1~4 个值不是 margin / padding 那套「上右下左」,而是四个角,从左上角顺时针:toplefttoprightbottomrightbottomlefttop-left \to top-right \to bottom-right \to bottom-left。默认值对角补齐:1 值四角相同;2 值 =「主对角线 / 副对角线」(TL·BR / TR·BL);3 值 =「TL / 两个副对角 / BR」。每个角其实有水平与垂直两个半径——默认同步(水平=垂直,正圆弧);把某个角单独切到分开,该角的水平与垂直各自可调,shorthand 用 / 把它们前后分写(详见下一节)。拖滑块,看 shorthand 如何自动塌缩成最短写法,以及对应的 4 个 longhand。

1.1 · 四个 longhand,以及它们各自的两个半径

shorthand border-radius 把这 4 个(及它们各自的水平 / 垂直分量)合写;水平与垂直用 / 分隔,见下一节。
longhand 管哪个角 取值
border-top-left-radius 左上 可接 1 或 2 个值:水平 垂直。一个值时水平=垂直(正圆弧)
border-top-right-radius 右上 同上
border-bottom-right-radius 右下 同上
border-bottom-left-radius 左下 同上

顺序记忆:从左上角开始顺时针转一圈。这与 margin / padding 的「上右下左」不同——它是不是。默认补齐规则也不同:border-radius 默认补对角(2 值 = 两条对角线),而 margin 默认补对边。把 TL 与 BR 设成一样、TR 与 BL 设成另一样,会看到 shorthand 塌缩成两个值

2 · 椭圆角:/ 把水平与垂直半径分开

每个角的弧其实是一段椭圆弧,有独立的水平半径垂直半径。当两者相等,弧是正圆;不等,就是被拉长的椭圆。在 shorthand 里用 / 分隔:斜杠前是四个角的水平半径,斜杠后是四个角的垂直半径——border-radius: 40px 20px / 20px 40px。拖两个滑块体会椭圆角。

50% 的两个特例。百分比相对border box 的宽 / 高计算。当四角都是 50%:正方形 → 正圆;长方形 → 椭圆(水平半径=宽一半、垂直半径=高一半)。而做胶囊按钮(两端半圆)的稳妥写法是 border-radius: 9999px——一个大到一定被收缩算法压回「半个短边」的长度值,无论盒子多宽都恰好是半圆端,且不像 50% 那样在长方形上变成椭圆。

3 · 半径超界:浏览器如何等比收缩

如果相邻两个角的半径之和超过了它们共享那条边的长度,弧就会重叠、画不出来。规范规定此时浏览器不报错、不裁断,而是为所有半径找一个统一的缩放系数 f=min(各边长÷该边两端半径之和)f = \min (各边长 \div 该边两端半径之和)(且不超过 1),把每个半径都乘以 f。结果:半径整体等比缩小,保持比例不失真。把下面这个盒子的半径推到超过盒子尺寸,看 f 与实际渲染。

为什么是「全部一起缩」而不是「各自夹断」?若每个角单独 clamp,相邻半径不同时会出现突变拐点,弧线不再平滑相接。统一系数 f 保证所有角按同一比例缩小,相邻弧仍能平滑过渡——这也是 9999px 胶囊写法可靠的原因:它一定触发收缩,被压回恰好半个短边

4 · 裁剪与协同:谁跟着圆角走

圆角只改变盒子的可见轮廓,不改变它在布局里占的方形区域,也不改变命中(点击)区域——角外那块「方角余料」依然可点。要让内容也被圆角裁掉,需 overflow: hidden(或 clip / auto);backgroundbox-shadow 默认就跟随圆角轮廓,而 outline 多数实现跟随但留有间隙

overflow: visible 下,子内容的方角会「探出」圆角轮廓。这是最常见的圆角失效来源:父级设了 border-radius 却没设 overflow: hidden,里面的图片 / 背景在角上露出直角。但要注意 overflow: hidden切断子级的 position: absolute 溢出与 box-shadow 外扩——需要圆角裁剪又要让阴影外溢时,常用额外一层包裹分离这两件事。

4.1 · 圆角与各属性的关系

属性 / 行为 跟随圆角? 要点
background 跟随 背景被裁进圆角轮廓(默认 background-clip: border-box
box-shadow 跟随 外阴影 / 内阴影都沿圆角轮廓绘制
border 跟随 边框内外缘各自是一条圆弧;边宽不一时内外半径不同
outline 多数跟随 现代浏览器沿圆角描边,但常留间隙,且不占布局
子内容 默认不裁 overflow: hidden/clip/auto 才被圆角裁切
命中 / 布局区域 不变 仍是方形;角外余料可点击。要改命中形状用 clip-path

5 · 下一步

border-radius 能画的弧,本质都是圆 / 椭圆corner-shape 一页展示它如何在同一个半径上换掉曲线类型——把圆弧推广成 squircle、bevel、scoop、notch 的超椭圆家族。