如何用純SVG打造一枚漸變loading圖標(biāo)

是的仿贬,看標(biāo)題能繞暈?zāi)恪?br> 那就通俗點(diǎn)纽竣,說點(diǎn)人說的話吧。就是下面這貨:

漸變描邊

這種圖標(biāo),以一眾UI設(shè)計(jì)師多年深厚的功底蜓氨,打眼一看就知道聋袋,一定是旋轉(zhuǎn)的loading圖標(biāo)。小伙伴稱之為什么呢语盈?漸變描邊嘛舱馅?之所以這么拗口的起了個角度漸變描邊這種鬼畜的名字,是因?yàn)閜hotoshop的漸變描邊有下面三種效果


最像角度漸變對不對刀荒?好了代嗤,名字介紹到此結(jié)束,進(jìn)入正題缠借。
這張圖片干毅,用ps來做,分分鐘的事情對不對泼返?然后CSS3一個旋轉(zhuǎn)動畫屬性就好啦硝逢,但是,作為深中SVG之毒的假UI來說绅喉,這樣絕不能滿足渠鸽!一定要用SVG來實(shí)現(xiàn),然后各種尺寸一個圖標(biāo)360度無死角適配柴罐。
好了徽缚,說做就做。

1.AI繪制

既然用SVG革屠,就少不了好基友AI了凿试,我們都知道AI是可以導(dǎo)出一切SVG的,AI里面怎么完成似芝,我不專業(yè)那婉,只想到了一個簡單的方法,先做一個混合党瓮,然后圓周(開放路徑)替換混合軸來完成详炬。其他設(shè)計(jì)師小伙伴有其他更好的方法都可以。

AI中制作方法

為了讓漸變效果更自然寞奸,我混合選項(xiàng)那里用的是指定的距離1px痕寓。好了,完成蝇闭,導(dǎo)出SVG,加animation設(shè)置硬毕,轉(zhuǎn)起來呻引,鞠躬,謝幕吐咳,教程到此結(jié)束(你特么是在逗我嘛逻悠?)元践。
等等,不要走童谒,回來单旁,來來來,你看看饥伊,你的SVG有多大象浑。

SVG

37K,天雷滾滾琅豆,我導(dǎo)出png的話才只有5K多點(diǎn)愉豺。說好的代碼實(shí)現(xiàn)更簡單呢茫因?蚪拦!

暫時壓制住狂躁的心,然后來看一下SVG代碼冻押。
我隨隨便便貼上一點(diǎn)看一下:


里面是N多個<circle>來組成的。
嗯洛巢,也不是太多括袒,五百多個而已嘛±窃ǎ回想一下我們在AI中使用替換混合軸來實(shí)現(xiàn)這種效果的原理,然后把指定距離變大一些(我由1px改成了10px)狈邑,看一下效果

AI是如何實(shí)現(xiàn)這種漸變效果的一目了然城须,很多圓一個個拼接起來,顏色逐漸變化米苹,這才從視覺上組成了一個圓的類似角度漸變的描邊效果糕伐。
當(dāng)然了蘸嘶,這么蛋疼的SVG是不能用的良瞧,說好的好維護(hù)呢?回頭要改個顏色我去源文件改五百多個色值训唱?還不是要AI重新生成,重新導(dǎo)出况增?那到底能不能破赞庶?

2.變通的實(shí)現(xiàn)方法

CSS3的漸變支持線性漸變和徑向漸變,所以,想個辦法歧强,能不能利用基礎(chǔ)的漸變來生成這個圖形澜薄?在死死的盯住這個圖長達(dá)五分鐘之久后摊册,發(fā)現(xiàn)這個圖拋棄頂部圓形不算肤京,似乎是一分為二的兩個線性漸變拼成的。

既然是線性漸變茅特,那我們可以放心大膽的玩起來了,首先温治,我在AI中繪制了一個圓環(huán)饭庞,然后擴(kuò)展描邊熬荆,圖形從中分割開舟山,生成兩個半圓環(huán)。

我們需要的就是這兩個半圓環(huán)的<path>路徑卤恳。
當(dāng)然了,對于非設(shè)計(jì)師的玩法也很簡單(我們暫且稱之為開發(fā)人員玩法)突琳,一個大圓復(fù)制兩份若债,利用內(nèi)部的小一些的同心圓蒙版產(chǎn)生圓環(huán),然后兩個圓環(huán)一個加左半邊蒙版蠢琳,一個加右半邊蒙版,我懶镜豹,直接借助AI導(dǎo)出路徑最喜歡傲须。
得到兩個半圓環(huán)路徑之后趟脂,現(xiàn)在有兩個方法可以選擇泰讽,先來看第一種:直接給兩個半圓進(jìn)行線性漸變疊加,然后補(bǔ)充上頂部的圓形

似乎還不錯昔期,看看導(dǎo)出的SVG(我簡化了一下)

<svg>
<style type="text/css">
.st1{fill:url(#SVGID_1_);}
.st2{fill:url(#SVGID_2_);}
.st3{fill:#4886CD;}
</style>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="150" y1="0" x2="150" y2="200">
<stop  offset="0" style="stop-color:#4886CD"/>
<stop  offset="1" style="stop-color:#9DBFE4"/>
</linearGradient><!--深藍(lán)到淺藍(lán)的漸變-->
<path class="st1" d="M100,0v20c44.1,0,80,35.9,80,80c0,44.1-35.9,80-80,80v20c55.2,0,100-44.8,100-100S155.2,0,100,0z"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="50" y1="0" x2="50" y2="200">
<stop  offset="0" style="stop-color:#FFFFFF"/>
<stop  offset="1" style="stop-color:#9DBFE4"/>
</linearGradient><!--白色到淺藍(lán)的漸變-->
<path class="st2" d="M20,100c0-44.1,35.9-80,80-80V0C44.8,0,0,44.8,0,100s44.8,100,100,100v-20C55.9,180,20,144.1,20,100z"/>
<circle class="st3" cx="100" cy="10" r="10"/>
</svg>

代碼比較清晰,AI定義了兩個漸變“SVGID_1_”和“SVGID_2_”硼一,然后兩個半圓環(huán)路徑去調(diào)用不同的漸變累澡。
這時般贼,我們只要在CSS樣式里加上下面這段定義旋轉(zhuǎn)動畫的代碼:

@keyframes load{
0%{transform:rotate(0)}
100%{transform:rotate(-360deg)}
}
#load{animation:load 1s  linear infinite; transform-origin:center center;} 

然后把組成圖形的<path><circle>都用一個<g>標(biāo)簽包起來永乌,然后<g id="load">來調(diào)用動畫惑申,(最后會放最終代碼的翅雏,這里不再羅里吧嗦了),好啦人芽,轉(zhuǎn)起來望几,走你萤厅。

速度橄抹、方向神馬的不滿意再調(diào)整,都是小事情楼誓。然后看看文件大小,1.4K名挥,減少了35K疟羹,似乎不起眼禀倔,但是榄融,當(dāng)用另外一種表達(dá)方法,縮小到原來的3.7%救湖,減少了96%的體積,嘖嘖嘖鞋既,是不是要上天力九?而且SVG代碼里一共三個色值,隨時隨地方便更換跌前!
還沒完,作為一枚有理想有追求的loading圖標(biāo)检吆,這樣就算完了嘛舒萎?我還沒說方法2呢蹭沛!

3.漸變優(yōu)化


近看這個圖標(biāo)會發(fā)現(xiàn)兩個協(xié)調(diào)不好的地方臂寝,一個是頂部的圓和背景圓環(huán)交接處,一個是兩個半圓環(huán)交界處摊灭,出現(xiàn)的原因很簡單咆贬,我用漸變填充的圓形來表示一下帚呼。


也就是說掏缎,雖然那個一堆<circle>形成的漸變環(huán)很魔性皱蹦,但是按照圓周弧形漸變眷蜈,而我們上面一分為二的漸變則是垂直方向的漸變沪哺,好了,說了一堆酌儒,到底能不能破?能忌怎!下面跟著我來做一個障眼法籍滴。

我們都知道榴啸,即使在軟件里孽惰,也是可以任意修改漸變色的停靠點(diǎn)的鸥印,如上圖所示,我把兩個圓環(huán)的基礎(chǔ)的線性漸變進(jìn)行了拆分辅甥,左側(cè)分為L1(白→淺藍(lán))漸變區(qū)和L2(淺藍(lán)填充)純色區(qū)酝润,右側(cè)分為R1(藍(lán)色填充)純色區(qū)、R2(藍(lán)→淺藍(lán))漸變區(qū)和R3(淺藍(lán)填充)純色區(qū)璃弄,如此拆分的目的就是為了讓原來圖標(biāo)頂部的小圓形對應(yīng)的底部圓環(huán)所在區(qū)域?yàn)楹推湎嗤募兩硐目椋撞恳捕际羌兩畛涫韪溃瑢?shí)現(xiàn)左半環(huán)和右半環(huán)的無縫拼接。
方法有了浑塞,實(shí)際操作中,零代碼基礎(chǔ)的UI們可以調(diào)節(jié)AI中漸變來實(shí)現(xiàn)政己,有一丟丟SVG基礎(chǔ)的酌壕,可以直接通過上面SVG漸變對應(yīng)的代碼

<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="150" y1="0" x2="150" y2="200">
<!--右半圓環(huán)的漸變-->
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="50" y1="0" x2="50" y2="200">
<!--左半圓環(huán)的漸變-->

調(diào)整y值(垂直方向歇由,Y值即吐央梗靠點(diǎn)位置),比如這里沦泌,我的小圓的半徑=10,即環(huán)徑為20谢谦,那么左側(cè)對應(yīng)y1="0",y2="180",右側(cè)對應(yīng)y1="20",y2="180"释牺。
調(diào)整后效果如下:

調(diào)整漸變停靠點(diǎn)后的圓環(huán)

完美没咙!
好了猩谊,下面轉(zhuǎn)起來


收工!
既然騙眾位客官進(jìn)來了祭刚,那就放上通用代碼和注釋吧预柒,需要什么顏色,直接調(diào)整就可以了袁梗,至于尺寸嘛,上網(wǎng)搜一篇關(guān)于SVG的viewBoxwidth憔古、height的關(guān)系遮怜,各種尺寸無壓力,或者直接交給開發(fā)人員就好了嘛鸿市。

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"  width="200px" height="200px"  viewBox="0 0 200 200"
 xml:space="preserve">
<!--#4886CD為深色值   #9DBFE4為中間值 可以隨意修改-->  
<style type="text/css">
.left{fill:url(#left);}
.right{fill:url(#right);}
.top{fill:#4886CD;}
@keyframes load{
0%{transform:rotate(0)}
100%{transform:rotate(-360deg)}
}
#load{animation:load 1s  linear infinite; transform-origin:center center; } 
</style>
<g id="load">
<linearGradient id="right" gradientUnits="userSpaceOnUse" x1="150" y1="20" x2="150" y2="180">
<stop  offset="0" style="stop-color:#4886CD"/>
<stop  offset="1" style="stop-color:#9DBFE4"/><!--藍(lán)到淺藍(lán)漸變-->
</linearGradient>
<path class="right" d="M100,0v20c44.1,0,80,35.9,80,80c0,44.1-35.9,80-80,80v20c55.2,0,100-44.8,100-100S155.2,0,100,0z"/><!--右半圓環(huán)-->
<linearGradient id="left" gradientUnits="userSpaceOnUse" x1="50" y1="0" x2="50" y2="180">
<stop  offset="0" style="stop-color:#FFFFFF"/>
<stop  offset="1" style="stop-color:#9DBFE4"/><!--淺藍(lán)到白色漸變-->
</linearGradient>
<path class="left" d="M20,100c0-44.1,35.9-80,80-80V0C44.8,0,0,44.8,0,100s44.8,100,100,100v-20C55.9,180,20,144.1,20,100z"/><!--左半圓環(huán)-->
<circle class="top" cx="100" cy="10" r="10"/>
</g>
</svg>

比如你想來個熱情洋溢的紅黃色系的

直接把三個色值套進(jìn)代碼里锯梁,分別替換深色,中間色和淺色焰情。
得到效果如下

或者紫色


套色值


以及粉色小清新

o( ̄︶ ̄)o

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陌凳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子内舟,更是在濱河造成了極大的恐慌合敦,老刑警劉巖验游,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件充岛,死亡現(xiàn)場離奇詭異,居然都是意外死亡耕蝉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門垒在,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒜魄,“玉大人场躯,你說我怎么就攤上這事谈为。” “怎么了推盛?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長耘成。 經(jīng)常有香客問我榔昔,道長,這世上最難降的妖魔是什么撒会? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任嘹朗,我火速辦了婚禮,結(jié)果婚禮上诵肛,老公的妹妹穿的比我還像新娘。我一直安慰自己怔檩,他們只是感情好褪秀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布薛训。 她就那樣靜靜地躺著媒吗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乙埃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天介袜,我揣著相機(jī)與錄音甫何,去河邊找鬼遇伞。 笑死辙喂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赃额。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼跳芳,長吁一口氣:“原來是場噩夢啊……” “哼芍锦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起飞盆,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤娄琉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吓歇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孽水,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年城看,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片测柠。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡炼鞠,死狀恐怖缘滥,靈堂內(nèi)的尸體忽然破棺而出谒主,到底是詐尸還是另有隱情朝扼,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布擎颖,位于F島的核電站,受9級特大地震影響观游,放射性物質(zhì)發(fā)生泄漏搂捧。R本人自食惡果不足惜懂缕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一异旧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧提佣,春花似錦荤崇、人聲如沸拌屏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倚喂。三九已至,卻和暖如春瓣戚,著一層夾襖步出監(jiān)牢的瞬間端圈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工子库, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仑嗅。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓宴倍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸵贬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,161評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫脖捻、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,105評論 4 62
  • 飛機(jī)引擎巨大的轟鳴聲幾次把我從睡夢中吵醒夕春,接著還要調(diào)整耳朵的氣壓。從側(cè)窗往下看专挪,似乎是沙漠,再次醒來的時候寨腔,看見無...
    吳曉布閱讀 2,399評論 8 25
  • 10月12日上午八點(diǎn)半迫卢,皋蘭縣名師首屆論壇在魏家莊小學(xué)如期拉開序幕。 參加本次名師論壇的人員有教育局...
    蘭州青青子衿閱讀 1,947評論 2 4