CSS的clip-path 一

     首先介绍一下,我以为前端开发都是很具备分享精神的,不少人都写出了不少优秀的总结经验供新手们参考,本人只是个搬运工,将别人优秀的文章进行了总结,本文主要转载自  大漠  的文章  http://www.w3cplus.com/css3/introducing-css-clip-path-property.htmljavascript

     在Web网页中主要是以矩形分布的。而平面媒体则倾向于更多不一样的形状。形成这种差别的缘由是由于缺乏合适的工具去实现咱们平面媒体中的内容。这也就形成了不少设计师的创意发挥,就算是有创意,前端实现也将付出巨大的开发成本。css

虽然CSS Shapes Module Level 1(CSS形状模块标准1)的规范出现,能够打破矩形设计的限制。但仍须要一些不规则的图形。而早前实现一些不规则的图形,都需借助其它的元素功能,好比CSS绘制图形,不少时候就依赖于伪元素,或多个元素。如此一来,CSS Shapes依旧没法发挥其强大的功能,让咱们的Web打破常规的矩形布局。不过值得庆幸的是,CSS的clip-path出现,它能够帮助咱们绘制不少特殊的图形(不规则的图形),地址是  http://bennettfeely.com/clippy/   好比:html

那么这篇文章,咱们就一块儿来了解这个属性。前端

学习这个属性以前咱们先了解一下兼容性java

浏览器兼容性

看到这里,你们确定会问,浏览器兼容性如何?css3

IE 和 Edge 不支持这个属性。Firefox 仅部分支持 clip-path (它只支持 url() 语法)。可是 47 以上的版本,激活 Firefox 的layout.css.clip-path-shapes.enabled选项就能够支持这个属性了。web

Chrome、Safari 和 Opera 须要使用 -webkit- 前缀支持此属性。不幸的是,它们还不支持外部的 SVG 形状。更多浏览器支持性信息以下:chrome

基本概念

clip-path从单词"clip path"的直译上来讲,表示的就是裁剪路径。既然有裁剪,我们就来了解这里面的几个简单的概念。浏览器

裁剪就是从某样东西剪切一块。好比说,咱们在<img>元素上,根据须要,剪切一部分须要留下的区域。而在整个裁剪中,将会碰到两个相关的概念:裁剪路径(Clipping Path)裁剪区域(Clipping Region)bash

裁剪路径是咱们用来裁剪元素的路径,它标记了咱们须要裁剪的区域。它能够是个简单的形状(好比Web中常见的矩形),也能够是一个复杂的多边形(不规则的多边形)。

裁剪区域是裁剪路径闭合后所包含的所有区域。

 

这样一来,元素分为两部分,裁剪区域和裁剪区域外。浏览器会裁剪掉裁剪区域之外的区域,不只是背景及其它相似的内容,也包括bordertext-shadow 等。更赞的是,浏览器不会捕获元素裁剪区域之外的 hoverclick 等事件。

 即便现在一些特定元素不受长方形限制,但实际上元素周围的内容仍是会认为元素是原始形状(长方形)的,并按此进行文档流的布局。要想使周围元素根据元素裁剪后的形状进行布局,可使用 shape-outside属性。有关于shape-outside相关详细的介绍,能够阅读有关于CSS Shapes相关的教程,这里不进行过多阐述。

旧的clip

CSS Masking Module Level 1中也提供了一个clip属性。能够说clip是CSS中出现的第一种裁剪技术。其实了解过clip的同窗都知道,它就是经过overflow:hidden将裁剪区域外的元素隐藏掉了。能够说它不是真正的裁剪。

clip属性到目前为止,仅支持rect()函数,就是裁剪出一个矩形(其它形状还没法实现)。

clip: rect(<top>, <right>, <bottom>, <left>);

在CSS2.1中,rect()<top><bottom>指定偏移量是从元素盒子顶部边缘算起;<left><right>指定的偏移量是从元素盒子左边边缘算起。

更为无奈的是,clip属性只能在元素设置了position:absolute或者position:fixed起做用。没法在设置position:relativeposition:static上工做。

在CSS中,clip 属性是已过期的,也就是说它已经再也不建议被使用,由于有一个更新的、规范的版本,各个浏览器也将集中努力使用它。

固然,clip也是有一些优点的:由于clip是运行在浏览器中的,它可能会一直有效。而浏览器对它的支持是很是强大的:几乎是有史以来的每个浏览器。另外,我也据说过了,它做出的动画效果赛过其它的新方法。

可是比起它的优点,clip有两个更为重要的弱点,这也使得它难以被普遍地使用:

  • clip 只对绝对定位的元素有效
  • clip 只能用于矩形,即rect()函数

这真的是很是大的限制!因此来让咱们接着说接下来更为重要的属性clip-path

 若是你是第一次接触过属性,我建议您花点时间阅读一下这篇文章,它能帮助你对有一个简单的了解。clipclip

clip-path语法

W3C官方规范提供的clip-path语法:

clip-path: <clip-source> | [ <basic-shape> || <geometry-box> ] | none
其默认值是。另外简单介绍几个属性值:noneclip-path
  • clip-source: 能够是内、外部的SVG的<clipPath>元素的URL引用
  • basic-shape: 使用一些基本的形状函数建立的一个形状。主要包括circle()ellipse()inset()polygon()。具体的说明能够看CSS Shapes中有关于说明。另外在CSS Shapes 101一文中也有详细介绍。
  • geometry-box: 是可选参数。此参数和basic-shape函数一块儿使用时,能够为basic-shape的裁剪工做提供参考盒子。若是geometry-box由自身指定,那么它会使用指定盒子形状做为裁剪的路径,包括任何(由border-radius提供的)的角的形状。

开始使用clip-path

在开始使用clip-path绘制图形,或者说裁剪图形以前,有两点须要你们注意:

  • 使用clip-path要从同一个方向绘制,若是顺时针绘制就一概顺时针,逆时针就一概逆时针,由于polygon是一个连续线段,若线段彼此有交集,裁剪区域就会有相减的状况发生,固然若是你特地须要这样的效果除外。
  • 若是绘制时采用比例的方式绘制,长宽就必需要先行设定,否则有可能绘制出来的长宽和咱们想像的就会有差距,使用像素绘制就不会有这样的现象。

先来看一个使用polygon()函数绘制的示例:

img {
  clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
}

这段代码会将全部的图片裁剪为菱形。可是为何图片会被裁剪为菱形而不是梯形或平行四边形之类的呢?这主要取决于函数顶点的值。下图将说明一切:

 

 

每一个点的第一个坐标值决定了它在 x 轴上的位置,第二个坐标值指定了它在 y 轴的位置,全部点是顺时针绘制的。好比菱形最右边的点,它位于 y 轴下方一半处,因此它的 y 坐标是 50%。同时这个点位于 x 轴的最右侧,因此它的 x 坐标是 100%。其它点的坐标同理可得。

最后效果以下所示:

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>Clip path</title>
  6     <style type="text/css">
  7         body {
  8             margin: 20px auto;
  9             text-align: center;
 10             font-family: 'Lato';
 11             max-width: 640px;
 12         }
 13 
 14         h1 {
 15             margin-bottom: 100px;
 16             font-size: 1.8em;
 17         }
 18 
 19         div {
 20             display: inline-block;
 21             margin: 50px 0px;
 22             width: 250px;
 23             height: 250px;
 24             border-radius: 200px;
 25             filter: grayscale(0.9);
 26             cursor: pointer;
 27         }
 28 
 29         div:hover {
 30             filter: none;
 31         }
 32 
 33         div:hover .text {
 34             opacity: 1;
 35         }
 36 
 37         .text {
 38             position: absolute;
 39             background: rgba(200, 0, 0, 0.5);
 40             padding: 20px 0;
 41             top: 90px;
 42             width: 250px;
 43             opacity: 0;
 44             text-align: center;
 45             color: white;
 46             font-size: 1.4em;
 47         }
 48 
 49         .left .text {
 50             background: rgba(0, 0, 200, .5);
 51         }
 52 
 53         .right .text {
 54             background: rgba(200, 100, 0, 0.5);
 55         }
 56 
 57         .bottom .text {
 58             background: rgba(0, 200, 0, 0.5);
 59         }
 60 
 61         .top {
 62             background: url('http://t.imgbox.com/KXaGvTFB.jpg');
 63             clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
 64             background-size: contain;
 65             position: relative;
 66             left: -125px;
 67             top: -130px;
 68         }
 69 
 70         .left {
 71             background: url('http://t.imgbox.com/LHPFYSYE.jpg');
 72             clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
 73             background-size: contain;
 74             position: relative;
 75         }
 76 
 77         .right {
 78             background: url('http://t.imgbox.com/tlgvPjwn.jpg');
 79             clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
 80             background-size: contain;
 81             position: relative;
 82             top: -352px;
 83             left: 256px;
 84         }
 85 
 86         .bottom {
 87             background: url('http://t.imgbox.com/R7h6VtZr.jpg');
 88             clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
 89             background-size: contain;
 90             position: relative;
 91             top: -220px;
 92             left: -126px;
 93         }
 94     </style>
 95 </head>
 96 <body>
 97 <h1>Images clipped with <code>clip-path</code> Property</h1>
 98 <div class="left"><p class="text">SPORTS</p></div>
 99 <div class="top"><p class="text">TECHNOLOGY</p></div>
100 <div class="right"><p class="text">FOOD</p></div>
101 <div class="bottom"><p class="text">NATURE</p></div>
102 </body>
103 </html>
View Code

效果图以下:

 

 

记得之前CSS绘制图形总得束手束脚,并且还得想法设法,使用clip-path绘制什么六边形、八边形、五角形、心形等,都再也不是难事了。OXXO.STUDIO有一篇文章《運用 clip-path 的純 CSS 形狀變換》详细介绍了这些图形是如何绘制的。固然除此以外,在线的CSS clip-path maker提供了不少不规则的图形案例:

利用 geometry-box 裁剪元素

在具体使用geometry-box来裁剪元素以前,对geometry-box作一下相关的了解。

geometry-box能够是shape-boxfillstroke或者view-box。其中shape-box应用于HTML元素,它具备四种值:margin-boxborder-boxpadding-boxcontent-box

shape-box

来看个简单的示例:

 

.clip-me {
    clip-path: polygon(10% 20%, 20% 30%, 50% 80%) margin-box;
    margin: 10%;
}
View Code

在上例中,元素的 margin-box 会做为参考,来决定裁剪点的实际位置。点(10%,10%)是 margin-box 的左上角,因此clip-path 的定位会根据此点进行计算。

其实shape-box和CSS Shapes中的引用框概念很是相似,有关于这方面的介绍,能够花点时间阅读《理解CSS Shapes的引用框》一文。

若是geometry-boxbasic-shape一块儿使用,能够引用basic-shape提供的引用框。其做用和shape-outside属性相似,更多的细节能够看看shape-outside属性介绍

若是geometry-box由自身指定,那么它会使用指定盒子形状做为裁剪的路径,包括任何(由border-radius提供的)的角的形状。

除了shape-box值,还能够运用SVG元素上,它具备另外三个值:fillstrokeview-box

clipPath 和clip-path

在SVG中有一个clipPath元素。<clipPath>元素不会直接在页面上呈现,他惟一的做用就是能够经过clip-path来引用。它和CSS的clip-path仍是有很大的区别。有关于二者的详细介绍能够阅读《CSS和SVG中的剪切:clip-path属性和<clipPath>元素》一文。

而不少时候二者能够结合一块儿使用。

你不须要在CSS中定义clip-path的值,由于它可以引用SVG中定义的 <clipPath>标签元素。下面是它的使用示例:

HTML

 1 <img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/Harry-Potter-1-.jpg" alt="" class="clip-svg">
 2 
 3 <svg width="0" height="0">
 4   <defs>
 5     <clipPath id="myClip">
 6       <circle cx="100" cy="100" r="40"/>
 7       <circle cx="60" cy="60" r="40"/>
 8     </clipPath>
 9   </defs>
10 </svg>
View Code

CSS

.clip-svg {
    clip-path: url(#myClip);
}
View Code

效果以下图

clip-path和masking

剪裁和遮罩都是用来隐藏元素的一些部分、显示其余部分的。固然了,这二者仍是有区别的。区别主要在于这几方面:他们能作的东西,不一样的语法,涉及到的不一样技术,是新的仍是旧的,以及浏览器支持的差别。

二者最主要的区别:遮罩使用的是图像,剪裁使用的是路径

想象一张从左到右、从黑到白渐变的正方形图像,它能够是一个遮罩。对于应用了这个渐变遮罩图像的元素,它在遮罩图像的黑色部分是透明(透视)的,而在遮罩图像的白色的部分是不透明(正常)的。因此做出的结论是:这个元素是从左到右淡入的。

而剪裁一直都是矢量路径的。路径以外的部分是透明的,路径里边的部分是不透明的。

我的以为有点混乱。由于不少时候可能会碰到某个关于遮罩的教程用的是一个在黑色上有白色矢量形状的遮罩图像,这和剪裁基本是同一个原理。但这还好,它只是混淆了一点东西。

有关于二者相关的详细介绍能够点击这里阅读

clip-path和CSS Shapes

前面已经屡次提到CSS Shapes了,是的,由于CSS Shapes能够帮助咱们打破常规则的Web排版,让Web页面能够像媒体杂志同样布局,这将是激动人心的一件事情。

而在CSS Shapes中一样会有clip-path的身影。

clip-path接收与basic-shape相同的形状函数和值(前面提到过)。若是咱们定义相同的多边形形状,同时用于shape-outsideclip-path属性上,它将裁掉图像上你定义的形状以外的图像。

 

1 img.right {
2     float: right;
3     height: 100vh;
4     width: calc(100vh + 100vh/4);
5     shape-outside: polygon(40% 0, 100% 0, 100% 100%, 40% 100%, 45% 60%, 45% 40%);
6     /* clip the image to the defined shape */
7     clip-path: polygon(40% 0, 100% 0, 100% 100%, 40% 100%, 45% 60%, 45% 40%);
8 }
View Code

结果以下:

下面有个示例

HTML

 1 <div class="container">
 2   <div class="element">
 3   </div>
 4   <h1>Cupcakes Recipe</h1>
 5   <p>
 6     Cupcake ipsum dolor sit. Amet sweet roll sweet roll cheesecake sweet roll apple pie ice cream. Toffee soufflé danish soufflé I love I love dessert I love. Lollipop carrot cake marshmallow I love caramels. Chocolate cotton candy unerdwear.com dessert gingerbread gummies I love. Bonbon chupa chups biscuit danish apple pie. Bonbon muffin dessert wafer chocolate cake sesame snaps candy canes marzipan.
 7   </p>
 8   <h3>Ingredients</h3>
 9   <ul>
10     <li>1/2 Lorem Ipsum</li>
11     <li>5g Sugar Ipsum</li>
12     <li>2 eggs</li>
13   </ul>
14   <p>
15     Dessert oat cake candy lollipop topping cotton candy jelly beans I love cake. Brownie sugar plum cotton candy wafer dragée pudding I love. I love I love chocolate. Topping danish carrot cake soufflé liquorice icing gummi bears liquorice dessert. Jujubes oat cake tootsie roll tart. 
16   </p>
17   <p>
18     Cookie lollipop cookie gingerbread danish muffin sweet chupa chups. Gingerbread donut muffin biscuit sesame snaps chocolate cake sweet. Sugar plum lemon drops pastry tiramisu chocolate gingerbread. I love pudding biscuit soufflé wafer biscuit.
19   </p>
20   <div class="clear"></div>
21 </div>
View Code

CSS

 1 * {
 2   margin: 0;
 3   padding: 0;
 4   box-sizing: border-box;
 5 }
 6 
 7 body {
 8   color: #555;
 9   font-size: 0.95em;
10   background-color: #eee;
11   font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
12 }
13 
14 .container {
15   width: 100%;
16   max-width: 1200px;
17   margin: 20px auto;
18   background-color: white;
19 }
20 
21 .element {
22   width: 40%;
23   height: 600px;
24   float: left;
25   background-image: url(http://tympanus.net/codrops-playground/assets/images/cssref/properties/clip-path/cupcakes.jpg);
26   background-size: cover;
27   background-position: -100px 0;
28   background-repeat: no-repeat;
29   -webkit-clip-path: ellipse(90% 70% at 0% 50%);
30   clip-path: ellipse(90% 70% at 0% 50%);
31   -webkit-shape-outside: ellipse(90% 70% at 0% 50%);
32   shape-outside: ellipse(90% 70% at 0% 50%);
33   -webkit-shape-margin: 2em;
34   shape-margin: 2em;
35 }
36 
37 p,
38 h1,
39 h3 {
40   padding: 1em 0;
41 }
42 
43 p {
44   margin-right: 4em;
45 }
46 
47 ul {
48   list-style: circle;
49 }
View Code

 

效果图以下

 

 

 

clip-path示例和工具

前面内容简单的提到过了,clip-path是一个强大的属性,除了自身能实现一些特殊效果以外,还能够和SVG结合在一块儿。另外还能够和Masking以及CSS Shapes在一块儿,作出咱们意想不到的效果。那么有关于clip-path相关的案例,网上已经有大把了。除此以外,clip-path还有一些在线的工具,能够直接帮助咱们作一些事情。好比Chrome插件CSS Shapes 编辑器Clip Path生成器CSS clip-path Maker: Clippy

最后强列建议你们收藏好下面这篇文章,由于这篇文章整理了18个有关于clip-path的教程、案例和工具

 

 

参考资料

总结

本文介绍了有关 clip-path 的基本内容,能够帮助你入门。学习使用这个属性并不会花费太多的时间,可是创造性的使用就须要多多练习了。当浏览器普遍支持此属性时,你就可使用 clip-path制做出酷炫的效果了。

相关文章
相关标签/搜索