canvas小记(1)
1. canvas自身是带的有width 和height的,写在标签属性style里面和外面是不一样的
2. 在进行canvas路径操作的时候,一定要先清除前面的路径(obj.beginPath()),否则前面的路径会受到后面的影响。
3. obj.beginPath()和obj.closePath()两个没有关系,obj.beginPath()清除之前的路径;obj.closePath()闭合当前路径
4. canvas画线操作:moveTo()、lineTo()、beginPath()、closePath()、stroke()、fill()
5. canvas画矩形操作:rect()、strokeRect()、fillRect()、clearRect()
6. canvas 做自适应可以用window.onresize
7. canvas 的描边扩展的时候既向内又向外扩展
8. canvas不会保存图形,所以图形画了就不能修改,如果要修改,只能删了重画;canvas画的图形没有事件,canvas对象本身有事件
canvas里的图形向右移动实例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> body { background: gray; text-align: center; } </style> <script> window.onload = function () { let c1 = document.getElementsByTagName('canvas')[0]; let left=100; let gd = c1.getContext('2d'); requestAnimationFrame(next); function next(){ gd.clearRect(0,0,c1.width,c1.height); left+=5; gd.strokeRect(left,100,200,200); requestAnimationFrame(next); } } </script> </head> <body> <canvas width="800" height="600" style="background:white;"></canvas> </body> </html>
这段代码是在canvas里有一个不断向右移动的矩形。
requestAnimationFrame函数是请求一个动画帧
canvas里鼠标移入移出矩形变色实例:
还是上面的canvas,js代码如下
window.onload = function () { let c1 = document.getElementsByTagName('canvas')[0]; let gd = c1.getContext('2d'); gd.strokeRect(100,100,200,200); c1.onmousemove=function(ev){ let l=100,r=l+200,t=100,b=t+200; let x=ev.offsetX,y=ev.offsetY; //let x=ev.clientX-c1.offsetLeft,y=ev.clientY-c1.offsetTop; //这里的鼠标坐标x,y可以有两种写法 gd.clearRect(0,0,c1.width,c1.height); if(x>=l&&x<=r&&y>=t&&y<=b){ gd.strokeStyle='red'; }else{ gd.strokeStyle='black'; } gd.strokeRect(100,100,200,200); } }
9. canvas画圆操作arc(cx,cy,r,startAng,endAng,false),cx、cy表示圆心坐标,r表示半径,startAng、endAng表示起始角度和结束角度(弧度制),最后一个参数false表示是否逆时针。
canvas里鼠标移入移出圆形变色实例:
原理:如何判断鼠标是否在圆内?只要判断鼠标到圆心的距离是否大于半径,就可以检测是否在圆内
还是上面的canvas,js代码如下
window.onload = function () { let c1 = document.getElementsByTagName('canvas')[0]; let gd = c1.getContext('2d'); let cx=200,cy=200,r=150; function d2a(n){//角度转弧度 return n*Math.PI/180; } function a2d(n){//弧度转角度 return n*180/Math.PI; } gd.arc(cx,cy,r,d2a(0),d2a(360),false); gd.stroke(); c1.onmousemove=function(ev){ let x=ev.offsetX,y=ev.offsetY;//鼠标到画布的距离,左上 let dis=Math.sqrt(Math.pow(x-cx,2)+Math.pow(y-cy,2));//鼠标到圆心的距离 gd.clearRect(0,0,c1.width,c1.height); if(dis<=r){//如果鼠标到圆心的距离小于半径,说明在圆内 gd.strokeStyle='red'; } else{//否则在圆外 gd.strokeStyle='black'; } gd.beginPath(); gd.arc(cx,cy,r,d2a(0),d2a(360),false); gd.stroke(); }