SVG和Canvas
SVG
SVG,即可缩放矢量图形(Scalable Vector Graphics),是一种 XML 应用,可以以一种简洁、可移植的形式表示图形信息。
SVG 主要可以概括为以下几点:
-
SVG 指可伸缩矢量图形
-
SVG 用来定义网络的基于矢量的图形
-
SVG 使用 XML 格式定义图形
-
SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失
-
SVG 是万维网联盟的标准
-
SVG 与诸如 DOM 和 XSL 之类的 W3C 标准是一个整体
SVG使用
第一种:<embed />标签
<embed src="circle1.svg" type="image/svg+xml" />
第二种:<object />标签
<object data="circle1.svg" type="image/svg+xml"></object>
第三种:<iframe />标签
<iframe src="circle1.svg"></iframe>
也可以使用a标签,链接到SVG文件。
<a href="circle1.svg">View SVG file</a>
浏览器是能够直接展示SVG的标签的。
<svg width="100%" height="100%"> <rect width="300" height="100"style="fill:rgb(0,0,255);stroke-width:1;stroke:rgb(0,0,0)"/> <svg/>
SVG语法
SVG标签
SVG代码都放在顶层标签<svg>之中。
<svg width="100%" height="100%"> <circle id="mycircle" cx="50" cy="50" r="50""/></svg>
width属性和height属性,制定了SVG图像在HTML元素中所占据的宽度和高度。除了相对单位,也可以采用绝对单位(单位∶像素)。如果不指定这两个属性,SVG图像默认大小是300像素(宽)*150像素(高)。
如果只想展示SVG图像的一部分,就要指定viewBox属性。
<svg width="100" height="100" viewBox="50 50 50 50"><circle id="mycircle" cx="50" cy="50" r="50""/> </svg>
viewBox属性的值有四个数字,分别是左上角的横坐标和纵坐标、视口的高度和宽度。上面代码中,SVG图像是100像素宽*100像素高,viewBox属性指定视口从( 50,50 )这个点开始。所以,实际看到的是右下角的四分之一圆。
注意,视口必须适配所在的空间。上面代码中,视口的大小是50 50,由于SVG图像的大小是100 100,所以视口会放大去适配SVG图像的大小,即放大了四倍。
如果不指定width属性和height属性,只指定viewBox属性,则相当于只给到定SVG图像的长宽比。这时,SVG图像的默认大小将等于所在的HTML元素的大小。
-
<circle>标签代表圆形。
<svg width="300"height="180"> <circle cx="30" cy="50" r="25"/> <circle cx="90" cy="50" r="25" fill="red"/> <circle cx="150" cy="50"r="25" class="fancy"/> </svg>
上面的代码定义了三个圆。<circle>标签的cx、cy、r属性分别为横坐标、纵坐标和半径,单位为像素。坐标都是相对于<svg>画布的左上角原点。class属性用来指定对应的CSS类。
.fancy { fi11: none; stroke: b1ack; stroke-width: 3pt; }
SVG的CSS属性与网页元素有所不同。
-
fill:填充色
-
stroke:描边色
-
stroke-width:边框宽度
-
<line>标签用来绘制直线。
<svg width="300" height="180"> <line x1="0" y1="0" x2="200" y2="0" style="stroke:rgb(0,0,0)" stroke-width:"5"/> </svg>
上面代码中,<line>标签的x1属性和y1属性,表示线段起点的横坐标和纵坐标11;x2属性和y2属性,表示线段终点的横坐标和纵坐标; style属性表示线段的样式。
-
<polyline>标签用于绘制一根折线。
<svg width="300" height="180"> <polyline points="3,3 30,28 3,53"fi71="none" stroke="black"/> </svg>
<polyline>的points属性指定了每个端点的坐标,横坐标与纵坐标之间与逗号分隔,点与点之间用空格分隔。2.5<rect>标签
-
<rect>标签用于绘制矩形。
<svg width="300" height="180"> <rect x="o" y="o" height="100" width="200" style="stroke: #70d5dd; fi11: #dd524b"/> </svg>
<rect>的x属性和y属性,指定了矩形左上角端点的横坐标和纵坐标;width属性和height属性指定了矩形的宽度和高度(单位像素)。
-
<e1lipse>标签用于绘制椭圆。
<svg width="300" height="180"> <e1lipse cx="60"cy="60" ry="40"rx="20" stroke="black" stroke-width="5" fi11="silver" /> </svg>
<e1lipse>的cx属性和cy属性,指定了椭圆中心的横坐标和纵坐标(单位像素); rx属性和ry属性,指定了椭圆横向轴和纵向轴的半径(单位像素)。
-
<po1ygon>标签用于绘制多边形。
<svg width="300" height="180"> <polygon fil1="green" stroke="orange" stroke-width="1" points="0,0 100,0 100,100 0,1000,0"/> </svg>
<polygon>的points属性指定了每个端点的坐标,横坐标与纵坐标之间与逗号分隔,点与点之间用空格分隔。
-
<path>标签用于制路径。
<svg width="300" height="180"> <path d="M18,3L46,3L 46,40L 61,40L 32,68L3,40L 18,40z"></path> </svg>
<path>的d属性表示绘制顺序,它的值是一个长字符串,每个字母表示一个绘制动作,后面跟着坐标。
-
M = moveto 起始
-
L = lineto 连线
-
H = horizontal lineto 水平线
-
V = vertical lineto 垂直线
-
C = curveto 三次贝塞尔曲线
-
S = smooth curveto 三次贝塞尔曲线
-
Q = quadratic Bézier curve 二次贝塞尔曲线
-
T = smooth quadratic Bézier curveto 二次贝塞尔曲线
-
A = elliptical Arc 椭圆弧
-
Z = closepath 闭合(从最后一个点连直线到起始点)
使用大写字母表示绝对位置,小写字母表示相对位置(相对于起点的位置,向右向下为正)。
-
<text>标签用于绘制文本。
<svg width="300" height="180"> <text x="50" y="25">He11o wor1d</text> </svg>
x属性和y属性,表示文本区块基线( baseline )起点的横坐标和纵坐标。文字的样式可以用class或style属性指定。
-
<use>标签用于复制一个形状。
<svg viewBox="0 0 30 10" xm71ns="http: / / www.w3.org/2000/svg"> <circle id="mycircle" cx="5" cy="5" r="4"/> <use href="#myCircle" x="10" y="0"fi11="blue"/> <use href="#myCircle" x="20" y="O" fi11="white" stroke="blue"/> </svg>
href属性指定所要复制的节点,x属性和y属性是左上角的坐标。另外,还可以指定width和height。
-
<g>标签用于将多个形状组成一个组( group ),方便复用。
<svg width=" 300" height="100"> <g id="myCircle"> <text x="25" y="20"></text> <circle cx="50"cy="50" r="20" /> </g> <use href="#myCircle" x="100"y="0" fi11="b1ue"/> <use href="#myCircle" x="200"y="0" fi11="white" stroke="blue"/> </svg>
-
<defs>标签用于自定义形状,它的图形不会显示在页面上,仅供引用。
<svg width="300" height="100"> <defs> <g id="myCircle"> <text x="25" y="20">圆形</text><circle cx="50" cy="50" r="20"/></g> </defs> <use href="#myCircle" x="0"y="0"/> <use href="#mycircle" x="100" y="0" fi11="blue"/> <use href="#myCircle" x="200" y="0" fi11="white" stroke="blue"/> </svg>
-
<pattern>标签用于自定义一个形状,该形状可以被引用来平铺一个区域。
<svg width="500" height="500"> <defs> <pattern id="dots" x="0" y="o" width="100" height="100" patternUnits="userSpaceonuse"> <circle fi11="#bee9e8" cx="50"cy="50"r="35"/></pattern> </defs> <rect x="O"y="o" width="100%" height="100%" fi11="ur1(#dots)"/> </svg>
上面代码中,<pattern>标签将一个圆形定义为dots模式。patternUnits="userSpaceOnUse"表示<pattern>的宽度和长度是实际的像素值。然后,指定这个模式去填充下面的矩形。
-
<image>标签用于插入图片文件。
<svg viewBox="0 0 100 100"width="100" height="100"> <image xlink :href="path/to/image.jpg" width="50%" height="50%"/> </svg>
上面代码中,<image>的xlink:href属性表示图像的来源。
-
<animate>标签用于产生动画效果
<svg width="500px" height="500px"> <rect x="0" y="0" width="100" height="100"fi11="#feac5e"> <animate attributeName="x" from="o” to=""500"dur="2s" repeatcount="indefinite"/></rect> </svg>
上面代码中,矩形会不断移动,产生动画效果。animate的属性含义如下。
-
attributeName:发生动画效果的属性名。
-
from:单次动画的初始值。
-
to:单次动画的结束值。
-
dur:单次动画的持续时间。
-
repeatCount:动画的循环模式。
可以在多个属性上面定义动画。
<animate attributeName="x" from="O" to="500" dur="2s" repeatCount="indefinite"/> <animate attributeName="width" to="500"dur="2s" repeatCount="indefinite"/>
-
<animate>标签对CSS的transform属性不起作用,如果需要变形,就要使用<animateTransform>标签。
<svg width="500px" height="500px"> <rect x="250" y="250" width="50" height="50" fi71="#4bcOc8"> <animateTransform attributeName="transform" type="rotate" begin="0s" dur="10s"from="0 200 200" to="360 400 400" repeatcount="indefinite"/> </rect> </svg>
上面代码中,<animateTransform>的效果为旋转( rotate ),这时from和to属性值有三个数字,第一个数字是角度值,第二个值和第三个值是旋转中心的坐标。from="0 200200"表示开始时,角度为0,围绕(200,200)开始旋转; to=""360 400 400"表示结束时,角度为360,围绕(400,400)旋转。
JS操作
-
DOM操作:获取标签,监听操作
-
如果使用iframe、object等形式引入的SVG,要SVG操作的话
var svgobject = document.getElementById( 'object ' ).contentDocument; var svgiframe = document.getElementById('iframe ' ).contentDocument; var svgEmbed = document.getElementById( ' embed ' ).getsVGDocument();
注意,如果使用<img>标签插入SVG文件,就无法获取SVG DOM。
Canvas
HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像。画布是一个矩形区域,您可以控制其每一像素。canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。
SVG和Canvas
SVG | Canvas | |
---|---|---|
特点 | XML矢量图绘制 | JS像素点(位图)绘制 |
性能 | 基于DOM,大量渲染会卡顿 | 基于画布,需要重绘,但是可以调用GPU |
元素 | 多个元素 | 单个HTML元素 |
事件 | 基于DOM,可为某个元素触发事件 | 基于Canvas标签,像素点交互 |
简洁性 | 标签写法,可用CSS,书写简单 | 画笔描绘,相对复杂 |