不炫技,SVG+CSS3 旋轉動畫屬性就能實現的夢幻效果

泱泱發表於2017-11-24

CSS3的動畫相關的基礎的屬性基本都涉獵過了,個人認為,其中最複雜的是d:path()路徑變形動畫,超過3D,而位移、軌跡、旋轉、縮放、斜切什麼的,相對簡單一些,但作為非動畫設計師而言,靈活的掌握這些基本的動畫加以無窮無盡的變換,就已經能做出很多華麗麗的效果了,這篇呢,源於做一個練習時,AI的連續旋轉複製功能,試著做了幾個動效,簡單、省時、高效,最主要的是用到CSS3的transform:rotate()旋轉屬性,輔以位移和縮放。

1.最基本的旋轉動畫

下面這張效果圖,粗通AI的設計師小夥伴們一定都不會陌生,在AI裡面就是ctrl+D連續複製的體力活。

單色選擇複製效果
如果把連續旋轉複製轉成CSS3語言,也是極簡單的。來分析一下上面的圖形,我做的時候每次旋轉的角度為10度,就意味著有36朵花瓣,那對應SVG裡應該有36個路徑<path>,如果是AI直接匯出的SVG看一下程式碼,也是密密麻麻的羅列,因為都是相同的形狀,自然有簡單的方法來實現,只需定義一個被重複使用的圖形,有兩種方法<defs>元素和<symbol>元素來定義,<use>元素來引用,那因為<symbol>元素使用範圍更寬泛一些,所以我們需要的工作就簡化成,在AI裡做一片花瓣的基礎圖形,然後匯出路徑後,定義如下

 <symbol id="single">
 <path d=""/> <!--此處為AI匯出的單片花瓣的路徑-->
 </symbol>
複製程式碼

先來第二片花瓣(也就是第一個旋轉的花瓣),CSS部分定義如下:

@keyframes leaf1{
0%{transform:rotate(0deg); transform-origin:400px 300px}
100%{transform:rotate(10deg); transform-origin:400px 300px}
}
#petal1{animation:leaf1 ease 0.1s both;}
複製程式碼

DOM部分,只需要用<use>元素引用定義好的花瓣並且賦給它旋轉的動效就可以了。

好了,剩下的還是體力活,需要把<use>元素部分複製34次,然後CSS動畫部分複製34次,當然了,動畫那裡,需要遞增一下時間和旋轉角度,比如接下來那片花瓣<use id="leaf2" xlink:href="#single"/>對應如下動畫屬性:

 @keyframes leaf2{
 0%{transform:rotate(0deg); transform-origin:400px 300px}
 100%{transform:rotate(20deg); transform-origin:400px 300px} /*角度增加10度*/
 }
 #leaf2{animation:leaf2 ease 0.2s both;} /*動畫時間增加0.2s*/
複製程式碼

所以在做動效時發現,不會js絕對是短板,尤其在這種批量的活中,本來就是repeat的工作,用SCSS的話,$deg: $deg + (360deg / 36)animation: leaf#{$i} 0.2s ease both來代替那一堆羅裡吧嗦的動畫定義是不是很爽,哎,不說了,不過,這個動效確實瓣瓣有些多,下面我們會簡化,另外,相信我,已經試過了,別手抽的話,大概10分鐘也就搞完了。現在,如果不出意外,已經能得到下面這朵綻放的花了

不炫技,SVG+CSS3 旋轉動畫屬性就能實現的夢幻效果

似乎還不錯,但仍有需要優化的地方,首先,花瓣是帶透明度的,一開始未旋轉時重複在相同區域,層層疊加導致透明度降低,看上去不像是旋轉複製的效果,而是把一大把重疊的花瓣依次展開的效果(腦補一下賭神中一封撲克“唰”的展開的場景),如果仔細看看我們的實現過程,就是如此,那這裡想要達到每一瓣都是從上一瓣的位置複製出去,怎麼辦,改唄。這裡實現的思路也是有多種,我是用改透明度的方法。放上前三片旋轉花瓣的CSS3定義和上面的對比一下(不是要羅程式碼,只是太少看不出規律):

 @keyframes leaf1{
 0%{opacity:0; transform:rotate(0deg); transform-origin:400px 300px} /*增加初始透明度的定義0,即初始不可見*/
 100%{transform:rotate(10deg); transform-origin:400px 300px}
 }
 #leaf1{animation:leaf1 ease 0.1s both ; }

 @keyframes leaf2{
 0%{opacity:0; transform:rotate(10deg); transform-origin:400px 300px} /*增加初始位置定義,即上一朵花瓣的位置*/
 100%{transform:rotate(20deg); transform-origin:400px 300px} 
 }
 #leaf2{animation:leaf2 ease 0.1s both 0.1s; } /*動畫時間統一為0.1s並增加動畫延遲時間的設定0.1s*/

@keyframes leaf3{
0%{opacity:0; transform:rotate(20deg); transform-origin:400px 300px}
100%{transform:rotate(30deg); transform-origin:400px 300px}
}
#leaf3{animation:leaf3 ease 0.1s both 0.2s;} /*動畫延遲時間0.2s,依次類推*/
複製程式碼

在進行一番純體力運動後,完成了如下優化後的效果:

不炫技,SVG+CSS3 旋轉動畫屬性就能實現的夢幻效果

好了,以此為基礎,來試試其他效果。(為了好做,我把花瓣數量減半了)。比如換換旋轉原點transform-origin的值,改一下顏色,就得到了下面這種:

不炫技,SVG+CSS3 旋轉動畫屬性就能實現的夢幻效果
上面效果都是單色的,沒有體現設計師小夥伴們那卓越的配色效果對不對?虐心的改造來了,比如每朵花瓣單獨定義顏色(對我這種毫無審美的假設計師而言只能用系統的色板取色),再隨隨便便換換基礎圖形(即<symbol>定義的圖形),就得到了下面這種蝴蝶展翅:

身無綵鳳雙飛翼

好啦,剩下的自己玩吧,各種形狀,走起,總之,你在AI裡面能實現的此類效果都可以通過這種動畫方式來實現。

2.疊加縮放動畫

嫌棄單純的旋轉複製的效果太單調?沒有關係,我們來一個個疊加其他動畫屬性,先疊加個簡單的,縮放動畫。這個也是在AI中常用的功能之一,縮放和旋轉操作後,反覆的ctrl+D來複制操作。看下下面這張圖,解析一下

單色縮放旋轉複製
不過是最裡面的圓角矩形先等比例放大後旋轉一個固定角度,後面的依次重複這種變換,縮放+旋轉→複製,那我們來轉成CSS3屬性。 基於上面的基礎,首先把<symbol>定義的基礎圖形改一下,旋轉的那裡不用管,現在要增加一個縮放的屬性scale()設定。比如在這個例子裡,我縮放是按1.2倍來進行的,以第一個進行變化的圖形為例,CSS屬性定義如下:

@keyframes leaf1{
0%{opacity:0; transform:rotate(0deg); transform-origin:400px 300px}
100%{transform:rotate(30deg) scale(1.2); transform-origin:400px 300px} /*增加縮放的比例設定*/
}
複製程式碼

這裡比旋轉變形略複雜的在於比例的計算,不像角度那樣可以30度60度90度……直接疊加,縮放比例則是1.2、1.2*12.、1.2*1.2*12……需要稍微計算一下。這樣我們就得到了下面這個旋轉疊加縮放的複製動效:

不炫技,SVG+CSS3 旋轉動畫屬性就能實現的夢幻效果

同樣,改改形狀和變形的原點,可以很輕鬆的做出下面這種

不炫技,SVG+CSS3 旋轉動畫屬性就能實現的夢幻效果

這裡除了填充顏色不同,還稍微改了一下,用了CSS3的混合模式,增加了一個屬性值mix-blend-mode:lighten,也就是我們PS或者AI混合模式中的變亮。 transform:scale()屬性與旋轉不同,是支援兩個值的,比如寫成這種transform:scale(1,1.3)就意味著寬度不變,高度放大1.3倍,我改了一個三角形的看一下效果。

不炫技,SVG+CSS3 旋轉動畫屬性就能實現的夢幻效果
只是簡單的示例,效果不是很好,有創意的設計師可以自行發揮,知道可以分開定義就可以啦。

3.疊加位移動畫

有了上面關於疊加縮放動畫的嘗試,疊加位移動畫就簡單多了。看一下下面這種動效效果,這是一個很討巧的動畫。

位移旋轉複製動畫
之所以說它討巧,是因為仔細分析動效,所有花瓣的位移都是一致的,也就是說我把位移屬性設定到了所有花瓣元素的組合<g>元素上。這樣的話,我賦給組合一個位移屬性設定transform:translateX(50px) translateY(50px),就可以實現這種效果了。關於旋轉原點的定義,因為每個花瓣都是在一個動態位移的過程中,所以我把旋轉原點定義為transform-origin:30% 30%,讓每個花瓣都以自己的固定的一個點為基準。

旋轉原點

關於漸變色的配色,這裡有個小技巧可以參考一下。

漸變色
我們常用的色值,除了RGB和十六進位制表示方法,還有一個hsl(色相、飽和度、明度)表示方法。如上圖所示,最深色和最淺色的hsl值獲取到之後,剩下的顏色可以手動去寫。

在考慮用什麼來展現這種旋轉複製的位移動畫時,突然想到了一個高逼格的圖形,鸚鵡螺的黃金螺旋!來看下下面這張圖。

黃金螺旋

被複用的是一個1/4扇形,旋轉角度為-90度(90度為順時針旋轉),放大的比例有規律可尋,即斐波那契數列。位移值最簡單的計算方法是和上一個相比較,比如圖形7和圖形6相比,垂直方向沒有位移,水平方向正向位移為圖形5的寬(高)度。 **因為這裡transform設定了scalerotatetranslate三種屬性,在書寫順序的時候,一定要把rotate放到scale**的後面,防止因為旋轉導致座標系變化,位移值不好推算。

黃金螺旋
這樣,我們就得到了一個完美黃金螺旋動效。這裡我唯一不能理解的是如果不是填充而是描邊屬性,描邊值會等比例放大。

不炫技,SVG+CSS3 旋轉動畫屬性就能實現的夢幻效果

對於此類旋轉複製動畫,最重要的是<symbol>元素定義重複使用的圖形,然後<use>元素去引用。重複幾次就引用幾次。

相關文章