✂️ clip-path
语法 + 示例的结构:先讲清参数,再看实际场景
语法与参数含义
clip-path 的核心是“裁剪形状”。 形状可以是基本几何(basic-shape)或 SVG 路径。
clip-path: inset(top right bottom left round radius);
clip-path: circle(radius at cx cy);
clip-path: ellipse(rx ry at cx cy);
clip-path: polygon(x1 y1, x2 y2, ...);
clip-path: path("SVG Path");
clip-path: url(#clipPathId);
- inset():四边向内裁剪。top/right/bottom/left 从 元素边框内侧开始计算,px 是固定长度,% 相对元素自身宽高: top/bottom 按高度百分比,left/right 按宽度百分比。
- round:可选,给 inset 的四角加圆角,支持 1-4 个值(类似 border-radius)。
- circle():圆形裁剪。radius 用 px 时是固定半径; 用 % 时相对元素盒子的“参考尺寸”(通常可理解为较小边的百分比)。 at cx cy 是圆心位置,% 相对元素宽/高。
- ellipse():椭圆裁剪。rx ry 分别是水平/垂直半径; px 为固定值,% 分别相对元素宽与高。at cx cy 控制椭圆中心。
- polygon():多边形裁剪。每个点是一对坐标 x y, 坐标原点在元素左上角,x 向右、y 向下。% 分别相对元素宽与高。
- path():使用 SVG Path 语法,坐标单位通常为 px,原点在元素左上角, 适合复杂形状。
- url():引用 SVG 的 <clipPath>, 适合复用或更复杂图形。
理解关键:裁剪的计算区域来自元素自己的“盒子”。当使用 % 时,横向按宽、纵向按高计算。
对于 circle(45%) 这样的写法,45% 表示“半径”, 参考元素的较短边(min(宽,高))。不是弧度。
例子:元素尺寸 200×140,较短边=140 → 半径=0.45×140=63px。
示例:典型场景 + 参数解释
1) inset():内容聚焦 / 留白框
场景:让内容缩进出“安全边距”。top/right/bottom/left 从边缘向内裁剪。 这里使用 top/bottom 百分比按高度计算,左右按宽度计算。
例子:元素宽 300、高 200,inset(8% 10% 12% 6%) → 上裁剪 16px、右裁剪 30px、下裁剪 24px、左裁剪 18px。
.panel {
clip-path: inset(8% 10% 12% 6%);
}
2) circle():头像裁剪 / 聚焦点
场景:头像、徽章、聚焦区域。radius 控制大小, at cx cy 控制圆心位置。
例子:元素 200×140,circle(45% at 50% 50%) → 半径 63px, 圆心在 (100px, 70px)。
.avatar {
clip-path: circle(45% at 50% 50%);
}
3) ellipse():胶囊头像 / 横向裁剪
场景:横向头像、强调条。rx 影响宽度, ry 影响高度。
例子:元素 300×200,ellipse(55% 40% at 50% 50%) → rx=165px,ry=80px,中心点 (150px, 100px)。
.badge {
clip-path: ellipse(55% 40% at 50% 50%);
}
4) polygon():卡片折角 / 对话框
场景:折角卡片、标签。点位顺序决定轮廓,% 相对元素宽高。
例子:元素 300×200,点 (90% 0) = (270px, 0),点 (100% 12%) = (300px, 24px)。
.card {
clip-path: polygon(0 0, 90% 0, 100% 12%, 100% 100%, 0 100%);
}
5) path():复杂形状 / 品牌轮廓
场景:复杂图形、品牌轮廓。使用 SVG Path,坐标单位通常为 px。
例子:path 中的坐标是像素单位,点 (210, 20) 表示距左 210px、距上 20px。
.shape {
clip-path: path("M 30 20 L 210 20 L 180 200 L 60 200 Z");
}
6) url():复用 SVG clipPath
场景:统一裁剪规则、可复用裁剪形状。
例子:复用 SVG 里的 clipPath id="ticket", 任意元素只需写 clip-path: url(#ticket)。
<svg width="0" height="0">
<clipPath id="ticket">
<path d="M0,0 H240 V80 Q220,90 240,100 V200 H0 Z" />
</clipPath>
</svg>
.ticket {
clip-path: url(#ticket);
}
7) 常见形状快速切换
选择不同形状,观察裁剪区域的变化。
clip-path: inset(12% 10% 18% 8% round 12%);
clip-path: circle(45% at 50% 45%);
clip-path: ellipse(45% 35% at 50% 50%);
clip-path: polygon(50% 0%, 100% 25%, 80% 100%, 20% 100%, 0% 25%);
clip-path: path('M 40 20 L 200 20 L 160 200 L 80 200 Z');
8) 兼容与降级
某些旧浏览器或内核对 clip-path 支持不完整,建议配合 @supports 进行降级。
.box {
border-radius: 24px;
}
@supports (clip-path: circle(50%)) {
.box {
clip-path: circle(50% at 50% 50%);
-webkit-clip-path: circle(50% at 50% 50%);
}
}
降级样式
使用 border-radius 保证基础视觉可用。
启用 clip-path
支持时再呈现更精细的裁剪形状。
9) 进阶技巧:动画与变量
clip-path 可以和动画、CSS 变量结合,做出动态裁剪效果。
悬停动画
变量驱动
.avatar {
--r: 42%;
clip-path: circle(var(--r) at 50% 50%);
}
.avatar.is-zoom { --r: 60%; }
10) 实战提示
保持形状可读
多边形点位不要太密集,优先可维护的结构。
避免过度裁剪
裁剪区域过小会影响内容可读性,记得响应式调整。
动画更顺滑
尽量在相同类型形状间过渡,避免跳变。
11) 综合应用:聚光灯引导
场景:新手引导。用变量控制圆形裁剪位置,配合 JS 逐步引导。
.spotlight {
--x: 50%;
--y: 50%;
--r: 120px;
clip-path: circle(var(--r) at var(--x) var(--y));
}
.step-2 { --x: 20%; --y: 30%; }
.step-3 { --x: 80%; --y: 70%; }