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製做出酷炫的效果了。

相關文章
相關標籤/搜索