SVG动画的简单介绍

svg-animation.png

你可以把这篇文章看做通往精通SVG动画之路的第一步,里面的链接资源也是很好的学习资料。所以赶紧收藏本文然后开始你的精通SVG之旅吧。

SVG元素是一种特殊的DOM元素,语法模仿了标准的HTML元素。SVG元素有着独有的标签,属性和行为,能够让它很容易的定义各种形状——能够直接在DOM中创造图像,因此能够被JavaScript和CSS操作。

作为初学者,你们可以看看这些SVG才能实线的效果:

在此有三个使用SVG创建图像而不是用图片(PNG, JPET, etc)的好处:

  • 首先SVG可以被压缩的很好。
  • 其次,SVG可以在无损的情况下缩放到任何尺寸,在桌面和移动设备屏幕上看起来都很锐利。
  • 最后,你可以在运行的时候(使用JavaScript,CSS)只让SVG图像的一个组件动画。

创造SVG图像,你即可以直接使用其DOM元素呈现,也可以使用你喜爱的图像编辑软件绘画然后导出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元素只接受少数的几个标准的CSS属性,另外SVG接受一些“表意性(presentational)”,譬如fillxy。这些属性也用来定义SVG如何渲染。通过CSS定义SVG样式和直接在SVG元素上使用这些属性,本身在功能上没什么不同,SVG规范中也很少区分讨论。

下面的例子中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元素,譬如ellipselinetext等,更多可以查看MDN)。

SVG样式属性有三大类:color,gradient,dimensional和storke。查看SVG元素的CSS动画属性和表现属性的完整列表可以访问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渐变属性包含stopColorstopOpacityoffset。用他们你可以构造出任何你想要的渐变效果。了解更多可以查看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类似,但不同的两点式,可以创造自己的笔画Strokes,还可以动画笔画。用例包括书写效果,和逐渐显露等。更多SVG Stroke动画可以查看SVG Line Animation

将这些放到一起,使用Velocity.js的Demo:http://codepen.io

位置属性 vs. CSS Transforms

你或许想知道使用x/cx y/cy位置属性和CSS transforms(譬如,translateX,translateY)的区别在哪里?答案便是浏览器的支持,IE(包括IE11)不支持SVG元素的CSS transforms。而对于硬件加速来说,所有的浏览器(包括IE)都默认支持位置属性的硬件加速——因此,对于SVG的动画性能,SVG属性和CSS属性相等。

总结:

/ 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容