第32章 clip-path裁剪

第三十二章:clip-path 裁剪

clip-path就是CSS给你的"裁纸刀",可以裁剪出任意形状!菱形、圆形、六边形…只有你想不到,没有它裁不到!

32.1 基础形状函数

32.1.1 inset()——矩形裁剪

inset() 可以裁剪出一个矩形区域。值分别是上右下左四个方向的裁剪量。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
/* inset() 裁剪的基本用法 */

/* 四个值:上、右、下、左 */
.inset-all {
  clip-path: inset(10px 20px 30px 40px);
  /* 上边裁剪10px,右边20px,下边30px,左边40px。 */
}

/* 两个值:上下、左右 */
.inset-two {
  clip-path: inset(20px 30px);
  /* 上下各裁剪20px,左右各裁剪30px。 */
}

/* 一个值:四边相同 */
.inset-one {
  clip-path: inset(20px);
  /* 四边各裁剪20px。 */
}
1
2
3
4
5
<div class="inset-demo" style="width: 200px; height: 150px;">
  <div class="inset-all" style="background: #3498db; padding: 40px; color: white;">
    inset(10px 20px 30px 40px) 裁剪效果
  </div>
</div>

带圆角的 inset 裁剪:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
/* inset 带圆角 */
.inset-round {
  clip-path: inset(10px round 20px);
  /* 裁剪后四个角都变成20px圆角。 */
}

.inset-diff-rounds {
  clip-path: inset(10px round 10px 20px 30px 40px);
  /* 分别是左上、右上、右下、左下的圆角半径。 */
}

32.1.2 circle()——圆形裁剪

circle() 裁剪出圆形或椭圆形区域。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
/* circle() 裁剪的基本用法 */

/* 圆形裁剪 */
.circle {
  clip-path: circle(50%);
  /* 50%是相对于元素尺寸的圆形半径。 */
}

/* 指定半径的圆形 */
.circle-small {
  clip-path: circle(30%);
  /* 30%半径的圆。 */
}

/* 指定圆心位置 */
.circle-at {
  clip-path: circle(40% at 30% 70%);
  /* 40%半径,圆心在元素内30% 70%的位置。 */
}
1
2
<img class="circle" src="photo.jpg" alt="圆形裁剪" style="width: 200px; height: 200px; object-fit: cover;">
<img class="circle-at" src="photo.jpg" alt="偏心圆形" style="width: 200px; height: 200px; object-fit: cover;">

32.1.3 ellipse()——椭圆形裁剪

ellipse() 裁剪出椭圆形区域。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
/* ellipse() 裁剪的基本用法 */

/* 椭圆形裁剪 */
.ellipse {
  clip-path: ellipse(50% 30%);
  /* 50%是x轴半径,30%是y轴半径。 */
}

/* 指定圆心的椭圆 */
.ellipse-at {
  clip-path: ellipse(40% 50% at 50% 50%);
  /* 圆心在中心的椭圆。 */
}

32.1.4 polygon()——多边形裁剪

polygon() 是最灵活的裁剪函数,用坐标对定义多边形的顶点。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
/* polygon() 裁剪的基本用法 */

/* 菱形 */
.diamond {
  clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
  /* 四个顶点:顶部中心、右边中心、底部中心、左边中心。 */
}

/* 三角形 */
.triangle {
  clip-path: polygon(50% 0%, 100% 100%, 0% 100%);
  /* 三个顶点构成三角形。 */
}

/* 六边形 */
.hexagon {
  clip-path: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%);
}
1
2
<img class="diamond" src="photo.jpg" alt="菱形" style="width: 200px; height: 200px; object-fit: cover;">
<img class="hexagon" src="photo.jpg" alt="六边形" style="width: 200px; height: 200px; object-fit: cover;">

32.2 常用场景

32.2.1 菱形图片

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
/* 菱形图片裁剪 */
.diamond-img {
  width: 300px;
  height: 300px;
  clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
  transition: clip-path 0.3s;
}

.diamond-img:hover {
  clip-path: polygon(20% 0%, 80% 0%, 100% 100%, 0% 100%);
  /* hover时变成梯形,优雅地"倒下" */
}

32.2.2 斜切卡片

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* 斜切卡片效果 */
.beveled-card {
  clip-path: polygon(
    0% 0%,           /* 左上顶点 */
    100% 0%,         /* 右上顶点 */
    100% calc(100% - 20px),  /* 右侧切角起点 */
    calc(100% - 20px) 100%,  /* 右下切角终点 */
    0% 100%              /* 左下顶点 */
  );
  background: #3498db;
  padding: 24px;
  transition: clip-path 0.3s;
}

.beveled-card:hover {
  clip-path: polygon(
    0% 0%,
    100% 0%,
    100% 100%,
    0% 100%
  );
}

32.3 动画效果

32.3.1 clip-path过渡动画

1
2
3
4
5
6
7
8
9
/* clip-path 过渡动画 */
.morphing {
  clip-path: circle(50%);
  transition: clip-path 0.5s ease;
}

.morphing:hover {
  clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
}

本章小结

clip-path是CSS的裁纸刀,支持inset、circle、ellipse、polygon四种基本形状函数。

核心函数

函数说明
inset()矩形裁剪
circle()圆形裁剪
ellipse()椭圆形裁剪
polygon()多边形裁剪

下章预告

下一章我们将学习层叠与继承!