用SVG動(dòng)畫重現(xiàn)布爾運(yùn)算的設(shè)計(jì)過程

這是在作圖時(shí)突然迸發(fā)的靈感(是的瞻坝,偶爾也會(huì)有那么一瞬間頭腦開竅)暮蹂,作為設(shè)計(jì)師小伙伴們怨愤,平時(shí)用的最多的應(yīng)該是布爾運(yùn)算吧派敷,基礎(chǔ)圖形的加加減減,得到任意的形狀撰洗。就不說經(jīng)典的Apple了篮愉,比如網(wǎng)易云音樂圖標(biāo),你如果直接放上這個(gè)差导,似乎沒什么试躏。


但放上布爾運(yùn)算過程的設(shè)計(jì)稿(所有基礎(chǔ)圖形的輪廓),瞬間高大上起來设褐,滿滿的設(shè)計(jì)感颠蕴。


所以在做矢量圖的過程就突然想到如果能用SVG結(jié)合CSS3的動(dòng)效來還原這個(gè)設(shè)計(jì)過程,也不失為一個(gè)好玩的效果助析,當(dāng)然了犀被,不會(huì)那么巧剛好用到所有的四種運(yùn)算,只是用動(dòng)畫過程演示一遍外冀,此為目的寡键。因?yàn)樽约旱牡鬃泳秃苋酰赃x了一個(gè)臨摹的圖形锥惋,眾位客官湊合看吧昌腰。

1.準(zhǔn)備工作——圖形分層

每次在做SVG動(dòng)效之前,都會(huì)給自己一點(diǎn)時(shí)間思考一下動(dòng)畫完成的思路膀跌,以及用什么屬性來實(shí)現(xiàn)遭商,正所謂多點(diǎn)思考,少點(diǎn)勞作捅伤,或者換句話說劫流,“不能用戰(zhàn)術(shù)的勤奮來代替戰(zhàn)略的懶惰”。
先放一張成品的效果圖,如下祠汇,就是這只萌萌的小象


AI中做布爾運(yùn)算雖然用路徑查找器極其方便仍秤,且能切割,任意玩可很,但是修改起來卻沒有PS那么方便诗力,給做完運(yùn)算后的調(diào)整不是很方便的說。比如十幾甚至更多個(gè)形狀的布爾運(yùn)算在PS里玩起來還算輕松我抠,左挪右挪上層下層的調(diào)節(jié)么有壓力苇本,在AI里那要被玩壞了。所以第一步菜拓,要在AI里做好分層瓣窄。注明一點(diǎn),這些是要在作圖之前就確定的纳鼎。
我把小象分成三個(gè)部分俺夕,身體、頭部和尾巴贱鄙,目的就是為了減少每個(gè)部分的基本形狀的數(shù)量劝贸。
AI中進(jìn)行過布爾運(yùn)算后的形狀導(dǎo)出后是得到的結(jié)果的路徑,這就不歡樂了贰逾,舉個(gè)簡(jiǎn)單的例子:


上面兩個(gè)圓形悬荣,相交之后得到的形狀,導(dǎo)出后是<path d="">疙剑,完全不見兩個(gè)圓形<circle>的蹤跡氯迂,既然我們是還原過程,過程言缤,就需要把原運(yùn)算前的路徑保留嚼蚀,怎么破?在進(jìn)行運(yùn)算之前原位復(fù)制到新的圖層中唄管挟。以小象的身體為例轿曙,我保留了兩個(gè)圖層,運(yùn)算后和運(yùn)算前的僻孝,這些路徑都是我需要用到的导帝。

2.創(chuàng)建圖形過程的動(dòng)畫

鑒于自己這渣渣一般的水平,圖形加減那一套過程就不拿出來嘚瑟了穿铆,還是留著自家珍藏吧您单,這里只說如何用動(dòng)畫表現(xiàn)出來。各位設(shè)計(jì)師回想一下自己的創(chuàng)建基本形狀的過程荞雏,是不是選擇形狀后在畫布進(jìn)行鼠標(biāo)拖動(dòng)就可以了虐秦,嗯平酿,這里我們主要實(shí)現(xiàn)的就是鼠標(biāo)拖動(dòng)的動(dòng)畫過程。來看下面這張圖(不要給我講你是按著alt鍵巴拉巴拉的悦陋,不管蜈彼,要不這動(dòng)畫沒法做了 ~~~(>_<)~~~):


從左上角到右下角的拖動(dòng)過程就是圖形的創(chuàng)建過程,而且在創(chuàng)建的過程中俺驶,圖形是逐漸從無到有幸逆,從小到大的。好了痒钝,廢話了半天秉颗,不不,是拋磚引玉送矩,這就是我們實(shí)現(xiàn)創(chuàng)建圖形過程的動(dòng)畫思路。

@keyframes draw{
0%{transform:scale(0,0);transform-origin:left top}
100%{transform:scale(1,1);transform-origin:left top}
}  
/*通用繪制過程的動(dòng)畫定義*/

經(jīng)過分析我們得出哪替,縮放變形transform:scale()是實(shí)現(xiàn)這種效果的最佳方案栋荸,這里唯一要注意的是關(guān)于變形的基點(diǎn),前面在涉及旋轉(zhuǎn)動(dòng)畫中凭舶,更多的定義是transform-origin:center center晌块,也就是以圓心為基點(diǎn),而這里定義的是左上角帅霜,也就是left top匆背,其實(shí)CSS的一些語(yǔ)法真的算是很簡(jiǎn)單了,英語(yǔ)入門級(jí)身冀。另外這里對(duì)應(yīng)的left和top的值是相對(duì)位置钝尸,這也是為什么能把draw定義成通用的原因。
下面這張圖形虛線部分是為了得到身體部分創(chuàng)建的所有基礎(chǔ)圖形搂根,實(shí)色填充的部分即為最后需要的身體部分珍促。

基礎(chǔ)圖形是由5個(gè)圓形和1個(gè)矩形共同組成的。我進(jìn)行了標(biāo)號(hào)剩愧。


對(duì)于身體部分猪叙,是4個(gè)圓形和1個(gè)矩形與1個(gè)基礎(chǔ)圓形進(jìn)行相減得到的。為了讓動(dòng)畫過程更形象仁卷,讓基礎(chǔ)圓形進(jìn)行了實(shí)色填充穴翩,其他形狀用虛線來表示。根據(jù)上面動(dòng)畫的定義锦积,先來實(shí)現(xiàn)基礎(chǔ)圖形的創(chuàng)建過程芒帕,CSS部分如下:

<style>
@keyframes draw{
0%{transform:scale(0,0);transform-origin:left top}
100%{transform:scale(1,1);transform-origin:left top}
} 
#circle0{animation:draw 1s ease;fill:#414c68;}/*基礎(chǔ)形狀用實(shí)色填充*/
#circle1{animation:draw 1s ease 1s backwards;}
#circle2{animation:draw 1s ease 2s backwards;}
#circle3{animation:draw 1s ease 3s backwards;}
#circle4{animation:draw 1s ease 4s backwards;}
#rect1{animation:draw 1s ease 5s backwards;}
.sketch{stroke:#c0f1ff;stroke-width:2;fill:none}/*其他形狀用描邊*/
</style>

SVG部分簡(jiǎn)化如下(去掉了和形狀尺寸位置相關(guān)的屬性定義):

<circle id="circle0"/> <!--基礎(chǔ)形狀-->
<g class="sketch">  <!--其他形狀-->
<circle id="circle1" />
<circle id="circle2" />
<circle id="circle3"/>
<circle id="circle4"/>
<rect id="rect1"/>
</g>

簡(jiǎn)單解釋一下,動(dòng)畫屬性定義那里拿這個(gè)#circle1{animation:draw 1s ease 1s backwards;}為例充包,第一個(gè)1s是繪制時(shí)間副签,第二個(gè)1s是延遲時(shí)間遥椿,為了讓圖形呈現(xiàn)出依次創(chuàng)建的過程,所以延遲時(shí)間是遞增的淆储。backwards這個(gè)屬性一定要定義冠场,當(dāng)我們給動(dòng)畫定義了延遲時(shí),我們需要定義動(dòng)畫時(shí)間之外對(duì)象的狀態(tài)(animation-fill-mode)本砰,backwards表示動(dòng)畫開始前應(yīng)用開始屬性值碴裙,也就是我們定義的scale(0,0),換句話說点额,是不顯示的舔株,這里也可以定義成both,對(duì)這個(gè)動(dòng)畫效果而言还棱,沒有區(qū)別载慈。
現(xiàn)在看一下動(dòng)畫效果:


嗯,基本重現(xiàn)了創(chuàng)建了基礎(chǔ)圖形的過程珍手。那么下一部分來了办铡,怎么才能過渡到運(yùn)算之后的形狀呢?

3.運(yùn)算過程的動(dòng)畫

在做這個(gè)動(dòng)畫伊始琳要,我想到的是把相減的圖形轉(zhuǎn)化成蒙版寡具,能行不?絕對(duì)能行稚补,但實(shí)在是太麻煩了童叠。記得我們還保留了運(yùn)算后的圖形放到了單獨(dú)的圖層中吧?這時(shí)课幕,需要它粉墨登場(chǎng)了厦坛,然后其他的圖形怎么辦?集體消失撰豺!
關(guān)于消失的方法也有很多種粪般,隨便來個(gè)順手的就行了,我準(zhǔn)備用蒙版污桦。為了實(shí)現(xiàn)組合圖形消失以及運(yùn)算后的圖形出現(xiàn)的過程亩歹,不得已,又定義了兩個(gè)動(dòng)畫凡橱,其實(shí)做到這里的時(shí)候小作,已經(jīng)很后悔了,遠(yuǎn)不如好好學(xué)學(xué)AE稼钩,在AE里實(shí)現(xiàn)顾稀,但自己挖的坑,含著淚也要跳進(jìn)去再努力爬出來啊坝撑,善始善終静秆,硬著頭皮繼續(xù)做吧粮揉。流著淚補(bǔ)充了下面的動(dòng)畫定義:

@keyframes skip{
0%{opacity:0}
100%{opacity:1}
} /*這是為要登場(chǎng)的圖形準(zhǔn)備的*/
@keyframes combine{
0%{fill:#FFFFFF}
100%{fill:#000000}
}/*這是為要退出舞臺(tái)的圖形準(zhǔn)備的*/

.skip{animation:skip 1s  6s both; fill:#414c68}
.combine{animation:combine 1s 6s both;}

以及:

<mask id="shade"><rect x="0" y="0" width="800" height="600" id="combine"/></mask> <!--蒙版定義-->
<g mask="url(#shade)">……</g>
<path class="skip" d=""/><!--組合后的形狀-->

<g mask="url(#shade)">是把所有的圖形又組合后,使用這個(gè)蒙版抚笔。唯一值得欣慰的是skip和combine這兩個(gè)動(dòng)畫可以被復(fù)用扶认。
插播一個(gè)小知識(shí)點(diǎn),關(guān)于利用蒙版的漸隱動(dòng)畫殊橙,是不能用0%{opacity:0} 100%{opacity:1} 然后填充黑色fill:#000000這種表面上看上去是蒙版漸現(xiàn)的方式來實(shí)現(xiàn)辐宾,是因?yàn)楫?dāng)不給蒙版定義顏色時(shí),蒙版會(huì)被默認(rèn)為黑色膨蛮,因此即使開始定義了透明度為0叠纹,也會(huì)被當(dāng)做黑色處理。如果實(shí)在要用的話敞葛,就套兩層蒙版誉察,一層黑色的透明度改變,下面一層白色實(shí)色底制肮。我只截變化的那一部分動(dòng)畫來看一下:


似乎銜接的還不錯(cuò)喲冒窍。

剩下的工作就是體力活了呃,需要把頭部的動(dòng)畫和尾巴的動(dòng)畫補(bǔ)充上豺鼻,沒有什么特殊的,延遲的時(shí)間別弄錯(cuò)了就行款慨,這里就不說了吧儒飒。最后得到的統(tǒng)一的動(dòng)畫是這個(gè)樣子的:


與理想中那種滿滿的設(shè)計(jì)感有差異,不過還好檩奠。下面試著來優(yōu)化一下桩了,上個(gè)色吧。

4.顏色填充過程

顏色填充的過程埠戳,與這個(gè)展示繪制動(dòng)畫過程沒有什么毛線關(guān)系井誉,就是為了好看!好看整胃!我還能說什么呢颗圣?說什么顯示填色的過程,鬼屁使,對(duì)于怎么展示漸變填充完美沒有思路在岂,我就利用了一下蒙版,把已經(jīng)填充好的圖形先用蒙版蓋起來蛮寂,讓你們看不見看不見蔽午,然后在適當(dāng)?shù)臅r(shí)間,蒙版逐漸移動(dòng)酬蹋,露出填充好顏色圖形及老。為了讓蒙版顯示的效果更加自然抽莱,這里我用漸變色對(duì)蒙版進(jìn)行了填充。圖示如下:

<defs>
<linearGradient id="gradient3"  x1="0" y1="0" x2="0" y2="600">
  <stop offset="0" stop-color="#ffffff"/>
  <stop offset="0.1" stop-color="#000000"/>
</linearGradient>
</defs> <!--定義的漸變類型-->

最后得到的效果如下:

另外骄恶,狠狠的告誡自己食铐,下次再也不做這種費(fèi)勁巴拉但不酷炫的效果了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末叠蝇,一起剝皮案震驚了整個(gè)濱河市璃岳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悔捶,老刑警劉巖铃慷,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蜕该,居然都是意外死亡犁柜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門堂淡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來馋缅,“玉大人,你說我怎么就攤上這事绢淀∮┿玻” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵皆的,是天一觀的道長(zhǎng)覆履。 經(jīng)常有香客問我,道長(zhǎng)费薄,這世上最難降的妖魔是什么硝全? 我笑而不...
    開封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮楞抡,結(jié)果婚禮上伟众,老公的妹妹穿的比我還像新娘。我一直安慰自己召廷,他們只是感情好凳厢,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柱恤,像睡著了一般数初。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梗顺,一...
    開封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天泡孩,我揣著相機(jī)與錄音,去河邊找鬼寺谤。 笑死仑鸥,一個(gè)胖子當(dāng)著我的面吹牛吮播,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播眼俊,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼意狠,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了疮胖?” 一聲冷哼從身側(cè)響起环戈,我...
    開封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎澎灸,沒想到半個(gè)月后院塞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡性昭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年拦止,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糜颠。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡汹族,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出其兴,到底是詐尸還是另有隱情顶瞒,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布元旬,位于F島的核電站搁拙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏法绵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一酪碘、第九天 我趴在偏房一處隱蔽的房頂上張望朋譬。 院中可真熱鬧,春花似錦兴垦、人聲如沸徙赢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)狡赐。三九已至,卻和暖如春钦幔,著一層夾襖步出監(jiān)牢的瞬間枕屉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工鲤氢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搀擂,地道東北人西潘。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像哨颂,于是被迫代替她去往敵國(guó)和親喷市。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果威恼,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜品姓,今天將帶大家一窺iOS動(dòng)畫全貌。在這里你可以看...
    F麥子閱讀 5,118評(píng)論 5 13
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果箫措,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜腹备,今天將帶大家一窺ios動(dòng)畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,516評(píng)論 6 30
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,336評(píng)論 25 707
  • 在前面兩篇文章中蒂破,雖然完整描述了任意圖形的變形動(dòng)畫實(shí)現(xiàn)方法馏谨,但最大的局限性顯而易見,那就是都是一個(gè)圖形變形成另一個(gè)...
    泱泱悲秋閱讀 1,443評(píng)論 0 0
  • 開學(xué)的第一天附迷,因?yàn)椴贿m應(yīng)在家以外的地方惧互,花顏很早就醒了,但她看了看白亦可和劉零零喇伯,發(fā)現(xiàn)她們睡得很香喊儡,沒有絲毫要睡醒...
    歡言歡語(yǔ)閱讀 880評(píng)論 0 0