聊聊clip-path

前言

圖片是一個網站必不可少的元素,而呈現出絢麗多彩的圖片效果在很多情況下不僅僅是設計師的工作,通過代碼來修飾圖片也是一個前端工程師必備的技能。因爲兼容性的問題,實際項目中可能用的比較少,包括博主自己也只是用過幾次剪切,很多情況下都交給設計師去做了。但作爲一個hacker怎麼能滿足於此呢,必須深入探究!

正文

Flilter

filter有十種特效來處理圖片,博主只放幾種特效的樣例給大家看一下:

照片反色效果:

照片反色

照片褐色效果:

照片褐色

照片陰影效果:

陰影

十種特效源碼:

-webkit-filter:opacity(.6);//透明度
filter:opacity(.6);
-webkit-filter:blur(10px);//照片模糊
filter:blur(10px);
-webkit-filter:invert(1);
filter:invert(1);
-webkit-filter:saturate(3);//照片飽和度
filter:saturate(3);
-webkit-filter:grayscale(1);//照片灰度
filter:grayscale(1);
-webkit-filter:sepia(1);//照片褐色
filter:sepia(1);
-webkit-filter:hue-rotate(90deg);//色相旋轉
filter:hue-rotate(90deg);
-webkit-filter:brightness(.5);//亮度
filter:brightness(.5);
-webkit-filter:contrast(2);//對比度
filter:contrast(2);
-webkit-filter:drop-shadow(10px 10px 10px #ccc);//陰影
filter:drop-shadow(10px 10px 10px #ccc);

但實際上這個屬性兼容性很低:

can I use

截止博主發文日期,Filter的兼容性如上圖,我們可以看到IE是完全不支持的,Edge也是部分支持。這可能也是Filter沒法用在項目中的原因之一了。感興趣的讀者可以Copy博主代碼本地測試一下,或是參照MDN|Filter瞭解。博主不在這裏做過多的說明了。

clip&clip-path

這兩個屬性正是今天的重頭戲,博主曾在從隱藏元素談起提起過,但並沒做深入解釋。是的,它可以用來隱藏元素,當然也就能處理圖片了。

  • clip

clip這個屬性我相信會有很大一部分人不知道,因爲這個屬性使用率非常的低,因爲很多情況下我們會直接重新切一張新圖出來代替而不會去剪裁已有的圖片,但實際上這個屬性用在CSS sprite簡直就如同神器一般,因爲在很多情況下background-position並不符合我們的需求,比如,有時我們希望Sprite圖片可以延遲滾動加載,或者是可以很輕鬆的右鍵圖片另存爲…或是其它background-position沒法滿足的情景。
廢話不多說,看樣例:
這裏寫圖片描述

position:absolute;
clip:rect(50px 250px 250px 50px); /* IE6, IE7 */
clip:rect(50px,250px,250px,50px);

這裏寫圖片描述

注意,元素定位position必須是absolute或是fixed的,兼容IE6,IE7需要將值之間的逗號去掉。另外,react(top,right,bottom,left);四個值分別是相對於圖片左上角爲原點的座標值。Clip基本所有的瀏覽器都支持,可以放心使用。

讓人放棄它的原因無外乎:
- clip 只對絕對定位的元素有效對於position:relative和position:static無效
- clip 只能用於矩形,即rect()函數

  • clip-path

其實clip在HTML5中已經被廢棄了(依然可用),取而代之的是clip-path。本來clip還有一個circle(圓),但基本沒有瀏覽器實現這個屬性值,只有rect()可是使用,可能W3C也是等不下去了吧,直接推出了一個更牛逼的屬性——clip-path,這個屬性起初是SVG裏面的然後被挪用到了CSS裏面。關於SVG博主有時間會再另外介紹,這裏按下不表。效果圖:
這裏寫圖片描述
這裏寫圖片描述

讀者可以在這裏自行體驗

兼容:現在爲止IE 和 Edge 不支持這個屬性,Firefox 僅部分支持 clip-path ,
Chrome、Safari 和 Opera 需要使用 -webkit- 前綴支持此屬性。
這裏寫圖片描述
clip-path兼容性甚至比前面說到的filter還差,所以很難真正使用起來。更多使用效果戳這裏這裏

說一下它的四個屬性值:

  • clip-source: 可以是內、外部的SVG的clipPath元素的URL引用;

  • basic-shape: 使用一些基本的形狀函數創建的一個形狀。主要包括circle()、ellipse()、inset()和polygon()。

  • geometry-box: 是可選參數。此參數和basic-shape函數一起使用時,可以爲basic-shape的裁剪工作提供參考盒子。如果geometry-box由自身指定,那麼它會使用指定盒子形狀作爲裁剪的路徑,包括任何(由border-radius提供的)的角的形狀。

開始使用clip-path

在開始使用clip-path繪製圖形,或者說裁剪圖形之前,有兩點需要大家注意:

  • 使用clip-path要從同一個方向繪製,如果順時針繪製就一律順時針,逆時針就一律逆時針,因爲polygon是一個連續線段,若線段彼此有交集,裁剪區域就會有相減的情況發生,當然如果你特意需要這樣的效果除外。

  • 如果繪製時採用比例的方式繪製,長寬就必須要先行設定,不然有可能繪製出來的長寬和我們想像的就會有差距,使用像素繪製就不會有這樣的現象。

我們就拿上面途中的六邊形作爲polygon()函數示例:

-webkit-clip-path: polygon(0% 50%, 25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%);
clip-path: polygon(0% 50%, 25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%);

效果圖:

效果圖

講解:

這裏寫圖片描述

每個點的第一個座標值決定了它在 x 軸上的位置,第二個座標值指定了它在 y 軸的位置,所有點是順時針繪製的。其實一個 polygon()就能滿足所有的形狀需要了,有自定義的API用更加方便不是麼。

注意:inset()這個真的坑,按說同樣裁剪成方形應該是和clip的rect一樣用法,可不一樣!

//Clip的rect
position:absolute;
clip:rect(50px 250px 250px 50px);
//clip-path
clip-path: inset(50px 50px 50px 50px);
-webkit-clip-path: inset(50px 50px 50px 50px);

本文使用圖片是300*300的。

很明顯:


clip:rect(50px 250px 250px 50px);
=clip-path: inset(50px 50px 50px 50px);

好大的一個坑….

結束語

相信隨着時代發展,clip-path會慢慢被瀏覽器廠商接受的。
本文有任何錯誤,歡迎評論留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章