<figure>
<img src="pic_mountain.jpg" alt="The Pulpit Rock" width="304" height="228">
<figcaption>Fig1. - The Pulpit Pock, Norway.</figcaption>
</figure>
canvas
<canvas id="myCanvas" width="200" height="100"></canvas>
canvas 元素本身是没有绘图能力的。所有的绘制工作必须在 JavaScript 内部完成:
//JavaScript 使用 id 来寻找 canvas 元素:
var canva = document.getElementById("myCanvas");
//创建 context 对象
var ctx = canva.getContext("2d");
//下面的两行代码绘制一个红色的矩形:
ctx.fillStyle = "#ff0000"; // 设置颜色
ctx.fillRect(0,0,150,75); // 把(0,0)位置大小为150x75的矩形涂色
Canvas的坐标系统:
Canvas的坐标以左上角为原点,水平向右为X轴,垂直向下为Y轴,以像素为单位,所以每个点都是非负整数。
绘制形状
名称 | 用途 | demo |
---|---|---|
fillStyle | 设置填充颜色 | ctx.fillStyle = “#ff0000”; |
fillRect |
绘制矩形 | ctx.fillRect(0,0,150,75); |
clearRect | 擦除矩形,擦除的意思是把该区域变为透明 | ctx.clearRect(0,0,150,75); |
绘制文本
名称 | 用途 | demo |
---|---|---|
shadowOffsetX | 水平方向的阴影 | ctx.shadowOffsetX = 2 |
shadowOffsetY | ctx.shadowOffsetY = 2; | |
shadowBlur | 模糊的距离 | ctx.shadowBlur = 2; |
shadowColor |
阴影color | ctx.shadowColor = ‘#666666’; |
font | 字体 | ctx.font = ‘24px Arial’; |
fillText | 绘制文本 | ctx.fillText(‘带阴影的文字’, 20, 40); |
3D WebGL
getContext('2d')
方法让我们拿到一个CanvasRenderingContext2D
对象,所有的绘图操作都需要通过这个对象完成,如果需要绘制3D怎么办?HTML5还有一个WebGL规范,允许在Canvas中绘制3D图形:
gl = canva.getContext("webgl");
svg
1.html直接插入svg
<!DOCTYPE html>
<html>
<body>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="190">
<polygon points="100,10 40,180 190,60 10,60 160,180"
style="fill:lime;stroke:purple;stroke-width:5;fill-rule:evenodd;" />
</svg>
</body>
</html>
2.SVG 文件可通过以下标签嵌入 HTML 文档:、
<!DOCTYPE html>
<html>
<body>
<embed src="rect1.svg" width="300" height="100" type="image/svg+xml" />
<br/>
<object data="rect1.svg" width="300" height="100" type="image/svg+xml" />
<br/>
<iframe src="rect1.svg" width="300" height="100"></iframe>
</body>
</html>
rect1.svg**
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<rect width="300" height="100" style="fill:lime;stroke-width:3;stroke:green"/>
</svg>
svg形状
- 矩形
- 圆形
- 椭圆
- 线
- 折线
- 多边形
- 路径
矩形rect
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<rect x="20" y="20" rx="20" ry="20" width="250" height="250"
style="fill:blue;stroke:pink;stroke-width:5;
fill-opacity:0.1;stroke-opacity:0.9"/>
</svg>
- x 属性定义矩形的左侧位置(例如,x=”0” 定义矩形到浏览器窗口左侧的距离是 0px)
- y 属性定义矩形的顶端位置(例如,y=”0” 定义矩形到浏览器窗口顶端的距离是 0px)
- rx 和 ry 属性可使矩形产生圆角。
- rect 元素的 width 和 height 属性可定义矩形的高度和宽度
- style属性用来定义 CSS 属性: | fill | 填充色 | fill:lime; | | —- | —- | —- | | stroke | 笔画边框颜色 | stroke:green; | | stroke-width | 笔画边框宽度 | stroke-width:3; |
圆形circle
<circle cx="100" cy="50" r="40" stroke="black"
stroke-width="2" fill="red"/>
- cx 和 cy 属性定义圆点的 x 和 y 坐标。如果省略 cx 和 cy,圆的中心会被设置为 (0, 0)
椭圆 ellipse
<ellipse cx="300" cy="150" rx="200" ry="80"
style="fill:rgb(200,100,50);
stroke:rgb(0,0,100);stroke-width:2"/>
- cx 属性定义圆点的 x 坐标
- cy 属性定义圆点的 y 坐标
- rx 属性定义水平半径
- ry 属性定义垂直半径
线条line
<line x1="0" y1="0" x2="300" y2="300"
style="stroke:rgb(99,99,99);stroke-width:2"/>
- x1,y1 线条起点的xy(横纵)坐标
- x2,y2 线条终点的xy(横纵)坐标
多边形polygon
<polygon points="220,100 300,210 170,250"
style="fill:#cccccc;
stroke:#000000;stroke-width:1"/>
- points 属性定义多边形每个角的 x 和 y 坐标
折线polyline
<polyline points="0,0 0,20 20,20 20,40 40,40 40,60"
style="fill:white;stroke:red;stroke-width:2"/>
points 属性定义每个点的 x 和 y 坐标
路径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
注释:以上所有命令均允许小写字母。大写表示绝对定位,小写表示相对定位。
<path d="M250 150 L150 350 L350 350 Z" />
上面的例子定义了一条路径,它开始于位置 250 150,到达位置 150 350,然后从那里开始到 350 350,最后在 250 150 关闭路径。
由于绘制路径的复杂性,因此强烈建议您使用 SVG 编辑器来创建复杂的图形
svg滤镜
在 SVG 中,可用的滤镜有:
- feBlend
- feColorMatrix
- feComponentTransfer
- feComposite
- feConvolveMatrix
- feDiffuseLighting
- feDisplacementMap
- feFlood
- feGaussianBlur
- feImage
- feMerge
- feMorphology
- feOffset
- feSpecularLighting
- feTile
- feTurbulence
- feDistantLight
- fePointLight
- feSpotLight
使用<filter>
标签来定义 SVG 滤镜:
<defs>
<filter id="Gaussian_Blur">
<feGaussianBlur in="SourceGraphic" stdDeviation="3" />
</filter>
</defs>
<ellipse cx="200" cy="150" rx="70" ry="40"
style="fill:#ff0000;stroke:#000000;
stroke-width:2;filter:url(#Gaussian_Blur)"/>
标签的 id 属性可为滤镜定义一个唯一的名称(同一滤镜可被文档中的多个元素使用) - filter:url 属性用来把元素链接到滤镜。当链接滤镜 id 时,必须使用 # 字符
- 滤镜效果是通过
标签进行定义的。fe 后缀可用于所有的滤镜 标签的 stdDeviation 属性可定义模糊的程度 - in=”SourceGraphic” 这个部分定义了由整个图像创建效果
svg渐变
线性渐变linearGradient
线性渐变可被定义为水平、垂直或角形的渐变:
- 当 y1 和 y2 相等,而 x1 和 x2 不同时,可创建水平渐变
- 当 x1 和 x2 相等,而 y1 和 y2 不同时,可创建垂直渐变
- 当 x1 和 x2 不同,且 y1 和 y2 不同时,可创建角形渐变
<defs>
<linearGradient id="orange_red" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:rgb(255,255,0);
stop-opacity:1"/>
<stop offset="100%" style="stop-color:rgb(255,0,0);
stop-opacity:1"/>
</linearGradient>
</defs>
<ellipse cx="200" cy="190" rx="85" ry="55"
style="fill:url(#orange_red)"/>
标签的 id 属性可为渐变定义一个唯一的名称 - fill:url(#orange_red) 属性把 ellipse 元素链接到此渐变
标签的 x1、x2、y1、y2 属性可定义渐变的开始和结束位置 - 渐变的颜色范围可由两种或多种颜色组成。每种颜色通过一个
标签来规定。offset 属性用来定义渐变的开始和结束位置。
放射性渐变radialGradient
<defs>
<radialGradient id="grey_blue" cx="50%" cy="50%" r="50%"
fx="50%" fy="50%">
<stop offset="0%" style="stop-color:rgb(200,200,200);
stop-opacity:0"/>
<stop offset="100%" style="stop-color:rgb(0,0,255);
stop-opacity:1"/>
</radialGradient>
</defs>
<ellipse cx="230" cy="200" rx="110" ry="100"
style="fill:url(#grey_blue)"/>