clip-path
CSS 属性使用裁剪方式创建元素的可显示区域。区域内的部分显示,区域外的隐藏。和canvas和svg的剪裁很像。
取值
<clip-source>
:用 <url>
表示剪切元素的路径
<basic-shape>
:一种形状,其大小和位置由<几何盒>值定义。如果没有指定几何框,则边框将用作参考框
<geometry-box>
:如果同 <basic-shape>
一起声明,它将为基本形状提供相应的参考框盒。通过自定义,它将利用确定的盒子边缘包括任何形状边角(比如说,被 border-radius
定义的剪切路径)。几何框盒可以有以下的值中的一个:
margin-box
:使用 margin box 作为引用框。border-box:
使用 border box 作为引用框。padding-box
:使用 padding box 作为引用框。content-box
:使用 content box 作为引用框。fill-box
:利用对象边界框作为引用框。stroke-box
:使用笔触边界框(stroke bounding box)作为引用框view-box
:使用最近的 SVG 视口(viewport)作为引用框。如果viewBox
属性被指定来为元素创建 SVG 视口,引用框将会被定位在坐标系的原点,引用框位于由viewBox
属性建立的坐标系的原点,引用框的尺寸用来设置viewBox
属性的宽高值。
none
:不创建的剪切路径。
/* Keyword values */
clip-path: none;
/* <clip-source> values */
clip-path: url(resources.svg#c1);
/* <geometry-box> values */
clip-path: margin-box;
clip-path: border-box;
clip-path: padding-box;
clip-path: content-box;
clip-path: fill-box;
clip-path: stroke-box;
clip-path: view-box;
/* <basic-shape> values */
clip-path: inset(100px 50px);
clip-path: circle(50px at 0 100px);
clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
clip-path: path('M0.5,1 C0.5,1,0,0.7,0,0.3 A0.25,0.25,1,1,1,0.5,0.3 A0.25,0.25,1,1,1,1,0.3 C1,0.7,0.5,1,0.5,1 Z');
/* Box and shape values combined */
clip-path: padding-box circle(50px at 0 100px);
/* Global values */
clip-path: inherit;
clip-path: initial;
clip-path: unset;
正式语法
<clip-source> | [ <basic-shape> || <geometry-box> ] | none
where<clip-source> = <url>
<basic-shape> = <inset()> | <circle()> | <ellipse()> | <polygon()> | <path()>
<geometry-box> = <shape-box> | fill-box | stroke-box | view-box
where<inset()> = inset( <length-percentage>{1,4} [ round <'border-radius'> ]? )
<circle()> = circle( [ <shape-radius> ]? [ at <position> ]? )
<ellipse()> = ellipse( [ <shape-radius>{2} ]? [ at <position> ]? )
<polygon()> = polygon( <fill-rule>? , [ <length-percentage> <length-percentage> ]# )
<path()> = path( [ <fill-rule>, ]? <string> )
<shape-box> = <box> | margin-box
where<length-percentage> = <length> | <percentage>
<shape-radius> = <length-percentage> | closest-side | farthest-side
<position> = [ [ left | center | right ] || [ top | center | bottom ] | [ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ]? | [ [ left | right ] <length-percentage> ] && [ [ top | bottom ] <length-percentage> ] ]
<fill-rule> = nonzero | evenodd
<box> = border-box | padding-box | content-box
与SVG对比
<style>
#clipped {
margin-bottom: 20px;
clip-path: url(#cross);
}
</style>
<img id="clipped" src="https://mdn.mozillademos.org/files/12668/MDN.svg" alt="MDN logo">
<svg height="0" width="0">
<defs>
<clipPath id="cross">
<rect y="110" x="137" width="90" height="90"/>
<rect x="0" y="110" width="90" height="90"/>
<rect x="137" y="0" width="90" height="90"/>
<rect x="0" y="0" width="90" height="90"/>
</clipPath>
</defs>
</svg>
<select id="clipPath">
<option value="none">none</option>
<option value="circle(100px at 110px 100px)">circle</option>
<option value="url(#cross)" selected>cross</option>
<option value="inset(20px round 20px)">inset</option>
<option value="path('M 0 200 L 0,110 A 110,90 0,0,1 240,100 L 200 340 z')">path</option>
</select>
clip-path: circle(40%);
clip-path: ellipse(130px 140px at 10% 20%);
clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
案例:
如下:通过亮色轨道和暗色轨道重叠,之后不断剪裁亮色轨道,实现沿轨道流动的效果
.clip-path-bg {
width: px2rem(457);
height: px2rem(371);
@include imgPath("light-border.png");
position: absolute;
top: 0.324rem;
top: 32.4vw;
left: 0.288rem;
left: 28.8vw;
-webkit-clip-path: circle(70%);
clip-path: circle(70%);
animation: Streamer 3s linear infinite;
}
@keyframes Streamer {
0% {
-webkit-clip-path: polygon(0 0, 20% 0, 20% 20%, 0 20%); //4个点矩形
clip-path: polygon(0 0, 20% 0, 20% 20%, 0 20%);
}
30% {
-webkit-clip-path: polygon(69% 0, 100% 0, 100% 27%, 68% 29%);
clip-path: polygon(69% 0, 100% 0, 100% 27%, 68% 29%);
}
60% {
-webkit-clip-path: polygon(62% 36%, 100% 37%, 100% 64%, 60% 65%);
clip-path: polygon(62% 36%, 100% 37%, 100% 64%, 60% 65%);
}
80% {
-webkit-clip-path: polygon(57% 52%, 95% 53%, 95% 88%, 53% 86%);
clip-path: polygon(57% 52%, 95% 53%, 95% 88%, 53% 86%);
}
100% {
-webkit-clip-path: polygon(0 61%, 36% 60%, 35% 100%, 0 100%);
clip-path: polygon(0 61%, 36% 60%, 35% 100%, 0 100%);
}
}
详细查看MDN:mozilla