HTML5 Canvas
- Canvas 是 HTML5 中提供的画布,通过 JS 代码可以实现
控制各种图形、制作动画、远程可视化展示
等应用
Canvas 绘图的基本流程
创建画布区域
,获取Canvas元素
- 获取Canvas的
上下文环境对象
- 使用上下文环境对象
绘制图形
Canvas 绘图的基本语法
- HTML5 的 canvas 元素
使用 JavaScript 在网页上绘制图像
- 画布是一个
矩形区域
,可以控制其每一像素
- canvas 拥有
多种绘制路径、矩形、圆形、字符以及添加图像
的方法
- canvas 元素本身是没有绘图能力的,
所有的绘制工作必须在 JavaScript 内部完成
<canvas id="myCanvas" width="200" height="100"></canvas> -- 规定元素的 id、宽度和高度
<script type="text/javascript">
var c=document.getElementById("myCanvas"); -- JavaScript 使用 id 来寻找 canvas 元素
var cxt=c.getContext("2d"); -- 创建 context 对象
cxt.fillStyle="#FF0000"; -- fillStyle 方法将其染成红色
cxt.fillRect(0,0,150,75); -- fillRect 方法规定了形状、位置和尺寸
</script>
Canvas 绘图常用属性方法
属性和方法 |
描述 |
strokeStyle |
设置边框颜色 |
strokeRect( ) |
设置带边框的矩形 |
clearRect |
清除指定矩形区域的像素 |
createLinearGradient |
创建渐变对象 |
moveTo( ) |
绘制画笔到指定点位置 |
lineTo( ) |
绘制到指定坐标点的直线 |
arc( ) |
绘制圆形 |
stroke( ) |
直线描边 |
beginPath( )/closePath( ) |
图形路径开始和结束 |
属性和方法 |
描述 |
fillText( ) |
填充方式绘制文字 |
strokeText( ) |
描边方式绘制文字 |
translate( ) |
移动 |
scale( ) |
缩放 |
rotate( ) |
旋转 |
shadowOffsetX/Y |
阴影与图形的水平/垂直 距离 |
shadowColor |
阴影的颜色 |
shadowBlur |
阴影的模糊值 |
属性和方法 |
描述 |
drawImage( ) |
绘制图像 |
save( ) |
保存已绘制图形 |
restore( ) |
还原保存的图形 |
toDataURL( ) |
还原保存图像到浏览器 |
Canvas 绘图线段和文字
- 移动到起点:
moveTo( )
- 绘制路径:
lineTo( )
- 描边:
stroke( )
- 填充:
fill( )
- 开启新路径(新的图形状态):
beginPath( )
- 结束路径:
closePath( )
- 绘制文字:
strokeText( )
绘制线段
window.onload = function () {
var canvas = document.querySelector('canvas')
canvas.style.border = '5px solid #333'
var ctx = canvas.getContext('2d')
ctx.moveTo(100, 100)
ctx.lineTo(800, 100)
ctx.lineTo(800, 300)
ctx.lineTo(100, 300)
ctx.lineTo(100, 100)
ctx.strokeStyle = "red"
ctx.lineWidth = 10
ctx.stroke()
ctx.beginPath()
ctx.moveTo(100, 400)
ctx.lineTo(800, 400)
ctx.strokeStyle = 'blue'
ctx.stroke()
}

绘制文字
window.onload = function(){
var canvas = document.querySelector('canvas')
var ctx = canvas.getContext('2d')
ctx.font = "18px blod 黑体"
ctx.textAlign = "center"
ctx.fillText('我是Canvas绘制的文字',100,100)
}

绘制围棋棋盘练习
window.onload = function(){
var canvas = document.querySelector('canvas')
canvas.style.border = '4px solid #000'
var ctx = canvas.getContext('2d')
var cellWidth = 10
var cellHeight = 10
for(var i = 0 ; i < 19 ; i++){
ctx.moveTo(0,cellHeight * i)
ctx.lineTo(180,cellHeight*i)
ctx.moveTo(cellWidth * i,0)
ctx.lineTo(cellWidth * i ,180)
}
ctx.lineWidth = 0.5
ctx.stroke()
}

Canvas 绘制图形
描边矩形
- strokeRect(
顶点X坐标
,顶点Y坐标
,宽度
,高度
)
填充矩形
window.onload = function(){
var canvas = document.querySelector('canvas')
var ctx = canvas.getContext('2d')
ctx.rect(0,0,200,100)
ctx.stroke()
ctx.beginPath()
ctx.rect(0,120,200,100)
ctx.fill()
}

绘制圆弧
- arc(
圆心X坐标
,圆心Y坐标
,半径
,开始角度
,结束角度
,方向
)
- 角度的计算:
顺时针为正,逆时针为负
- 右侧: 0, 下方: 90, 上方: -90, 左侧: 180(-180)
顺时针: false
, 逆时针: true
填充扇形
window.onload = function(){
var canvas = document.querySelector('canvas')
var ctx = canvas.getContext('2d')
ctx.arc(100,100,50,0,90*Math.PI/180,true)
ctx.stroke()
ctx.beginPath()
ctx.moveTo(200,100)
ctx.arc(200,100,50,0,45*Math.PI/180,false)
ctx.fill()
}

地球公转练习
window.onload = function () {
var canvas = document.querySelector('#canvas')
var context = canvas.getContext('2d')
setInterval(function(){
draw(context)
},50)
}
var angel = 0
function draw(context){
context.clearRect(0, 0, 500, 500);
context.beginPath();
context.arc(250,250,30,0,360 * Math.PI / 180)
context.fillStyle = "#f00"
context.fill();
context.closePath();
context.beginPath();
context.strokeStyle = '#fff'
context.arc(250,250,200,0,360 * Math.PI / 180)
context.stroke()
context.closePath();
context.save()
context.translate(250,250)
context.rotate(angel * Math.PI / 180)
context.beginPath();
context.arc(200,0,10,0,360 * Math.PI / 180)
context.fillStyle = "#00f"
context.fill();
context.closePath();
context.restore();
angel++
}

扇形统计图练习
window.onload = function () {
var data = [
{
value: 0.15, name: '视频广告', color: '#f00', dist:100 },
{
value: 0.20, name: '联盟广告', color: '#000', dist:120 },
{
value: 0.20, name: '邮件营销', color: '#f0f', dist:130 },
{
value: 0.18, name: '直接访问', color: '#ff0', dist:150 },
{
value: 0.27, name: '搜索引擎', color: '#0ff', dist:180 }
]
var startAngel = -90;
var context = document.querySelector('#canvas').getContext('2d')
for (var i = 0; i < data.length; i++) {
var angel = data[i].value
var angelName = data[i].name
var angelColor = data[i].color
var angelDist = data[i].dist
context.beginPath();
context.moveTo(300,300);
context.fillStyle = angelColor;
context.arc(300,300,angelDist,startAngel*Math.PI/180,
(startAngel+angel*360)*Math.PI/180)
context.fill()
var txtAngel = startAngel + (angel*360 / 2)
var x = 300 + Math.cos(txtAngel * Math.PI/180) * (angelDist + 20)
var y = 300 + Math.sin(txtAngel * Math.PI/180) * (angelDist + 20)
context.beginPath()
context.moveTo(300,300)
context.lineTo(x,y);
context.strokeStyle = angelColor;
context.stroke()
context.textBaseline='middle';
if(txtAngel > -90 && txtAngel < 90){
context.textAlign='left';
}else{
context.textAlign='right';
}
context.fillText(angelName + (angel*100) + '%', x, y);
context.fill()
startAngel += angel*360
}
}

Canvas 样式设置
阴影
设置
shadowOffsetX/Y
(形状与阴影的水平/竖直距离
)
shadowColor
(阴影颜色
)
shadowBlur
(阴影的模糊级别
)
渐变
设置
createLinearGradient(x0,y0,x1,y1)
(线性渐变
)
- x0 (渐变开始点的 x 坐标)
- y0 (渐变开始点的 y 坐标)
- x1 (渐变结束点的 x 坐标)
- y1 (渐变结束点的 y 坐标)
createRadialGradient(x0,y0,r0,x1,y1,r1)
(放射状/环形渐变
)
- x0 (渐变开始圆的 x 坐标)
- y0 (渐变开始圆的 y 坐标)
- r0 (开始圆的半径)
- x1 (渐变的结束圆的 x 坐标)
- y1 (渐变的结束圆的 y 坐标)
- r1 (结束圆的半径)
window.onload = function(){
var canvas = document.querySelector('canvas')
var ctx = canvas.getContext('2d')
ctx.rect(0,0,100,100)
ctx.shadowOffsetX = 10
ctx.shadowOffsetY = 10
ctx.shadowColor = 'red'
ctx.shadowBlur = 15
var color = ctx.createLinearGradient(0,0,0,100)
color.addColorStop(0,'#f00')
color.addColorStop(0.5,'#00f')
color.addColorStop(1,'#0f0')
ctx.fillStyle = color
ctx.fill()
}

Canvas 绘制图片
cxt.drawImage(image,dx,dy)
- image是
具体的图像
- dx,dy是图像的
参考点坐标
cxt.drawImage(image,dx,dy,dw,dh)
cxt.drawImage(image,sx,sy,sw,sh,dx,dy,dw,dh)
window.onload = function(){
var canvas = document.querySelector('canvas')
var ctx = canvas.getContext('2d')
var img = document.createElement('img')
img.src = 'images/up.png'
img.onload = function(){
ctx.drawImage(img,0,0,105,105,100,100,105,105)
}
}
Canvas 变换
-
平移
context.translate(x,y)
- 添加到
水平
坐标(x)上的值
- 添加到
垂直
坐标(y)上的值
-
旋转
context.rotate(angle)
- rotate() 方法
旋转当前的绘图
-
缩放
context.scale(scalewidth,scaleheight)
scalewidth
(缩放
当前绘图的宽度
(1=100%, 0.5=50%, 2=200%, 依次类推))
scaleheight
(缩放
当前绘图的高度
(1=100%, 0.5=50%, 2=200%, etc))
-
保存状态
-
恢复状态
restore()
返回之前保存过的路径状态和属性
window.onload = function(){
var canvas = document.querySelector('canvas')
var ctx = canvas.getContext('2d')
ctx.rect(0,0,100,100)
ctx.stroke()
ctx.clearRect(0,0,110,110)
ctx.save()
ctx.beginPath()
ctx.translate(300,0)
ctx.rotate(45*Math.PI/180)
ctx.scale(1,2)
ctx.rect(0,0,100,100)
ctx.stroke()
ctx.restore()
ctx.rect(0,0,50,50)
ctx.stroke()
var imgStr = canvas.toDataURL('image/jpg')
document.querySelector('img').src = imgStr
}

总结