1. 创建Canvas
//HTML
<canvas id="myCanvas" width="400" height="200">
您的浏览器不支持canvas!
</canvas>
//JavaScript
var canvas = document.getElementById('myCanvas');
if (canvas.getContext) {
var ctx = canvas.getContext('2d');
}
2. API
颜色、样式和阴影
fillStyle
:设置或返回用于填充绘画的颜色、渐变或模式
strokeStyle
:设置或返回用于笔触的颜色、渐变或模式
shadowColor
:设置或返回用于阴影的颜色
shadowBlur
: 设置或返回用于阴影的模糊级别
shadowOffsetX
:设置或返回阴影距形状的水平距离
shadowOffsetY
:设置或返回阴影距形状的垂直距离
createLinearGradient()
:创建线性渐变(用在画布内容上)
createPattern()
: 在指定的方向上重复指定的元素
createRadialGradient()
:创建放射状/环形的渐变(用在画布内容上)
addColorStop()
: 规定渐变对象中的颜色和停止位置
线条样式
lineCap
:设置或返回线条的结束端点样式
lineJoin
:设置或返回两条线相交时,所创建的拐角类型
lineWidth
:设置或返回当前的线条宽度
miterLimit
:设置或返回最大斜接长度
矩形
rect(x, y, width, height)
: 创建矩形
fillRect(x, y, width, height)
: 绘制“被填充”的矩形
strokeRect(x, y, width, height)
: 绘制矩形(无填充)
clearRect(x, y, width, height)
: 在给定的矩形内清除指定的像素
路径
fill()
:填充当前绘图(路径)
stroke()
:绘制已定义的路径
beginPath()
:起始一条路径,或重置当前路径
moveTo(x,y)
:把路径移动到画布中的指定点,不创建线条
closePath()
:创建从当前点回到起始点的路径
lineTo()
:添加一个新点,然后在画布中创建从该点到最后指定点的线条
clip()
:从原始画布剪切任意形状和尺寸的区域
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
// 剪切矩形区域
ctx.rect(50,20,200,120);
ctx.stroke();
ctx.clip();
// 在 clip() 之后绘制绿色矩形,只能显示出部分
ctx.fillStyle="green";
ctx.fillRect(0,0,150,100);
quadraticCurveTo(控制点的 x ,控制点的 y ,结束点的 x ,结束点的 y )
: 创建二次贝塞尔曲线
bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y)
: 创建三次方贝塞尔曲线
arc(x, y, radius, startAngle, endAngle, anticlockwise)
: 创建弧/曲线(用于创建圆形或部分圆)
arcTo()
: 创建两切线之间的弧/曲线
isPointInPath()
: 如果指定的点位于当前路径中,则返回 true,否则返回 false
转换
scale()
: 缩放当前绘图至更大或更小
rotate()
: 旋转当前绘图
translate()
: 重新映射画布上的 (0,0) 位置
transform()
: 替换绘图的当前转换矩阵
setTransform()
: 将当前转换重置为单位矩阵。然后运行 transform()
文本
font
:ctx.font = "Bold 20px Arial"
textAlign
: 对齐方式
textBaseline
:
fillText(string, x, y)
: 在画布上绘制“被填充的”文本 ,fillText方法不支持文本断行,即所有文本出现在一行内
strokeText()
: 在画布上绘制文本(无填充)
measureText()
: 返回包含指定文本宽度的对象
图像绘制
drawImage()
: 向画布上绘制图像、画布或视频
像素操作
width
: ImageData 对象的宽度
height
: ImageData 对象的高度
data
: ImageData 对象的图像数据
createImageData()
: 创建新的、空白的 ImageData 对象
getImageData()
: 返回 ImageData 对象,该对象为画布上指定的矩形复制像素数据
putImageData()
: 把图像数据(从指定的 ImageData 对象)放回画布上
合成
globalAlpha
: alpha 或透明值
globalCompositeOperation
:
其他
save()
:保存当前环境的状态
restore()
:返回之前保存过的路径状态和属性
createEvent()
:
getContext()
:
toDataURL()
:
3. 离屏canvas进行预渲染
用离屏canvas进行预渲染了,原理很简单,就是先绘制到一个离屏canvas中,然后再通过drawImage把离屏canvas画到主canvas中
一般例子
ctx.save();
var j = 0;
ctx.lineWidth = borderWidth;
for (var i = 1; i < this.r; i += borderWidth) {
ctx.beginPath();
ctx.strokeStyle = this.color[j];
ctx.arc(this.x, this.y, i, 0, 2 * Math.PI);
ctx.stroke();
j++;
}
ctx.restore();
4. 示例
画尺子
//canvas宽高为900
let canvas = document.getElementById('c')
let ctx = canvas.getContext('2d');
//画尺子主体
ctx.lineWidth = 3;
ctx.beginPath();
ctx.moveTo(48, 400);
ctx.lineTo(652, 400);
ctx.strokeStyle = "#666";
ctx.stroke();
//每厘米间隔像素
var rate = 10;
//循环画出刻度线
for (var i = 0; i < 61; i++) {
ctx.beginPath();
ctx.moveTo(50 + rate * i, 400);
if (i % 5 == 0 && i % 10 != 0 && i != 0) {
//中间5刻度
ctx.lineWidth = 2;
ctx.fillText(i, 45 + rate * i, 420);
ctx.lineTo(50 + rate * i, 380);
} else if (i % 10 == 0) {
//中间10刻度
ctx.lineWidth = 4;
ctx.fillText(i, 45 + rate * i, 420);
ctx.lineTo(50 + rate * i, 375);
} else {
ctx.lineWidth = 1;
ctx.lineTo(50 + rate * i, 385);
}
ctx.stroke();
}
画时钟
let canvas = document.getElementById('c')
let ctx = canvas.getContext('2d');
ctx.translate(400, 400)
ctx.lineWidth = 1;
ctx.strokeStyle = "#666";
//圆圈
ctx.beginPath();
ctx.arc(0, 0, 110, 0, 2 * Math.PI);
ctx.stroke();
ctx.closePath()
//刻度盘
ctx.save()
for (var i = 0; i < 60; i++) {
ctx.lineWidth = 1;
ctx.beginPath();
if (i % 5 == 0) {
ctx.lineWidth = 3;
ctx.moveTo(0, 95);
} else {
ctx.moveTo(0, 100);
}
ctx.lineTo(0, 110);
ctx.stroke();
ctx.rotate(6 * Math.PI / 180);
}
ctx.restore()
/**
* @Author: xujianwei
* @Date: 2018-04-14 09:45:08
* @Desc: 画指针的函数
* @params: ctx--canvas对象
* @params: rotate--旋转角度系数
* @params: length--指针长度
* @params: color--指针颜色
*/
function pointer(ctx, rotate, length, color) {
ctx.save()
ctx.beginPath();
ctx.rotate(rotate * Math.PI / 30);
ctx.moveTo(0, -10);
ctx.lineTo(0, length);
ctx.strokeStyle = color
ctx.lineWidth = 3;
ctx.stroke();
ctx.closePath()
ctx.restore()
}
//使画布的起始点旋转到钟表的12点刻度
ctx.rotate(Math.PI);
setInterval(function () {
//清理现场
ctx.beginPath();
ctx.arc(0, 0, 85, 0, 2 * Math.PI);
ctx.fillStyle = '#fff'
ctx.fill()
ctx.closePath()
//清理完毕
var date = new Date()
pointer(ctx, date.getSeconds(), 80, '#ff4d4d')
pointer(ctx, date.getSeconds() / 60 + date.getMinutes(), 80, '#333')
pointer(ctx, date.getSeconds() / 720 + date.getMinutes() / 12 + date.getHours() * 5, 30, '#333')
//添加中间原点
ctx.beginPath();
ctx.arc(0, 0, 4, 0, 2 * Math.PI);
ctx.fillStyle = '#ff4d4d'
ctx.fill()
ctx.closePath()
}, 1000)