可以通过给canvas绘图环境对象编写方法的方式来提供扩展功能
canvas的api中提供了两个方法:
这里只是保存属性,不是保存画布
save和restore如同一个栈,可以嵌套式的调用
如果canvas需要支持IE6~8,有两种选择:
canvas和其他元素一样可以通过addEventListener()
方法来注册事件处理函数,可以监听如mousedown
,mousemove
,mouseup
,mouseout
等事件
浏览器通过事件对象的clientX
和clientY
传递给处理函数的坐标是窗口坐标,而不是相对于canvas自身的坐标,所以需要转换。canvas提供一个getBoundingClientRect()
方法来获取canvas边界值,如下方法可以获取鼠标在canvas之中的坐标:
function windowToCanvas(canvas, x, y) {
var bbox = canvas.getBoundingClientRect();
return {
x: (x - bbox.left) * (canvas.width / bbox.width),
y: (y - bbox.top) * (canvas.height / bbox.height)
};
}
当前支持HTML5的浏览器,都支持clientX和clientY
按下按键时,如果焦点在元素上,就会触发该元素的键盘事件。canvas是一个不可获取焦点的元素,所以需要在document或window上增加键盘事件的处理函数。键盘事件一共三种:
绝大部分按键的敲击,包括alt、esc等按键,能够通过keydown和keyup捕获,他们是底层事件。而keypress则捕获可打印的字符。其触发顺序为:keydown -> keypress -> keyup,长按在会在keydown和keyup之间产生一系列的keypress事件。
一般通过keycode来判断按下的值,事件对象中也有一些Boolean属性判断特殊按键:
canvas上拖动的实现:检测到mousedown事件后,应用程序将绘图表面保存起来,在接下来的mousemove过程中,先绘制保存的内容,再绘制需要被拖动的内容和辅助线,在mouseup的时候最后一次绘制。
保存通过getImageData()
方法,恢复用putImageData()
方法
一般很少单独使用canvas元素,绝大多说情况下,都会将一个或多个canvas元素和其他HTML控件结合起来使用,以便用户可以通过输入数值或其它方式来控制应用程序
canvas的背景是不透明的
canvas规范中说,应当首先考虑使用内置的HTML控件,而不是使用canvas api来从头实现控件
可以通过toDataURL方法将canvas的数据放在img中进行打印
canvas可以离屏操作,display设为none就行了