什么是SVG?
引用w3c
的一段话就是:
SVG 指可伸缩矢量图形 (Scalable Vector Graphics)
SVG 用来定义用于网络的基于矢量的图形
SVG 使用 XML 格式定义图形
SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失
PS:`SVG` 在IE9以及`Firefox`和`chrome`下都支持
segmentFault
的logo
就是一个svg
的实例,大家可以在页面上通过鼠标右键,然后点“查看页面信息”,找到媒体,然后找到那张svg
格式的logo
将其另存为看看:
这就是那段svg
代码:
![图片描述](https://i-blog.csdnimg.cn/blog_migrate/285faba1a453e7d6991f933c43d9a399.jpeg)
SVG 代码以 <svg>
元素开始,包括开启标签 <svg>
和关闭标签 </svg>
。
SVG
有一些预定义的形状元素,可被开发者使用和操作:
矩形 <rect>
圆形 <circle>
椭圆 <ellipse>
线 <line>
折线 <polyline>
多边形 <polygon>
路径 <path>
矩形rect
![图片描述](https://i-blog.csdnimg.cn/blog_migrate/68bff3a5d7f4a296094cf4cb85789622.jpeg)
圆形circle
![图片描述](https://i-blog.csdnimg.cn/blog_migrate/c1ca16632e8f555ab5dbcf9d915be05c.jpeg)
椭圆ellipse
![图片描述](https://i-blog.csdnimg.cn/blog_migrate/1087f84fa4b6f1d73a5826daad19cbe3.jpeg)
线line
![图片描述](https://i-blog.csdnimg.cn/blog_migrate/63517c8000d333fd9a751d34b74fc391.jpeg)
折线polyline
![图片描述](https://i-blog.csdnimg.cn/blog_migrate/d827c29ec852f92aaedd00fa91f5b4a5.jpeg)
多边形 polygon
![图片描述](https://i-blog.csdnimg.cn/blog_migrate/a8ea0da7812dc88ada5eb976a79a7bdc.jpeg)
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
对象之间在呈现时间上的差异。
![图片描述](https://i-blog.csdnimg.cn/blog_migrate/2ba0a88f1693485a7c5758969250e94e.png)
一般情况下,随着屏幕大小的增大,画布将开始降级,因为需要绘制更多的像素。随着屏幕上的对象数目增多,SVG
将开始降级,因为我们正不断将这些对象添加到 DOM
中。这些度量不一定准确,以下方面的不同一定会引起变化:实现和平台、是否使用完全硬件加速的图形,以及 js
引擎的速度。
下图展示了适合用于canvas
的场景以及svg
的适合场景:
![图片描述](https://i-blog.csdnimg.cn/blog_migrate/7152ae40a50bcf7a3ca51e53db7d329c.png)
Canvas
是逐像素进行渲染的。在 SVG
中,每个被绘制的图形均被视为对象。如果 SVG
对象的属性发生变化,那么浏览器能够自动重现图形。
Canvas
依赖分辨率
不支持事件处理器
弱的文本渲染能力
能够以 .png 或 .jpg 格式保存结果图像
最适合图像密集型的游戏,其中的许多对象会被频繁重绘
SVG
不依赖分辨率
支持事件处理器
最适合带有大型渲染区域的应用程序(比如谷歌地图)
复杂度高会减慢渲染速度(任何过度使用 DOM 的应用都不快)
不适合游戏应用