SVG動畫的簡單介紹

svg-animation.png

你可以把這篇文章看做通往精通SVG動畫之路的第一步孙乖,里面的鏈接資源也是很好的學習資料。所以趕緊收藏本文然后開始你的精通SVG之旅吧份氧。

SVG元素是一種特殊的DOM元素唯袄,語法模仿了標準的HTML元素。SVG元素有著獨有的標簽蜗帜,屬性和行為恋拷,能夠讓它很容易的定義各種形狀——能夠直接在DOM中創(chuàng)造圖像,因此能夠被JavaScript和CSS操作厅缺。

作為初學者蔬顾,你們可以看看這些SVG才能實線的效果:

在此有三個使用SVG創(chuàng)建圖像而不是用圖片(PNG, JPET, etc)的好處:

  • 首先SVG可以被壓縮的很好。
  • 其次湘捎,SVG可以在無損的情況下縮放到任何尺寸诀豁,在桌面和移動設備屏幕上看起來都很銳利。
  • 最后窥妇,你可以在運行的時候(使用JavaScript舷胜,CSS)只讓SVG圖像的一個組件動畫。

創(chuàng)造SVG圖像活翩,你即可以直接使用其DOM元素呈現(xiàn)烹骨,也可以使用你喜愛的圖像編輯軟件繪畫然后導出SVG文件拷貝它的代碼粘貼到HTML中即可。對于初學者材泄,可以看這篇很棒的文章:Working With SVG沮焕。

SVG動畫

無論jQuery還是CSS transitions都沒提供SVG動畫樣式屬性(位置,尺寸屬性)的完整支持拉宗。在IE 9 中不容許CSS transitions動畫SVG元素遇汞,在IE所有版本中也不能使用CSS transforms動畫SVG元素。

因此,要動畫SVG元素空入,你要么使用專門的SVG操控庫络它,或者使用支持SVG的JavaScript動畫庫。前者最有名的是Snap.svg歪赢,后者則是Velocity.js化戳,Velocity.js輕量而且跨瀏覽器支持良好,是wen動畫的絕佳選擇埋凯,本文的例子就使用的事這個動畫庫点楼。

在需要動畫SVG元素的時候Velocity.js會自動檢測,然后無縫的對其施加SVG的特定屬性而無需你更改任何代碼白对。

SVG樣式

SVG元素只接受少數(shù)的幾個標準的CSS屬性掠廓,另外SVG接受一些“表意性(presentational)”,譬如fill甩恼,x蟀瞧,y。這些屬性也用來定義SVG如何渲染条摸。通過CSS定義SVG樣式和直接在SVG元素上使用這些屬性悦污,本身在功能上沒什么不同,SVG規(guī)范中也很少區(qū)分討論钉蒲。

下面的例子中SVG的circle元素和緊接著的SVGrect元素兩者都包含在一個聲明性(mandatory)的SVG容器元素中(這樣也就告訴瀏覽器里面包含的是SVG標記而不是HTML標記)切端。請注意窄陡,顏色是如何通過CSS定義丧叽,而尺寸又是如何通過屬性定義屎慢。

<svg version="1.1" width="300" height="200" xmlns="http://www.w3.org/2000/svg">
    <circle cx="100" cy="100" r="200" style="fill: blue" />
    <rect x="100" y="100" width="200" height="200" style="fill: blue" />
</svg>

(還有一些其他的SVG元素抡草,譬如ellipseline痊班,text等淘菩,更多可以查看MDN)贮乳。

SVG樣式屬性有三大類:color仪搔,gradient,dimensional和storke蜻牢。查看SVG元素的CSS動畫屬性和表現(xiàn)屬性的完整列表可以訪問Velocity.js的SVG animation documentation烤咧。

CSS屬性包含fillstrokefill相當于background-color抢呆,而stroke也就相當與border-color煮嫌。使用Velocity,這些屬性的動畫的方式和標準的屬性并無二致抱虐。

// Animate the SVG element to a red fill and a black stroke
$svgElement.velocity({ fill: "#ff0000", stroke: "#000000" });

// Note that the following WON'T work since these CSS properties are NOT supported by SVG:
$svgElement.velocity({ backgroundColor: "#ff0000", borderColor: "#000000" });

gradient漸變屬性包含stopColor昌阿,stopOpacityoffset。用他們你可以構(gòu)造出任何你想要的漸變效果懦冰。了解更多可以查看MDN's SVG Gradient Guide灶轰。

dimensional維度(尺寸,空間)屬性描述了SVG元素的位置和尺寸刷钢。這些屬性和SVG的形狀元素有些輕微的不同笋颤。

// Unlike HTML, SVG positioning is NOT defined with top/right/bottom/left, float, or margin properties
// Rectangles have their x (left) and y (top) values defined relative to their top-left corner
$("rect").velocity({ x: 100, y: 100 });

// In contrast, circles have their x and y values defined relative to their center (hence, cx and cy properties)
$("circle").velocity({ cx: 100, cy: 100 });
// Rectangles have their width and height defined the same way that DOM elements do
$("rect").velocity({ width: 200, height: 200 });

// Circles have no concept of "width" or "height"; instead, they take a radius attribute (r):
$("circ").velocity({ r: 100 });

Stroke筆畫屬性是特殊的SVG的樣式屬性,和CSS中的border類似内地,但不同的兩點式伴澄,可以創(chuàng)造自己的筆畫Strokes,還可以動畫筆畫阱缓。用例包括書寫效果非凌,和逐漸顯露等。更多SVG Stroke動畫可以查看SVG Line Animation荆针。

將這些放到一起敞嗡,使用Velocity.js的Demo:http://codepen.io

位置屬性 vs. CSS Transforms

你或許想知道使用x/cx y/cy位置屬性和CSS transforms(譬如祭犯,translateX秸妥,translateY)的區(qū)別在哪里?答案便是瀏覽器的支持沃粗,IE(包括IE11)不支持SVG元素的CSS transforms粥惧。而對于硬件加速來說,所有的瀏覽器(包括IE)都默認支持位置屬性的硬件加速——因此最盅,對于SVG的動畫性能突雪,SVG屬性和CSS屬性相等。

總結(jié):

/ The x and y attributes work everywhere that SVG elements do (IE8+, Android 3+)
$("rect").velocity({ x: 100, y: 100 });

// Alternatively, positional transforms (such as *translateX* and *translateY*) work everywhere EXCEPT IE
$("rect").velocity({ translateX: 100, translateY: 100 });

深入了解

通過本篇涡贱,再配合MDN's SVG guide你便可以更好的使用SVG啦咏删!


英文原文:The Simple Intro to SVG Animation

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市问词,隨后出現(xiàn)的幾起案子督函,更是在濱河造成了極大的恐慌,老刑警劉巖激挪,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辰狡,死亡現(xiàn)場離奇詭異,居然都是意外死亡垄分,警方通過查閱死者的電腦和手機宛篇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來薄湿,“玉大人叫倍,你說我怎么就攤上這事偷卧。” “怎么了吆倦?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵听诸,是天一觀的道長。 經(jīng)常有香客問我逼庞,道長蛇更,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任赛糟,我火速辦了婚禮派任,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘璧南。我一直安慰自己掌逛,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布司倚。 她就那樣靜靜地躺著豆混,像睡著了一般。 火紅的嫁衣襯著肌膚如雪动知。 梳的紋絲不亂的頭發(fā)上皿伺,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音盒粮,去河邊找鬼鸵鸥。 笑死,一個胖子當著我的面吹牛丹皱,可吹牛的內(nèi)容都是我干的妒穴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼摊崭,長吁一口氣:“原來是場噩夢啊……” “哼讼油!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起呢簸,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤矮台,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后根时,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘦赫,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年啸箫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伞芹。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡忘苛,死狀恐怖蝉娜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扎唾,我是刑警寧澤召川,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站胸遇,受9級特大地震影響荧呐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纸镊,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一倍阐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逗威,春花似錦峰搪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至罐呼,卻和暖如春鞠柄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嫉柴。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工厌杜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人差凹。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓期奔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親危尿。 傳聞我的和親對象是個殘疾皇子呐萌,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

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