什么是SVG?
引用w3c
的一段话就是:
SVG 指可伸缩矢量图形 (Scalable Vector Graphics)
SVG 用来定义用于网络的基于矢量的图形
SVG 使用 XML 格式定义图形
SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失
PS:`SVG` 在IE9以及`Firefox`和`chrome`下都支持
segmentFault
的logo
就是一个svg
的实例,大家可以在页面上通过鼠标右键,然后点“查看页面信息”,找到媒体,然后找到那张svg
格式的logo
将其另存为看看:
这就是那段svg
代码:
SVG 代码以 <svg>
元素开始,包括开启标签 <svg>
和关闭标签 </svg>
。
SVG
有一些预定义的形状元素,可被开发者使用和操作:
矩形 <rect>
圆形 <circle>
椭圆 <ellipse>
线 <line>
折线 <polyline>
多边形 <polygon>
路径 <path>
矩形rect
圆形circle
椭圆ellipse
线line
折线polyline
多边形 polygon
path 标签
标签用来定义路径。
下面的命令可用于路径数据:
M = moveto
L = lineto
H = horizontal lineto
V = vertical lineto
C = curveto
S = smooth curveto
Q = quadratic Belzier curve
T = smooth quadratic Belzier curveto
A = elliptical Arc
Z = closepath
注释:以上所有命令均允许小写字母。大写表示绝对定位,小写表示相对定位。
基本操作API
创建图形
document.createElementNS(ns,tagName);
添加图形
element.appendChild(childElement);
设置/获取属性
element.setAttribute(name,value);
element.getAttribute(name);
canvas
同样,IE9之前的浏览器都不支持<canvas>
元素,canvas
和SVG
的主要区别是:使用canvas
绘制图形是通过调用其API,而SVG
则是通过构建一棵XML
元素树来实现的。
canvas的API
颜色、样式和阴影属性和方法
属性 |
描述 |
fillStyle |
设置或返回用于填充绘画的颜色、渐变或模式 |
strokeStyle |
设置或返回用于笔触的颜色、渐变或模式 |
shadowColor |
设置或返回用于阴影的颜色 |
shadowBlur |
设置或返回用于阴影的模糊级别 |
shadowOffsetY |
设置或返回阴影距形状的垂直距离 |
shadowOffsetX |
设置或返回阴影距形状的水平距离 |
ctx.shadowOffsetX = 10; // 设置水平位移
ctx.shadowOffsetY = 10; // 设置垂直位移
ctx.shadowBlur = 5; // 设置模糊度
ctx.shadowColor = "rgba(0,0,0,0.5)"; // 设置阴影颜色
ctx.fillStyle = "#CC0000";
ctx.fillRect(10,10,200,100);
方法 |
描述 |
createLinearGradient() |
创建线性渐变(用在画布内容上) |
createPattern() |
在指定的方向上重复指定的元素 |
createRadialGradient() |
创建放射状/环形的渐变(用在画布内容上) |
addColorStop() |
规定渐变对象中的颜色和停止位置 |
canvas主要属性和方法
属性 |
描述 |
save() |
保存当前环境的状态 |
restore() |
返回之前保存过的路径状态和属性 |
createEvent() |
|
getContext() |
返回一个对象,指出访问绘图功能必要的API |
toDataURL() |
返回canvas图像的URL |
canvas线条样式属性和方法
属性 |
描述 |
lineCap |
设置或返回线条的结束端点样式 |
lineJoin |
设置或返回两条线相交时,所创建的拐角类型 |
lineWidth |
设置或返回当前的线条宽度 |
miterLimit |
设置或返回最大斜接长度 |
矩形方法
方法 |
描述 |
rect() |
创建矩形 |
fillRect() |
绘制"被填充"的矩形 |
strokeRect() |
绘制矩形(无填充) |
clearRect() |
在给定的矩形内清除指定的像素 |
路径方法
方法 |
描述 |
fill() |
填充当前绘图(路径) |
stroke() |
绘制已定义的路径 |
beginPath() |
起始一条路径,或重置当前路径 |
moveTo() |
把路径移动到画布中的指定点,不创建线条 |
closePath() |
创建从当前点回到起始点的路径 |
lineTo() |
添加一个新点,创建从该点到最后指定点的线条 |
clip() |
从原始画布剪切任意形状和尺寸的区域 |
quadraticCurveTo() |
创建二次贝塞尔曲线 |
bezierCurveTo() |
创建三次方贝塞尔曲线 |
arc() |
创建弧/曲线(用于创建圆形或部分圆) |
arcTo() |
创建两切线之间的弧/曲线 |
isPointInPath() |
如果指定的点位于当前路径中,返回布尔值 |
var canvas = document.getElementById('myCanvas');
if (canvas.getContext) {
var ctx = canvas.getContext('2d');
}
ctx.beginPath(); // 开始路径绘制
ctx.moveTo(20, 20); // 设置路径起点,坐标为(20,20)
ctx.lineTo(200, 20); // 绘制一条到(200,20)的直线
ctx.lineWidth = 1.0; // 设置线宽
ctx.strokeStyle = "#CC0000"; // 设置线的颜色
ctx.stroke(); // 进行线的着色,这时整条线才变得可见
转换方法
方法 |
描述 |
scale() |
缩放当前绘图至更大或更小 |
rotate() |
旋转当前绘图 |
translate() |
重新映射画布上的 (0,0) 位置 |
transform() |
替换绘图的当前转换矩阵 |
setTransform() |
将当前转换重置为单位矩阵。然后运行 transform() |
文本属性和方法
属性 |
描述 |
font |
设置或返回文本内容的当前字体属性 |
textAlign |
设置或返回文本内容的当前对齐方式 |
textBaseline |
设置或返回在绘制文本时使用的当前文本基线 |
方法 |
描述 |
fillText() |
在画布上绘制"被填充的"文本 |
strokeText() |
在画布上绘制文本(无填充) |
measureText() |
返回包含指定文本宽度的对象 |
// 设置字体
ctx.font = "Bold 20px Arial";
// 设置对齐方式
ctx.textAlign = "left";
// 设置填充颜色
ctx.fillStyle = "#008600";
// 设置字体内容,以及在画布上的位置
ctx.fillText("Hello!", 10, 50);
// 绘制空心字
ctx.strokeText("Hello!", 10, 100);
图像绘制方法
方法 |
描述 |
drawImage() |
向画布上绘制图像、画布或视频 chrome不支持 |
像素操作方法和属性
属性 |
描述 |
width |
返回 ImageData 对象的宽度 |
height |
返回 ImageData 对象的高度 |
data |
返回一个对象,其包含指定的 ImageData 对象的图像数据 |
方法 |
描述 |
createImageData() |
创建新的、空白的 ImageData 对象 |
getImageData() |
返回 ImageData 对象,该对象为画布上指定的矩形复制像素数据 |
putImageData() |
把图像数据(从指定的 ImageData 对象)放回画布上 |
图像合成属性
属性 |
描述 |
globalAlpha |
设置或返回绘图的当前 alpha 或透明值 |
globalCompositeOperation |
设置或返回新图像如何绘制到已有的图像上 |
何时使用 canvas、何时使用 SVG?
从性能方面选择
性能对于高流量的网站来说是绝对关键的。虽然 Canvas
通常被视为具有高性能,但是并不意味着它就是明显的选择。下图显示了 SVG
对象和 Canvas
对象之间在呈现时间上的差异。
一般情况下,随着屏幕大小的增大,画布将开始降级,因为需要绘制更多的像素。随着屏幕上的对象数目增多,SVG
将开始降级,因为我们正不断将这些对象添加到 DOM
中。这些度量不一定准确,以下方面的不同一定会引起变化:实现和平台、是否使用完全硬件加速的图形,以及 js
引擎的速度。
下图展示了适合用于canvas
的场景以及svg
的适合场景:
Canvas
是逐像素进行渲染的。在 SVG
中,每个被绘制的图形均被视为对象。如果 SVG
对象的属性发生变化,那么浏览器能够自动重现图形。
Canvas
依赖分辨率
不支持事件处理器
弱的文本渲染能力
能够以 .png 或 .jpg 格式保存结果图像
最适合图像密集型的游戏,其中的许多对象会被频繁重绘
SVG
不依赖分辨率
支持事件处理器
最适合带有大型渲染区域的应用程序(比如谷歌地图)
复杂度高会减慢渲染速度(任何过度使用 DOM 的应用都不快)
不适合游戏应用
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。