首先介紹一下,我以爲前端開發都是很具備分享精神的,不少人都寫出了不少優秀的總結經驗供新手們參考,本人只是個搬運工,將別人優秀的文章進行了總結,本文主要轉載自 大漠 的文章 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中常見的矩形),也能夠是一個複雜的多邊形(不規則的多邊形)。
裁剪區域是裁剪路徑閉合後所包含的所有區域。
這樣一來,元素分爲兩部分,裁剪區域和裁剪區域外。瀏覽器會裁剪掉裁剪區域之外的區域,不只是背景及其它相似的內容,也包括border
、text-shadow
等。更讚的是,瀏覽器不會捕獲元素裁剪區域之外的 hover
、click
等事件。
即便現在一些特定元素不受長方形限制,但實際上元素周圍的內容仍是會認爲元素是原始形狀(長方形)的,並按此進行文檔流的佈局。要想使周圍元素根據元素裁剪後的形狀進行佈局,可使用 shape-outside
屬性。有關於shape-outside
相關詳細的介紹,能夠閱讀有關於CSS Shapes相關的教程,這裏不進行過多闡述。
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:relative
和position:static
上工做。
在CSS中,clip
屬性是已過期的,也就是說它已經再也不建議被使用,由於有一個更新的、規範的版本,各個瀏覽器也將集中努力使用它。
固然,clip
也是有一些優點的:由於clip
是運行在瀏覽器中的,它可能會一直有效。而瀏覽器對它的支持是很是強大的:幾乎是有史以來的每個瀏覽器。另外,我也據說過了,它做出的動畫效果賽過其它的新方法。
可是比起它的優點,clip
有兩個更爲重要的弱點,這也使得它難以被普遍地使用:
clip
只對絕對定位的元素有效clip
只能用於矩形,即rect()
函數這真的是很是大的限制!因此來讓咱們接着說接下來更爲重要的屬性clip-path
。
若是你是第一次接觸過屬性,我建議您花點時間閱讀一下這篇文章,它能幫助你對有一個簡單的瞭解。clipclip
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
要從同一個方向繪製,若是順時針繪製就一概順時針,逆時針就一概逆時針,由於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>
效果圖以下:
記得之前CSS繪製圖形總得束手束腳,並且還得想法設法,使用clip-path
繪製什麼六邊形、八邊形、五角形、心形等,都再也不是難事了。OXXO.STUDIO有一篇文章《運用 clip-path 的純 CSS 形狀變換》詳細介紹了這些圖形是如何繪製的。固然除此以外,在線的CSS clip-path maker提供了不少不規則的圖形案例:
在具體使用geometry-box
來裁剪元素以前,對geometry-box
作一下相關的瞭解。
geometry-box
能夠是shape-box
、fill
、stroke
或者view-box
。其中shape-box
應用於HTML元素,它具備四種值:margin-box
、border-box
、padding-box
和content-box
。
來看個簡單的示例:
.clip-me { clip-path: polygon(10% 20%, 20% 30%, 50% 80%) margin-box; margin: 10%; }
在上例中,元素的 margin-box
會做爲參考,來決定裁剪點的實際位置。點(10%,10%
)是 margin-box
的左上角,因此clip-path
的定位會根據此點進行計算。
其實shape-box
和CSS Shapes中的引用框概念很是相似,有關於這方面的介紹,能夠花點時間閱讀《理解CSS Shapes的引用框》一文。
若是geometry-box
和basic-shape
一塊兒使用,能夠引用basic-shape
提供的引用框。其做用和shape-outside
屬性相似,更多的細節能夠看看shape-outside
的屬性介紹。
若是geometry-box
由自身指定,那麼它會使用指定盒子形狀做爲裁剪的路徑,包括任何(由border-radius
提供的)的角的形狀。
除了shape-box
值,還能夠運用SVG元素上,它具備另外三個值:fill
、stroke
和view-box
。
在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>
CSS
.clip-svg { clip-path: url(#myClip); }
效果以下圖
剪裁和遮罩都是用來隱藏元素的一些部分、顯示其餘部分的。固然了,這二者仍是有區別的。區別主要在於這幾方面:他們能作的東西,不一樣的語法,涉及到的不一樣技術,是新的仍是舊的,以及瀏覽器支持的差別。
二者最主要的區別:遮罩使用的是圖像,剪裁使用的是路徑。
想象一張從左到右、從黑到白漸變的正方形圖像,它能夠是一個遮罩。對於應用了這個漸變遮罩圖像的元素,它在遮罩圖像的黑色部分是透明(透視)的,而在遮罩圖像的白色的部分是不透明(正常)的。因此做出的結論是:這個元素是從左到右淡入的。
而剪裁一直都是矢量路徑的。路徑以外的部分是透明的,路徑裏邊的部分是不透明的。
我的以爲有點混亂。由於不少時候可能會碰到某個關於遮罩的教程用的是一個在黑色上有白色矢量形狀的遮罩圖像,這和剪裁基本是同一個原理。但這還好,它只是混淆了一點東西。
有關於二者相關的詳細介紹能夠點擊這裏閱讀。
前面已經屢次提到CSS Shapes了,是的,由於CSS Shapes能夠幫助咱們打破常規則的Web排版,讓Web頁面能夠像媒體雜誌同樣佈局,這將是激動人心的一件事情。
而在CSS Shapes中一樣會有clip-path
的身影。
clip-path
接收與basic-shape
相同的形狀函數和值(前面提到過)。若是咱們定義相同的多邊形形狀,同時用於shape-outside
與clip-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 }
結果以下:
下面有個示例
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>
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 }
效果圖以下
前面內容簡單的提到過了,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
製做出酷炫的效果了。