canvas

基础

//初识canvas:不同的canvas需要不同的id,不要循环创建 宽高写在标签里面 绘图 有先后有顺序

<canvas id="canvasId"><span>不支持canvas的浏览器</span></canvas>

var oC = document.getElementById('canvasId')
var oGc = oC.getContext('2d')
//0,基本属性
oGc.fillStyle = 'red';//填充颜色
oGc.strokeStyle = 'red';//边框颜色
oGc.lineJoin = 'bevel'//方形的四个角 bevel斜角 round圆角
oGc.lineCap = 'round'//画线的两端 round圆角 square(会变长,长度多出为宽一半的值)

//1,画方形 fill填充 起点 宽高  oGc.rect() oGc.fill() == fillRect()
oGc.fillRect(10,10,50,50)
oGc.strokeRect(70.5,10.5,60,60)


//2,清除画布 坐标 和 宽高。如果需要绘制动画,则需要在每次绘制之前清空上一次的绘画
oGc.clearRect(20,20,10,20) 

//3,画线 或者 三角
oGc.beginPath()
oGc.moveTo(180,10)
oGc.lineTo(220,10)
oGc.lineTo(150,50)
// oGc.closePath() //闭合  如果开始和闭合联合使用,可以避免属性影响多个绘图
oGc.stroke()

//4,画圆 save restore
oGc.save()
oGc.strokeStyle = 'blue'; // save restore 闭合使用,使得fillStyle只在其中起作用
oGc.moveTo(350,50)
oGc.arc(350,50,50,-90*Math.PI/180,30*Math.PI/180,false) //坐标 半径 起始弧度:默认3点钟方向 结束弧度 旋转方向:默认false顺时针
// oGc.closePath() //可选
oGc.stroke()
oGc.restore()

//5,曲线
oGc.moveTo(10,180) //起点
oGc.strokeStyle = 'blue';
oGc.arcTo(10,100,100,100,20) //两个点  20为半径内切圆切掉
oGc.stroke()

//6,贝塞尔曲线
// quadraticCurveTo(dx,dy,x1,y1) //加起点 控制点拉伸 终点
// bezierCurveTo(dx1,dy1,dx2,dy2,x1,y1)//加起点 控制点拉伸  控制点拉伸 终点

动态绘图 变换

//动态绘制
num = 0
oGc.fillRect(0,100,50,50)
setInterval(function(){
     num++;
     oGc.clearRect(0,100,400,300) //清空上次的绘制
     oGc.fillRect(0+num,100+num,50,50)
},50)

//变换 save restore clearRect setInterval 配合使用 完成动画
// translate(x,y) //变换起点
// rotate(45*Math.PI/180) //旋转
// scale(2,3) //宽2倍 高3倍

绘制图片 和 图片背景

var myImg = new Image()
myImg.src = 'a.png'
myImg.onload = function(){
    // draw1(this)
    draw2(this)
}
function draw1(obj){
    //宽高不写 会自适应
    oGc.drawImage(obj,10,10,200,100)
}
function draw2(obj){
    //repeat repeat-x repeat-y no-repeat
    var bg = oGc.createPattern(obj,'repeat-x')
    oGc.fillStyle = bg
    oGc.fillRect(0,0,400,400)
}

渐变

//线性 两个点
// var obj  = oGc.createLinearGradient(100,100,200,200)
//放射性渐变的 圆坐标,圆半径  圆坐标,圆半径
var obj  = oGc.createRadialGradient(200,200,100,200,200,50)

obj.addColorStop(0,"#f00")
obj.addColorStop(1,"#0f0")
oGc.fillStyle = obj
oGc.fillRect(100,100,200,200)

绘制文本

//第二个参数可以随便写 但是一定要写
oGc.font = '50px impact'
//左右 默认居左 end right center
oGc.textAlign = 'left'
//默认alphabetuc 不是最上边的,一般会改掉 top middle bottom
oGc.textBaseline = 'top'
//空心文本 开始绘制的点,与textAlign  textBaseline 相关
oGc.strokeText('文本绘制',0,0)   

// 阴影 
oGc.shadowOffsetX = 10;
oGc.shadowOffsetY = 10;
//默认颜色 (0,0,0,0)
oGc.shadowColor = "#00f";
//模糊值
oGc.shadowBlur = 3;

// 获取文本的宽,不能获取高 高就是文字的大小 可以做一些居中
var w = oGc.measureText('文本绘制').width
oGc.fillText('文本绘制',(400-w)/2,(400-60)/2)

像素

//像素data 是一个数组,四位表示一个像素(r,g,b,a),因此100x100的宽高,数组长度应该是40000
oGc.getImageData(x,y,w,h)
oGc.putImageData(x,y,w,h)
//创建一个新的 像素区域
var newImg = oGc.createImageData(w,h)
oGc.putImageData(newImg,x,y)

可以做马赛克 倒影 反转等

合成

//导出图片
let imgSrc = oC.toDataURL
//全局 globalAlpha
//oGc.globalCompositeOperation = 'xor'

//事件操作 判断是否在canvas绘制区域
oGc.isPointInPath(x,y)
js
JSRUN前端笔记, 是针对前端工程师开放的一个笔记分享平台,是前端工程师记录重点、分享经验的一个笔记本。JSRUN前端采用的 MarkDown 语法 (极客专用语法), 这里只属于前端工程师。