CSS 圆角完全指南:单角 / 椭圆 / 异形按钮
从 border-radius 速记法到独立四角写法、椭圆圆角、超大半径胶囊形、blob 动画形状、与 overflow:hidden 的配合、SVG vs CSS 圆角的选择、阴影与圆角的视觉互动。
border-radius 是最被低估的 CSS 属性之一。大多数开发者只会用 border-radius: 8px,但这个属性能做出椭圆、半圆、胶囊形、不规则 blob 形状,甚至配合关键帧动画做流体效果。本指南从速记法与独立角写法讲起,深入椭圆圆角、超大半径胶囊形、blob 动画、overflow 配合裁剪、SVG 对比、以及 box-shadow 视觉互动等高级技巧,帮你全面掌握这个强大属性。
速记法与独立角写法
border-radius 支持 1 到 4 个值的速记法,类似 margin/padding:
border-radius: 8px; /* 四角都 8px */
border-radius: 8px 16px; /* 上下 8px,左右 16px */
border-radius: 8px 16px 24px; /* 上 8px,左右 16px,下 24px */
border-radius: 8px 16px 24px 32px; /* 上右下左,顺时针 */
独立写法更清晰:
``
border-top-left-radius: 8px;
border-top-right-radius: 16px;
border-bottom-right-radius: 24px;
border-bottom-left-radius: 32px;
``
实际上 border-radius 可以有 8 个值(用 / 分隔水平和竖直半径),但大多数场景不需要这么复杂。
椭圆圆角:水平 / 竖直半径分别控制
border-radius 的秘密是每个角其实是一个椭圆弧,水平和竖直半径可分别指定。
border-radius: 10px 20px;
这里 10px 是水平半径,20px 是竖直半径。结果是椭圆形的角。
完整写法:
``
border-radius: 10px 20px / 5px 15px;
/ 水平半径 / 竖直半径 /
``
这样四个角分别是不同的椭圆弧。用来制作"上面圆、下面方"这样的混合形状非常方便。配合特定长宽比,可以做出自然流畅的卡片边角。
超大半径生成胶囊形与半圆
把 border-radius 设成超过容器尺寸的值,可以生成胶囊形(两端半圆的矩形)。
.pill {
width: 200px;
height: 100px;
border-radius: 50px; /* 半径 = 高 / 2,生成胶囊形 */
}
或者用百分比更通用:
``
border-radius: 50%;
``
如果容器是正方形,border-radius: 50% 就是完整圆形;矩形时就是胶囊形。这是实现圆形头像、圆形按钮最简洁的方法。
半圆:
``
border-radius: 100px 100px 0 0; / 上两个角圆,下两个角方 /
``
或者一行搞定:border-radius: 100px 100px 0; 利用速记法省略最后一个角(默认等于第二个)。
Blob 形状与不同角的半径组合
让每个角有不同的半径,再加上不规则的宽高比,就能做出有机的 blob 形状。
.blob {
width: 200px;
height: 180px;
border-radius: 40% 60% 50% 30% / 30% 50% 40% 60%;
}
这样的形状看起来像液体 blob。加上动画:
@keyframes blob {
0% { border-radius: 40% 60% 50% 30% / 30% 50% 40% 60%; }
50% { border-radius: 30% 70% 40% 40% / 50% 30% 60% 50%; }
100% { border-radius: 40% 60% 50% 30% / 30% 50% 40% 60%; }
}
.blob { animation: blob 4s infinite; }
就能做出流体效果的形状变化。这在现代设计(如 Stripe、Figma)中很流行。
与 overflow: hidden 配合裁剪子元素
border-radius 单独只影响元素本身的边框和背景,子元素内容会溢出超过圆角。结合 overflow: hidden 才能彻底裁剪。
.card {
border-radius: 8px;
overflow: hidden; /* 裁剪溢出内容 */
}
.card img {
width: 100%;
display: block; /* 移除 inline gap */
}
没有 overflow: hidden,圆角图片的四角会显示出矩形图片的直角。这是卡片设计最常见的坑。
性能提示:overflow: hidden 在某些老设备会触发新的层叠上下文,有微小性能代价。现代设备完全无所谓,但如果列表有 1000+ 个卡片,可以用 clip-path: inset() 替代(更高效)。
SVG vs CSS 圆角的选择标准
两种方式都能做圆角,选择取决于需求。
CSS border-radius: - 优点:简单、性能好、支持动画、响应式自适应 - 缺点:只支持椭圆弧,不能做出完全自由的曲线(如贝塞尔曲线)
SVG <rect> 或 <path>: - 优点:任意曲线形状、精确控制、可做复杂插图 - 缺点:需要外联或内联 SVG,文件更大,响应式需要特殊处理
决策树: - 简单矩形 + 圆角 → CSS border-radius - 圆形 / 胶囊形 → CSS border-radius: 50% - 不规则 blob / 复杂曲线 → SVG <path> - 卡片 / 按钮的圆角 → CSS(99% 的实际项目情况)
大多数场景(2026 年)用 CSS 就够了,除非设计稿明确要求 SVG 级别的曲线精度。
阴影与圆角的视觉互动
box-shadow 与 border-radius 配合使用,阴影会自动跟随圆角的曲线,产生自然的视觉效果。
.card {
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
这样阴影的 4 个角也是圆的,不会像有 border-radius 但没有阴影的元素那样显得生硬。
细节技巧:
- 多层阴影:box-shadow: 0 2px 4px rgba(0,0,0,0.1), 0 8px 16px rgba(0,0,0,0.08); 做出更自然的深度
- 内阴影:box-shadow: inset 0 1px 2px rgba(255,255,255,0.5); 在圆角内部高亮边缘,增强立体感
- 悬停效果:增加阴影模糊距离或偏移量,transition: box-shadow 0.3s; 做出浮起效果
现代设计系统(Material Design 3 等)都用这样的组合定义组件:border-radius + box-shadow 就是一张卡片的全部。
常见问题
border-radius: 50% 对矩形和圆形分别是什么效果?
对正方形,50% 就是完整圆形;对宽高不等的矩形,50% 是胶囊形(两端半圆)。百分比相对于元素的宽和高分别计算。
为什么我的圆角图片四个角还是方的?
忘了加 overflow: hidden。border-radius 只影响元素边框和背景,子元素的内容(如 <img>)会溢出超过圆角。加上 overflow: hidden 才能彻底裁剪。
border-radius 能动画化吗?
可以,现代浏览器完全支持。用 @keyframes 改变 border-radius 值,或用 transition。性能很好,因为是 GPU 加速。
border-radius 与 clip-path 有什么区别?
border-radius 只能做椭圆弧(包括圆形、胶囊形等组合),clip-path 可以做任意多边形和路径。两者都是裁剪,但 border-radius 更适合"微调边角",clip-path 适合"自由形状"。
用百分比 border-radius 响应式吗?
不如想象中灵活。border-radius: 50% 对正方形是圆形,对矩形是胶囊形,随容器变化。但如果想"圆角的大小随容器宽度缩放",用 CSS 变量 + calc() 更好:`border-radius: calc(var(--size) * 0.1);`
blob 动画的 border-radius 值是怎么设计的?
通常在设计工具(如 Figma)中手工调,或用生成器(如 blobmaker.app)随机生成,再通过 @keyframes 逐帧变化。没有通用公式,靠审美和迭代。