基础内容
1. 什么是 SVG
SVG 全称为 Scalable Vector Graphics,译为可缩放矢量图形,简称矢量图。是一种用来描述二维矢量图形的 XML 标记语言。
2. SVG与Flash的区别
|
SVG |
Flash |
| 相同点 |
用于二维矢量图形 |
用于二维矢量图形 |
| 不同点 |
是一个开放的W3C标准,基于XML |
封闭的基于二进制格式的 |
3. SVG与Canvas的区别
| SVG |
Canvas |
| 不依赖于分辨率 |
依赖于分辨率 |
| 使用DOM及事件处理器(DOM专门为SVG开放接口) |
不能使用DOM及事件处理器 |
| 不能实现游戏开发 |
可以实现游戏开发 |
| 实现大型渲染区域的应用(例如百度地图) |
是以图片(png |
4. SVG的优势
- 不需要专门的编辑器,文本编辑器都可以
- 可被搜索、索引、脚本化及压缩
- 图像不失真(和分辨率无关)
值得注意的是:
- SVG技术并不是专属于HTML5的
- SVG技术本身是一套独立的用于描述二维图形
- HTML5版本之前,以图片形式进行引入
- HTML5版本之后,允许在HTML页面直接使用SVG技术
可参考的资源:
5. 如何使用 SVG
1)SVG 文件(了解)
SVG 文件的扩展名为 “.svg”,使用的是 XML 技术的语法内容,并且可以在浏览器中直接运行。
1 2 3 4 5 6 7
| <?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"> <rect x="100" y="100" width="300" height="100" fill="blue" stroke="black" stroke-width="4"/> </svg>
|
也可以在 HTML 页面引入 SVG 文件。
1
| <img src="/note_image/HTML/html5/01_SvgFile.svg" width="800" height="500">
|
2)HTML 直接定义 SVG
HTML5 的新特性允许在 HTML 页面中直接定义 SVG 元素(需要学习有关SVG的一些HTML新元素)。
<svg>元素:
|
<svg>元素 |
| 作用 |
类似于canvas元素 |
| 特点 |
默认的宽度和高度分别为300px和150px,不具有任何的样式(默认情况下不显示) |
| 目的 |
表示当前使用SVG语法内容 |
<svg>元素的属性:
| 属性名称 |
描述 |
| width |
设置 <svg> 元素的宽度 |
| height |
设置 <svg> 元素的高度 |
| style |
设置 <svg> 元素的样式 |
1 2 3
| <svg width="500" height="300" style="background:pink;"> <rect x="100" y="100" width="300" height="100" fill="blue" stroke="black" stroke-width="4"/> </svg>
|
图像元素
1. 样式
| 属性名称 |
描述 |
| fill |
设置填充样式 |
| stroke |
设置描边样式 |
| stroke-width |
设置描边宽度 |
2. 矩形
1
| <rect x="" y="" rx="" ry="" width="" height="" />
|
| 属性名称 |
描述 |
| x和y |
表示绘制矩形的左上角坐标值 |
| width |
表示绘制矩形的宽度 |
| height |
表示绘制矩形的高度 |
| rx和ry |
表示绘制矩形的四个角的水平圆角和垂直圆角(如果rx和ry的值分别为width/2和height/2,绘制圆形) |
值得注意的是:
- 默认绘制出来的效果:实心矩形效果。
- 可以实现”空心”的效果:不能实现空心效果。
1 2 3 4 5 6 7
| <svg width="1000" height="600" style="background:pink;"> <rect x="10" y="10" width="100" height="100" /> <rect x="10" y="120" width="100" height="100" fill="white" stroke="black" /> <rect x="10" y="230" width="100" height="100" rx="10" ry="10" /> <rect x="10" y="340" width="100" height="100" rx="50" ry="50" style="fill:white;stroke:black;" /> </svg>
|
3. 圆形
1
| <cirlcle cx="" cy="" r="" />
|
| 属性名称 |
描述 |
| cx和cy |
表示绘制圆形的圆心坐标值 |
| r |
表示绘制圆形的半径 |
1 2 3 4 5
| <svg width="1000" height="600" style="background:pink;"> <circle cx="170" cy="60" r="50" /> <circle cx="170" cy="170" r="50" fill="white" stroke="black" /> </svg>
|
4. 椭圆
1
| <ellipse cx="" cy="" rx="" ry="" />
|
| 属性名称 |
描述 |
| cx和cy |
表示绘制椭圆的圆心坐标值 |
| rx |
表示绘制椭圆的水平方向半径 |
| ry |
表示绘制椭圆的垂直方向半径 |
1 2 3 4 5 6
| <svg width="1000" height="600" style="background:pink;"> <ellipse cx="280" cy="70" rx="50" ry="60" /> <ellipse cx="280" cy="190" rx="50" ry="50" /> <ellipse cx="280" cy="300" rx="50" ry="30" /> </svg>
|
5. 线条
1
| <line x1="" y1="" x2="" y2="" stroke="" />
|
| 属性名称 |
描述 |
| x1和y1 |
表示绘制直线的起点坐标值 |
| x2和y2 |
表示绘制直线的终点坐标值 |
| stroke |
设置绘制直线的样式(颜色) |
| stroke-width |
设置绘制直线的宽度 |
1 2 3 4
| <svg width="1000" height="600" style="background:pink;"> <line x1="350" y1="10" x2="500" y2="200" stroke="black" stroke-width="10" /> </svg>
|
6. 折线
| 属性名称 |
描述 |
| points |
表示绘制折线的起点、折点及终点坐标值(格式:x1,y1 x2,y2 x3,y3 xn,yn) |
| stroke |
设置折线的颜色 |
| stroke-width |
设置折线的线宽 |
| fill |
设置与<svg>元素的背景色相同 |
1 2 3 4 5
| <svg width="1000" height="600" style="background:pink;"> <polyline points="520,20 520,200" stroke="black" stroke-width="10" /> <polyline points="550,20 550,200 700,200 700,20 540,20" stroke="black" stroke-width="20" fill="pink" /> </svg>
|
7. 多边形
| 属性名称 |
描述 |
| points |
表示绘制多边形的所有点坐标值 |
1 2 3 4
| <svg width="1000" height="600" style="background:pink;"> <polygon points="550,300 550,500 800,500" stroke="black" fill="pink" stroke-width="10" /> </svg>
|
值得注意的是:
- 一个HTML页面允许包含多个
<svg>元素
- 一个
<svg>元素允许包含多个图形元素
- SVG的图形元素基本都是起始元素
- 定义图形元素时,只定义开始元素,没有结束元素
- 浏览器在运行页面时,并不报错
- 浏览器解析这段元素代码时,自动补全结束元素
- 自动补全的结束元素是不正确的
8. 渐变
1)线性渐变
1
| <linearGradient id="" x1="" y1="" x2="" y2=""></linearGradient>
|
| 属性名称 |
描述 |
| id |
标识,便于其他元素进行引用 |
| x1和y1 |
表示基准线的起点坐标值(值范围为 0-1, 是百分值 0%-100%) |
| x2和y2 |
表示基准线的终点坐标值(值范围为 0-1, 是百分值 0%-100%) |
1
| <stop offset="" stop-color=""/>
|
| 属性名称 |
描述 |
| offset |
表示设置渐变颜色的位置 |
| stop-color |
表示设置的渐变颜色 |
| stop-opacity |
表示设置渐变颜色的透明度 |
1 2 3 4 5 6 7 8 9 10 11
| <svg width="800" height="500"> <defs> <linearGradient id="grd" x1="0" y1="0" x2="1" y2="1"> <stop offset="0" stop-color="red" stop-opacity="0.5" /> <stop offset="0.5" stop-color="green" stop-opacity="0.5" /> <stop offset="1" stop-color="blue" stop-opacity="0.5" /> </linearGradient> </defs> <rect x="0" y="0" width="200" height="200" fill="url(#grd)" /> <circle cx="400" cy="400" r="100" fill="url(#grd)" /> </svg>
|
2)射线渐变
1
| <radialGradient id="" cx="" cy="" r="" fx="" fy=""></radialGradient>
|
| 属性名称 |
描述 |
| id |
标识,便于其他元素进行引用 |
| cx和cy |
表示基准线中的中心点坐标值(值范围为 0-1, 是百分值 0%-100%) |
| fx和fy |
表示基准线中的焦点坐标值(值范围为 0-1, 是百分值 0%-100%) |
| r |
设置其边缘位置(值范围为 0-1, 是百分值 0%-100%) |
1
| <stop offset="" stop-color=""/>
|
| 属性名称 |
描述 |
| offset |
表示设置渐变颜色的位置 |
| stop-color |
表示设置的渐变颜色 |
| stop-opacity |
表示设置渐变颜色的透明度 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| <svg width="800" height="500"> <defs> <radialGradient id="grd1"> <stop offset="0" stop-color="red" /> <stop offset="1" stop-color="blue" /> </radialGradient> <radialGradient id="grd2" cx="0" cy="0"> <stop offset="0" stop-color="red" /> <stop offset="1" stop-color="blue" /> </radialGradient> <radialGradient id="grd3" r="1"> <stop offset="0" stop-color="red" /> <stop offset="1" stop-color="blue" /> </radialGradient> <radialGradient id="grd4" fx="1" fy="1"> <stop offset="0" stop-color="red" /> <stop offset="1" stop-color="blue" /> </radialGradient> <radialGradient id="grd5"> <stop offset="0" stop-color="red" /> <stop offset="0.5" stop-color="yellow" /> <stop offset="1" stop-color="blue" /> </radialGradient> <radialGradient id="grd6" cx="0" cy="0"> <stop offset="0" stop-color="red" /> <stop offset="0.5" stop-color="yellow" /> <stop offset="1" stop-color="blue" /> </radialGradient> <radialGradient id="grd7" r="1"> <stop offset="0" stop-color="red" /> <stop offset="0.5" stop-color="yellow" /> <stop offset="1" stop-color="blue" /> </radialGradient> <radialGradient id="grd8" fx="1" fy="1"> <stop offset="0" stop-color="red" /> <stop offset="0.5" stop-color="yellow" /> <stop offset="1" stop-color="blue" /> </radialGradient> </defs> <rect x="0" y="0" width="200" height="200" fill="url(#grd1)" /> <rect x="210" y="0" width="200" height="200" fill="url(#grd2)" /> <rect x="420" y="0" width="200" height="200" fill="url(#grd3)" /> <rect x="630" y="0" width="200" height="200" fill="url(#grd4)" /> <rect x="0" y="210" width="200" height="200" fill="url(#grd5)" /> <rect x="210" y="210" width="200" height="200" fill="url(#grd6)" /> <rect x="420" y="210" width="200" height="200" fill="url(#grd7)" /> <rect x="630" y="210" width="200" height="200" fill="url(#grd8)" /> </svg>
|
值得注意的是:
- 渐变元素需要定义id属性,便于其他元素进行引用
- 渐变元素定义在元素内
9. 滤镜
1
| <filter id="myfilter"></filter>
|
**值得注意的是:**该元素只是滤镜的容器。
高斯模糊
1
| <feGaussianBlur in="" stdDeviation="" />
|
| 属性名称 |
描述 |
| in |
设置高斯模糊的样式 |
| stdDeviation |
设置模糊的程度 |
1 2 3 4 5 6 7 8
| <svg width="800" height="500"> <defs> <filter id="myfilter"> <feGaussianBlur in="SourceGraphic" stdDeviation="5" /> </filter> </defs> <rect x="100" y="100" width="100" height="100" filter="url(#myfilter)" /> </svg>
|
Two.js库
1. 基础内容
Two.js支持不同的上下文环境:
官网地址:http://jonobr1.github.io/two.js/
如何使用 Two.js
1)HTML 页面
- 引入Two.js库文件
- 定义容器元素
<div></div>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>如何使用Two.js库</title> <script src="two.js"></script> </head> <body>
<div id="d1"></div> </body> </html>
|
2)JavaScript逻辑
- 获取HTML页面的容器元素
- 通过 Two.js 库提供的 Two() 构造函数创建 Two 对象
1 2 3 4 5
| var params = { width : 宽度, height : 高度 } var two = new Two(params);
|
- 将创建的 Two 对象添加到 HTML 页面容器元素内
- 使用 Two.js 库提供的 API 方法绘制图形
- 调用 update() 方法进行绘制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>如何使用Two.js库</title> <script src="two.js"></script> </head> <body>
<div id="d1"></div> <script> var elem = document.getElementById("d1");
var params = { type : Two.Types.canvas, width : 285, height : 200 }; var two = new Two(params);
two.appendTo(elem); var circle = two.makeCircle(72, 100, 50); var rect = two.makeRectangle(213, 100, 100, 100); two.update(); </script> </body> </html>
|
2. 绘制图像
1)绘制图像的方法
| 图像形状 |
方法 |
| 圆形 |
makeCircle(x, y, radius) |
| 直线 |
makeLine(x1, y1, x2, y2) |
| 矩形 |
makeRectangle(x, y, width, height) |
| 圆角矩形 |
makeRoundedRectangle(x, y, width, height, radius) |
| 椭圆 |
makeEllipse(x, y, width, height) |
| 多边形 |
makePolygon(ox, oy, r, sides) |
| 路径 |
makePath(x1, y1, x2, y2, xN, yN, open) |
| 星形 |
makeStar(ox, oy, or, ir, sides) |
2)绘制图像的属性
| 属性名称 |
描述 |
| fill |
设置填充样式 |
| stroke |
设置描边样式 |
| linewidth |
设置线条宽度 |
| opacity |
设置透明度 |
| cap |
设置线条端点形状,默认为round |
| join |
设置线条交点形状,默认为round |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>如何使用Two.js库</title> <script src="two.js"></script> </head> <body> <div id="d1"></div> <script> var elem = document.getElementById("d1");
var params = { type : Two.Types.canvas, width : 285, height : 200 }; var two = new Two(params);
two.appendTo(elem);
var circle = two.makeCircle(72, 100, 50); var rect = two.makeRectangle(213, 100, 100, 100); circle.fill = '#FF8000'; circle.stroke = 'orangered'; circle.linewidth = 5;
rect.fill = 'rgb(0, 200, 255)'; rect.opacity = 0.75; rect.noStroke();
two.update(); </script> </body> </html>
|
3. 图像分组
调用 Two 对象的 makeGroup() 方法对图像进行分组操作。
- makeGroup() 方法任意图形对象作为参数
- makeGroup() 方法返回分组对象
**值得注意的是:**在统一对一组图像设置后,针对不同图像进行个性化设置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Two.js库进行图形分组</title> <script src="two.js"></script> </head> <body> <div id="d1"></div> <script> var elem = document.getElementById("d1"); var two = new Two({ width : 285, height : 200 }).appendTo(elem);
var circle = two.makeCircle(72, 100, 50); var rect = two.makeRectangle(213, 100, 100, 100);
var group = two.makeGroup(circle,rect);
group.fill = 'rgb(0, 200, 255)'; group.opacity = 0.75; group.noStroke();
circle.stroke = 'orangered'; circle.linewidth = 5;
two.update(); </script> </body> </html>
|
4. 动画效果(了解)
| 方法名称 |
描述 |
| play() |
提供一组循环动画 |
| pause() |
提供中止动画效果 |
| update() |
提供更新当前绘制或设置 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Two.js库实现动画效果</title> <script src="two.js"></script> </head> <body> <div id="d1"></div> <script> var elem = document.getElementById("d1"); var two = new Two({ width : 285, height : 200 }).appendTo(elem); var circle = two.makeCircle(-70, 0, 50); var rect = two.makeRectangle(70, 0, 100, 100); circle.fill = '#FF8000'; rect.fill = 'rgba(0, 200, 255, 0.75)'; var group = two.makeGroup(circle, rect); group.translation.set(two.width / 2, two.height / 2); group.scale = 0; group.noStroke();
two.bind('update', function(frameCount) { if (group.scale > 0.9999) { group.scale = group.rotation = 0; } var t = (1 - group.scale) * 0.125; group.scale += t; group.rotation += t * 4 * Math.PI; }).play(); </script> </body> </html>
|