以前分享了一些本身平時整理的能夠通用的SVG動畫的教程基本都是最基礎的變化,旋轉也好,縮放也好,沿路徑運動也好,只須要定義CSS3的一些動畫屬性值或者SVG的動畫屬性標籤,固然,運用得當的話,依靠這些也能作出不少超炫的效果,只要想象力足夠,idear賽過方法。
本質上來說,各類動畫原理都是相通的,包括AE,包括Macromedia Flash、包括ps自帶的時間軸動畫,包括SVG的動畫屬性和CSS3的動畫屬性,都須要定義關鍵幀,不過補間動畫一個是軟件生成,一個是瀏覽器來執行而已。以前作過flash動畫的UI設計師們必定知道,動畫最難的部分其中之一是變形動畫,形狀A→形狀B無規律的變形纔是最難掌握的部分。今天來分享一份全網獨一無二(啊哈哈,有種要上天的感受)的SVG變形動畫教程,讓UI設計師華麗麗變身動畫設計師,關鍵是,看完這篇文章後,你能夠實現任意形狀之間的變形動畫,是的,你沒有看錯,任意!獨家心得,高能預警。個人全部SVG動畫重點部分,一直都是從UI設計師最擅長的AI工具入手,和SVG的參數如何相結合,不說了,快上車。
由於實在太長了,後面有進階教程,因此分上下兩個篇章吧。若是沒有任何SVG基礎的話,建議只看上篇。
先看下面一個動畫效果,這是我初學AE時,跟着教程作的,作了多久呢?我記得是一上午/(ㄒoㄒ)/~~,自我辯解一下,不是學習能力差,而是當時那一丟丟的動畫基礎知識所有忘光光。如今這個動畫若是用SVG來作,須要多久,二十分鐘吧我猜,固然了,是在代碼模板的基礎上。javascript
看到這裏,熟練使用AE的設計師小夥伴或許不服氣了,AE也能夠,要SVG這勞什子做甚?來來來,你來告訴我AE生成的動畫你來增長些交互,好比鼠標單擊控制開始暫停結束?就算改改顏色和尺寸你都要去動源文件,而後從新生成的好吧?
另外補充一下,既然chrome聲稱要「拋棄」SMIL(不用擔憂,一邊喊着拋棄,一邊繼續支持),那咱們之後全部的SVG動畫儘可能都用CSS3動畫屬性來完成,SVG只用來繪圖。css
若是用SMIL來實現變形動畫,基礎代碼以下:前端
<svg width="" height="" >
<path> <animate attributeName="d" dur="" values=" ; "/> </path> </svg>複製代碼
就是利用<path>
的屬性d的變化,value值用分號;隔開,先後分別對應兩個形狀的路徑值。但咱們上面說過,要用CSS3來實現,那代碼就變成了下面這種(之後就用這個模板啦):java
<svg height=" " width=" ">
<style> @keyframes deform{ 0% {d:path('');} 100% {d:path(''); } } #animated { animation: deform 2s; } </style>
<path id="animated" />
</svg>複製代碼
哇,好簡單,好清爽。經過定義一個名爲deform的動畫,而後設置開始和結束,進行繪製路徑命令d:path(' '),單引號裏面就是對應的路徑的d值;<path>
標籤直接調用這個動畫就能夠了。chrome
有了上面的代碼模板了,而後能夠進行動畫的真正製做了。從最簡單的開始,根據最少三點組成一個形狀,好比我在AI裏面隨手畫了一個,叫它啥好呢,單峯山吧。數組
<path>
標籤的d值複製下來,放到模板裏初始值0%對應的d:path(' ')裏。
<path>
標籤的d值一併貼上,以下:
<path>
的d值寫法很不標準,它的原則是負數和負數之間不加逗號
,隔開(狠狠吐槽),因此你看到數值中的那些短線好比0-77,不是區間,而是數字0和數字-77。
仍是從最簡單的三角形開始瀏覽器
<path>
裏均可以。但對於這種多邊形來講,SVG對應的標籤不是
<path>
,而是
<polygon>
,一樣,沒有d值而是point。那怎麼套用呢?
很簡單,point對應值爲點的座標,咱們只須要給第一組值前面加上M,剩下的每組前面加L,最後z結束,就成功實現了point到d的轉化。舉例說明:
個人三角形1對應的代碼以下:ide
<polygon points="148,288 350,134 390,299 "/>複製代碼
那我要作的就是改爲svg
d:path('M148,188L350,134L390,299z')複製代碼
而後調用<path>
標籤。
那試一下套用效果如何:工具
這個方法是我推薦的方法,我叫它視覺欺騙,哈哈。由於在AI裏,我只要用錨點工具那麼輕輕的拖一下,多邊形就變身普通形狀了。但從視覺上來看,它仍是一個三角形哦。
<path>
而不是
<polygon>
。因此,設計師小夥伴們感到本身的優越感了沒?用工具,咱們能夠賽過前端吶(某些方面~)。並且利用這個方法,你能夠打破多邊形與普通形狀之間的障礙,想怎麼變身就怎麼變身。
有了前面的基礎,就能夠玩點高級的玩意了。
下面這種:
<circle>
,不要緊,用咱們的「做弊手段」。
有了上面這個四個錨點變形的動畫,那下面這個理解起來就方便多了。
此次我不想在原有形狀上變化,而是想完成這樣一次變形,最大的問題出如今錨點數量不一樣上,怎麼辦?聰明的設計師小夥伴必定能夠想到,給錨點數量少的形狀用鋼筆工具添加錨點唄。(什麼?顏色太難看?這但是我特地找的日本傳統色的藤鼠和水淺蔥啊,身爲一名不合適的UI我會告訴你我根本不會配色嘛。)
除了改造左側的圖形,咱們還有一個工做,就是右邊這盆小花花,花莖(3-4和8-9)是標準垂直直線,導出的d值對應的是L開頭的一組數(至關於曲線繪製時沒有嚴格按照開始手柄控制點,結束手柄控制點,結束點來完成)。
看到這裏,可能會有設計師提出問題,我怎麼知道哪些須要改哪些不須要?並且哪些改過哪些沒改過?尤爲是有些微調,根本看不出來。好了,你能夠按照我下面這種方法來進行校驗。
別急,來看動畫效果:
(此處還有一個坑,若是設計師發現沒有動畫效果,不不不,是畫面一片空白的時候,只須要把d值裏的空格去掉就能夠,這是語法問題,沒法解釋。)
喲喲,位置,顏色過渡什麼的都沒問題,可是,變形效果太過猛烈……中間那麼翻轉一會兒是鬧哪樣?
別急,全部的問題都是出如今d值上,咱們見招拆招。
上圖的形狀爲順時針路徑,下圖輕鬆變身逆時針路徑。再看下應用翻轉路徑後的d值的動畫效果。
關於路徑反轉,你仔細看下代碼會說,咦?怎麼起點也發生了變化?咱們下篇揭曉如何任意控制起點位置。
提早預告,在下篇裏,還將進階一個圖形如何變身兩個圖形,圖形多合一,以及鏤空圖形的變形動畫等。
向前端開發人員求JavaScript代碼,由於兩個任意圖形之間的動畫效果若是不去修改圖形中的錨點的手柄,只要保證錨點數量一致,是能夠經過js來把繪製貝塞爾曲線的S、L直線、V垂直直線、H水平直線、絕對位置大C等等通通轉換成相對位置小c,達到一統江湖的目的。由於我js只是渣渣入門,勉強能看懂基礎的,寫不來。但可提供轉換公式,有興趣的可留言。這樣藉助js的話,工做就簡化到只要「噠噠噠」給錨點數量少的圖形任意補充上錨點就能夠了。