css clip-path


1.背景

clip-path是由clip演化而来的样式属性,表示裁剪元素的一部分来显示,其余部分隐藏。顾名思义clip-path着重于path路径。

2.使用场景

最先想到的场景就是登录某平台后显示的头像框,比如圆形的,就是将方形的头像裁剪出圆形来显示。其次就是用于绘制图形,比如一个红色的正方形等。或者绘制不规则图形,以及显示图形的不规则的一部分。

通常用法就是结合背景色或背景图片,来进行裁剪

3.语法

基本语法: | [ || ] | none

/属性说明/
=
= | | |
= | fill-box | stroke-box | view-box basic-shape有4种,分别是矩形,圆形,椭圆,多边形。
inset()可以传入5个参数,分别对应top,right,bottom,left的裁剪位置,round radius(可选,圆角)
//示例
     clip-path: inset(2em 3em 2em 1em round 2em);

circle()可以传人2个可选参数;
1. 圆的半径,默认元素宽高中短的那个为直径,支持百分比
2. 圆心位置,默认为元素中心点
//半径公式
如果半径使用百分比:圆的半径 = (sqrt(width^2+height^2)/sqrt(2)) * 百分比 

//示例
clip-path: circle(30% at 150px 120px);

ellipse()可以传人3个可选参数;
1. 椭圆的X轴半径,默认是宽度的一半,支持百分比
2. 椭圆的Y轴半径,默认是高度的一半,支持百分比
3. 椭圆中心位置,默认是元素的中心点

//示例
clip-path: ellipse(45% 30% at 50% 50%);

//语法
polygon( -rule>? , [ -percentage> -percentage> ]# )
//说明
-rule>可选,表示填充规则用来确定该多边形的内部。可能的值有nonzero和evenodd,默认值是nonzero
后面的每对参数表示多边形的顶点坐标(X,Y),也就是连接点

//示例
clip-path: polygon(50% 0,100% 50%,0 100%);

polygon可以有理论上无数多个点。一个可以方便取点坐标的网站:
http://betravis.github.io/shape-tools/polygon-drawing/


还可以结合动画,比如
.clip-path2{
        transition: 0.4s cubic-bezier(1, -1, 0, 2);
        clip-path: circle(30% at 200px 100px)
    }
  .clip-path2:hover{
        clip-path: circle(20% at 200px 100px)
    }

4.示例

这里做一个9宫格,然后将中间格子与其他格子连线。上下左右可以直接用横向和纵向的直线,但是四个角的连线就需要用斜线。这里可以用clip-path来画斜线。这里例子中使用了另一种画斜线的方法,但是需要旋转角度确定才可以,相对来说clip-path可以结合百分比更方便。代码如下:

  1 <html>
  2     <head>
  3         <style>
  4         .box {
  5             width: 100%;
  6             height: 100%;
  7             position: relative;
  8         }
  9         .box div {
 10             box-sizing: border-box;
 11         }
 12         .flex-sp-b {
 13             display: flex;
 14             justify-content: space-between;
 15         }
 16         .flex-c {
 17             flex-direction: column;
 18         }
 19         .flex-r {
 20             flex-direction: row;
 21         }
 22         .union {
 23             width: 22%;
 24         }
 25         .cell {
 26             height: 22%;
 27             border: 1px solid #348efd;
 28             display: flex;
 29             justify-content: center;
 30             align-items: center;
 31         }
 32         .lines {
 33             position: absolute;
 34         }
 35         .line {
 36             border: 1px solid #9a9a9a;
 37             position: absolute;
 38         }
 39         .line-single {
 40             width: 17%;
 41             height: 17%;
 42             border: none;
 43         }
 44         .line1 {
 45             left: 22%;
 46             top: 22%;
 47             background: linear-gradient(26deg, transparent 49.5%, #9a9a9a 49.5%, #9a9a9a 51.5%, transparent 51.5%);
 48         }
 49         .line2 {
 50             width: 17%;
 51             height: 0px;
 52             top: 50%;
 53             left: 22%;
 54         }
 55         .line3 {
 56             left: 22%;
 57             top: 61%;
 58             background: linear-gradient(154deg, transparent 49.5%, #9a9a9a 49.5%, #9a9a9a 51.5%, transparent 51.5%);
 59         }
 60         .line4 {
 61             height: 17%;
 62             width: 0px;
 63             left: 50%;
 64             top: 22%;
 65         }
 66         .line6 {
 67             height: 17%;
 68             width: 0px;
 69             left: 50%;
 70             top: 61%;
 71         }
 72         .line7 {
 73             left: 61%;
 74             top: 22%;
 75             background: linear-gradient(154deg, transparent 49.5%, #9a9a9a 49.5%, #9a9a9a 51.5%, transparent 51.5%);
 76         }
 77         .line8 {
 78             width: 17%;
 79             height: 0px;
 80             top: 50%;
 81             left: 61%;
 82         }
 83         .line9 {
 84             left: 61%;
 85             top: 61%;
 86             background: linear-gradient(26deg, transparent 49.5%, #9a9a9a 49.5%, #9a9a9a 51.5%, transparent 51.5%);
 87         }
 88         .line11 {
 89             left: 22%;
 90             top: 22%;
 91             clip-path: polygon(-1% -2%, 102% 99%, 100% 101%, -1% 2%);
 92             background: deeppink;
 93         }
 94         .line33 {
 95             left: 22%;
 96             top: 61%;
 97             clip-path: polygon(-1% 99%, 1% 101%, 101% 1%, 99% -1%);
 98             background: deeppink;
 99         }
100         .line77 {
101             left: 61%;
102             top: 22%;
103             clip-path: polygon(-1% 99%, 1% 101%, 101% 1%, 99% -1%);
104             background: deeppink;
105         }
106         .line99 {
107             left: 61%;
108             top: 61%;
109             clip-path: polygon(-1% -2%, 102% 99%, 100% 101%, -1% 2%);
110             background: deeppink;
111         }
112         h1:after
113   {
114   content:url(beep.wav);
115   }
116         style>
117     head>
118     <body>
119         <div class="box flex-sp-b flex-r">
120             <div class="union flex-sp-b flex-c">
121                 <div class="cell">1div>
122                 <div class="cell">2div>
123                 <div class="cell">3div>
124             div>
125             <div class="union flex-sp-b flex-c">
126                 <div class="cell">4div>
127                 <div class="cell">5div>
128                 <div class="cell">6div>
129             div>
130             <div class="union flex-sp-b flex-c">
131                 <div class="cell">7div>
132                 <div class="cell">8div>
133                 <div class="cell">9div>
134             div>
135             <div class="box lines">
136                 <div class="line line1 line-single">div>
137                 <div class="line line11 line-single">div>
138                 <div class="line line2">div>
139                 <div class="line line3 line-single">div>
140                 <div class="line line33 line-single">div>
141                 <div class="line line4">div>
142                 <div class="line line6">div>
143                 <div class="line line7 line-single">div>
144                 <div class="line line77 line-single">div>
145                 <div class="line line8">div>
146                 <div class="line line9 line-single">div>
147                 <div class="line line99 line-single">div>
148             div>
149         div>
150     body>
151 html>

效果如下:

 这里为了对比,将两种斜线都显示了出来,粉红色是clip-path画的,灰色是旋转实现的,宽高变化后,灰色线就对接不到顶点了,但是clip-path的线会随之拉伸。