49期:利用clip-path製作css動畫

2021-03-02 海致星圖技術

最近工作項目中有製作動畫效果的需求,查閱了一些網站之後,在一個名叫species-in-pieces的網站(species-in-pieces.com)看到了以下神奇的動畫效果:

用Chrome的開發者工具窺探一番之後,發現這個酷炫的動畫效果基本是純css實現的!其實現核心就是css3中加入的 clip-path 屬性。

什麼是clip-path

 clip-path 是css3中添加的新屬性(屬於CSS Shapes Module Level 1),直譯過來就是裁剪路徑,是已經被棄用的屬性 clip 的拓展。
通過路徑繪製區域,隱藏路徑包裹外的內容,顯示路徑包裹內的內容。
與 clip 的區別在於, clip 只能裁剪矩形區域,而 clip-path 可以裁剪出各種幾何圖形。

API:

{

clip-path: none;

 
clip-path: url(resources.svg#c1);

 
clip-path: fill-box;
clip-path: stroke-box;
clip-path: view-box;
clip-path: margin-box;
clip-path: border-box;
clip-path: padding-box;
clip-path: content-box;


clip-path: inset(100px 50px); //矩形
clip-path: circle(50px at 0 100px); //園形
clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); //多邊形


clip-path: padding-box circle(50px at 0 100px); //幾何框的參考框盒


clip-path: inherit;
clip-path: initial;
clip-path: unset;
}

例子:

//圓形
.shape{
  background-color: #333;
  width: 100px;
  height: 100px;
  clip-path: circle(50px at 50px 50px);
}

//三角形
.shape{
  clip-path: polygon(10% 10%, 10% 50%, 50% 50%)
}

//十邊形

.shape {
 clip-path: polygon(50% 0%, 80% 10%, 100% 35%, 100% 70%, 80% 90%, 50% 100%, 20% 90%, 0% 70%, 0% 35%, 20% 10%);
}

可以看出 clip-path 實現圖形裁剪的關鍵在於 polygon() ,這個裁剪路徑的使用與SVG中的path類似但不相同。

SVG中的path可以繪製繪製任何圖形,而 clip-path 只能用於繪製CSS的基本圖形。

除此之外, clip-path 有兩個需要了解的特點:

詳細的使用方法可以參考MDN web docs上的文檔

讓clip-path動起來

 clip-path 能實現諸多動畫特效的原因,在於其支持 CSS transtion 與 CSS animation 。
通過簡單的設置 transtion 或 animation 關鍵幀,就能實現不同圖形狀態間的變換:

.shape-animate {
  position: absolute;width: 200px;height: 200px;top: 50%;left: 50%;transform: translate(-50%, -50%);
  background: red;
  clip-path: polygon(50% 0%, 0% 100%, 100% 100%, 100% 100%, 100% 100%, 100% 100%, 100% 100%, 100% 100%, 100% 100%);
 
  //動畫參數
  transition: .3s;
  animation: shape-ani 5s linear infinite;
}

@keyframes shape-ani {
  10% { 
    clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%, 0% 50%, 0% 50%, 0% 50%, 0% 50%, 0% 50%);
  }
  20% {
    clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%, 0% 50%, 0% 50%, 0% 50%, 0% 50%, 0% 50%);
  }
  30% {
    background: green;
    clip-path: polygon(100% 38%, 82% 100%, 82% 100%, 18% 100%, 0% 38%, 0% 38%, 0% 38%, 0% 38%, 50% 0%);
  }
  40% {
    clip-path: polygon(100% 38%, 82% 100%, 82% 100%, 18% 100%, 0% 38%, 0% 38%, 0% 38%, 0% 38%, 50% 0%);
  }
  50% {
    clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 100% 75%, 50% 100%, 0% 75%, 0% 75%, 0% 25%, 0% 25%);
  }
  60% {
    background: black;
    clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 100% 75%, 50% 100%, 0% 75%, 0% 75%, 0% 25%, 0% 25%);
  }
  70% {
    clip-path: polygon(50% 0%, 90% 20%, 100% 60%, 75% 100%, 25% 100%, 25% 100%, 0% 60%, 10% 20%, 50% 0%);
  }
  80% {
    clip-path: polygon(50% 0%, 90% 20%, 100% 60%, 75% 100%, 25% 100%, 25% 100%, 0% 60%, 10% 20%, 50% 0%);
  }
}

 

不過 clip-path:animation 也有其局限:裁剪的多邊形必須具有相同的頂點數。
如果要實現不同頂點數圖形的轉換,比如三角形到矩形的動畫,可以將4個頂點中的2個重合或藏在其他路徑中,畫出三角形。

.shape {
  //3頂點
  clip-path: polygon(10% 10%, 10% 50%, 50% 50%);
  //4頂點
  clip-path: polygon(10% 10%, 10% 50%, 50% 50%, 30% 30%)
}
.shape:hover {
  clip-path: polygon(10% 10%, 10% 50%, 50% 50%, 50% 10%)
}

species-in-pieces中動畫的實現方式

回到species-in-pieces。

動圖中的各種小動物,全都是由30個形態不一的三角形拼接而成的,動物的切換並沒有改變三角形數量和圖形頂點數目。

其代碼是下面這樣:

<div class="wrap left-to-right">
    <div class="shard-wrap">
        <div class="shard"></div>
    </div>
    <div class="shard-wrap">
        <div class="shard"></div>
    </div>
    .
    . 
    .
    <div class="shard-wrap">
        <div class="shard"></div>
    </div>
    <div class="shard-wrap">
        <div class="shard"></div>
    </div>
</div>

對應的關鍵css:

.shard-wrap {

.crow .shard-wrap:nth-child(1) .shard {
  -webkit-clip-path: polygon(20% 50%,25% 52.4%,11.5% 54.5%);
  background-color: #2C323D
}
.crow .shard-wrap:nth-child(2) .shard {
  -webkit-clip-path: polygon(14.7% 47.5%,35.2% 50.2%,25% 52.5%);
  background-color: #63676F
}
.crow .shard-wrap:nth-child(3) .shard {
  -webkit-clip-path: polygon(22.9% 44.5%,35.2% 50.2%,25% 48.9%);
  background-color: #0F1622
}

.crow .shard-wrap:nth-child(29) .shard {
  -webkit-clip-path: polygon(61.7% 44.7%,64.4% 44%,65.1% 36.2%);
  background-color: #0f1622
}
.crow .shard-wrap:nth-child(30) .shard {
  -webkit-clip-path: polygon(78.5% 21.5%,76.3% 23.7%,74.6% 22.5%);
  background-color: #0f1622
}

我們可以發現,每一個 .shard-wrap>.shard 節點都是100%的寬高的盒子,圖形完全是通過 clip-path:polygon() 裁剪而來。
上例的crow烏鴉,所有的圖形描述都定義在css中,由 :nth-child 偽類選擇器來控制每一塊三角的形狀,通過 polygon() 傳入三角形的三個頂點參數,使用百分比單位來達成響應式定位。

在此基礎上通過父元素選擇器改變組成不同動物形態的三角形的坐標狀態,實現動畫效果。

兼容性

目前 clip-path 的兼容性不是很好,基本只支持-webkit-內核的瀏覽器。不過作為css3官方屬性,將來的發展空間還是很大。

通過本文介紹,可以發現通過 clip-path 來實現動畫是非常簡單和易用的,
例如species-in-pieces的動畫實現就沒有非常複雜的技術問題,而是靠創意和美術功底進行精心的設計來實現。
我們也可以靈活使用這些工具完成自己想要的動畫效果。
感興趣的話可以多了解下官方文檔,多看看大牛們的動畫實現。

由於水平和經驗有限,如有紕漏或建議,歡迎留言。如果覺得不錯,歡迎關注海致星圖,謝謝你的閱讀。

參考文章:

species-in-pieces

(http://species-in-pieces.com/)

css-tricks || clip-path

(https://css-tricks.com/almanac/properties/c/clip-path/)

MDN web docs || clip-path

(https://developer.mozilla.org/zh-CN/docs/Web/CSS/clip-path)

使用clip-path製作簡單的動畫效果

(http://qcyoung.com/2015/11/18/使用clip-path製作簡單的動畫效果/)

CSS Shapes module level 1

(http://dev.w3.org/csswg/css-shapes/)

相關焦點

  • CSS的clip-path
    在CSS中,clip 屬性是已過時的,也就是說它已經不再建議被使用,因為有一個更新的、規範的版本,各個瀏覽器也將集中努力使用它。當然,clip也是有一些優勢的:因為clip是運行在瀏覽器中的,它可能會一直有效。而瀏覽器對它的支持是非常強大的:幾乎是有史以來的每一個瀏覽器。另外,我也聽說過了,它作出的動畫效果勝過其它的新方法。
  • css3剪裁GIF背景圖片動畫源碼庫
    簡要教程這是一款css剪裁GIF背景圖片動畫特效。
  • CSS 實現「故障」特效
    關鍵點利用了偽元素生成了文字的兩個副本視覺效果由位移、遮罩、混合模式完成配色借鑑了抖音 LOGO 的風格接下來開啟下一個分類clip-path 登場下半篇幅的主角主要是 clip-path 。clip-path 一個非常有意思的 CSS 屬性。clip-path CSS 屬性可以創建一個只有元素的部分區域可以顯示的剪切區域。區域內的部分顯示,區域外的隱藏。剪切區域是被引用內嵌的URL定義的路徑或者外部 SVG 的路徑。
  • 純CSS實現常見的UI效果
    舉個例子,倘若你想創建多個半徑不同的同心圓,這個Mixin將會很有幫助aqua.cssaqua.css是筆者開源的一個優雅的、輕量級的CSS框架。一提裁切,就能想到clip-path這個屬性,於是問題也就很好解決了<div class="ribbon">  Pure CSS Ribbon  <div class="block"></div>  <div class="block"></div>
  • 【前端-CSS動畫】製作聖誕節彩燈
    css動畫 animationcss動畫 keyframesbox-shadow一、效果二、代碼index.html"> <link rel="stylesheet" href="https://fonts.googleapis.com/css?
  • 前端進階:css必知的幾個底層知識和技巧
    在介紹完問題學習法之後,進入我們今天的主題,接下來我會介紹css的一些底層的知識的現象,藉此來讓大家對css有更深入的理解。一.css尺寸1.首選最小寬度–實現複雜圖形效果在css中,圖片和文字的權重遠大於布局,因此當width:0時表現出來的寬度就是「首選最小寬度」。中文的最小寬度為每個漢字的寬度,西方文字取決於連續的英文字符單元。
  • vue+swiper+animate.css製作全屏滾動H5
    blog.csdn.net/qq_41725450    年底了,接到需求要製作年度帳單,形式就是全屏滾動H5頁面
  • css文字特效-冰凍文字(帶炫光)
    使用css製作冰凍文字(帶炫光效果)適用場景:通常此類效果在視頻片頭特效出現較多博客上,適用影評內容,
  • 【Web動畫】SVG 線條動畫
    通常我們說的 Web 動畫,包含了三大類。個人認為 3 種動畫各有優劣,實際應用中根據掌握情況作出取捨,本文討論的是我認為 SVG 中在實際項目中非常有應用價值 SVG 線條動畫。莫慌,其實很多和 CSS 對比一下非常好理解,只是換了個名字:fill:類比 css 中的 background-color,給 svg 圖形填充顏色;stroke-width:類比 css 中的 border-width,給 svg 圖形設定邊框寬度;stroke:類比 css 中的 border-color,給 svg 圖形設定邊框顏色
  • css動畫創建及使用
    CSS創建動畫需要用到@keyframes屬性,@keyframes用於規定動畫規則。@keyframes需要配合動畫屬性使用。CSS中的動畫屬性有:animation:所有動畫屬性的簡寫屬性。動畫在動畫執行之前和之後不會應用任何樣式到目標元素;forwards:在動畫結束後(由 animation-iteration-count 決定),動畫將應用該屬性值;backwards:動畫將應用在 animation-delay 定義期間啟動動畫的第一次迭代的關鍵幀中定義的屬性值。
  • 使用Anime.js製作火箭升空的動畫效果
    依照我web項目開發的經驗,既然這幾種動畫效果的實現方式都已經成為web標準,那麼肯定有很多人已經或者至少想過封裝出更加易用的工具庫或者是腳手架。繼續搜索🔍"web animation package", 然後找到了一個匹配度很高的JS庫:anime,使用anime可以為dom結構,css屬性,svg圖片,JS對象創建動畫效果,看了下文檔,簡單的動畫效果很容易實現。
  • SVG 線條動畫入門
    CSS3 動畫javascript 動畫(canvas)html 動畫(SVG)個人認為 3 種動畫各有優劣,實際應用中根據掌握情況作出取捨,本文討論的是我認為 SVG 中在實際項目中非常有應用價值 SVG 線條動畫。舉個慄子SVG 線條動畫,在一些特定的場合下可以解決使用 CSS 無法完成的動畫。
  • 線條之美,玩轉SVG線條動畫
    通常來說web前端實現動畫效果主要通過下面幾種方案:css動畫;利用css3的樣式效果可以將dom元素做出動畫的效果來
  • 使用CSS技術實現Netflix Logo動畫效果
    我嘗試使用 Netflix(譯者註:一家在線影片租賃提供商)時,立即就把我吸引住了。我觀看了一些不得不在它處才能觀看的節目。每一集電視劇或者電影都以 Netflix 動畫作為開始。在觀看了幾集電視劇之後,我想到可以用 CSS 來實現 Netflix 的 logo 動畫,於是我看了幾部作品之後,就用 CodePen 來重現這個 logo。
  • 十分鐘教你用svg做出精美的動畫!
    通過devtool,我們可以看到每個path對應圖案的哪個部分:    .staggerFrom(      ["#House > path:nth-child(34)", "#House > path:nth-child(32)"],      0.8,      {        scaleY: 0,        transformOrigin
  • 利用Python做一個小姐姐詞雲跳舞視頻
    B站上的漂亮的小姐姐真的好多好多,利用 you-get 大法下載了一個 B 站上跳舞的小姐姐視頻,利用視頻中的彈幕來製作一個漂亮小姐姐詞雲跳舞視頻,一起來看看吧。二、實現思路1. you-get下載視頻pip install you-get -i http://pypi.douban.com/simple --trusted-host pypi.douban.com利用 you-get 下載 B 站視頻到本地    視頻連結:https://www.bilibili.com
  • svg 動畫介紹(一)
    實現單屬性的動畫過渡效果。屬性描述attributeName要變化的元素屬性名稱。from動畫的起始值。to指定動畫的結束值。dur常規時間值或indefinite無限。repeatCount表示動畫執行次數或indefinite無限。
  • SVG動畫、CSS3動畫常用知識點全解析
    <animate>標籤的基本屬性:屬性名含義attributeName定義發生變化的元素屬性名attributeType當attributeType="XML"時,attributeName被認為是XML的屬性;當attributeType="CSS"時,attributeName被認為是css的屬性;不指定attributeType時,默認為"auto",會先將attributeName
  • CSS自定義屬性製作動畫
    其和CSS處理器裡的變量還是略有不同,但這篇文章我們要聊的並不是這個東東,咱們想聊聊CSS自定義屬性怎麼製作動畫。在繼續之前,咱們都知道現在製作Web動畫一般是通過CSS的Animation或者Web Animation API來完成(也就是JavaScript製作動畫)。但有了CSS自定義屬性之後,配合簡單的幾行JavaScript代碼,也可以實現一些動畫效果。
  • 9012的CSS狀態報告分析
    這份報告囊括了很多內容,其中有三部分內容值得我們去關注:- CSS哪些特性使用的最多- CSS哪些技術可以幫助我們提效- CSS單位和選擇器通過報告,我們可以知道使用最多的CSS特性主要分為六大類:- 布局- 形狀和圖形- 交互- 排版- 動畫和變換