主题
Canvas
初始化
1、创建画布并获取画布对象
html
<canvas width="500" height="500" id="myCanvas"></canvas>
2、获取元素
js
const canvas = document.getElementById('myCanvas')
3、获取上下文(可以理解为画笔)
js
const ctx = canvas.getContext('2d')
基础图形
把画笔移动到 (x, y) 点
jsctx.moveTo(x, y)
开始一段新的路径子集
jsctx.beginPath()
边
设置线的宽度
jsctx.lineWidth = number
从当前点绘制直线到
(x, y)
点jsctx.lineTo(x, y)
设置边的颜色
jsctx.strokeStyle = string
线段样式
jsctx.lineCap = string // 圆角:'round'
描边
jsctx.stroke()
闭合当前路径(画闭合图形的最后一条线用此方法)
jsctx.closePath()
设置填充的颜色
jsctx.fillStyle = string
填充
jsctx.fill()
矩形
绘制矩形
jsctx.rect(x, y, width, height)
开始一段新的路径子集,并绘制矩形
jsctx.strokeRect(x, y, width, height)
开始一段新的路径子集,并绘制一个填充矩形
jsctx.fillRect(x, y, width, height)
弧形
绘制弧形
jsctx.arc(x, y , r, 起始弧度,结束弧度,弧形方向)
坐标轴转换
重新映射画布上(0,0)的位置
jsctx.translate(x轴方向的距离, y轴方向的距离)
缩放映射画布
jsctx.scale(x轴缩放倍数, y轴缩放倍数)
旋转映射画布
jsctx.rotate(旋转的角度)
集中设置
jsctx.setTransform(水平缩放, 水平倾斜,垂直倾斜,垂直缩放,水平移动,垂直移动)
保存当前图像状态的一份拷贝
jsctx.save()
从栈中弹出存储的图像状态并且使用这个状态
jsctx.restore()
渐变
线性渐变
jsconst bg = ctx.createLinearGradient(x1, y1, x2, y2)
径向渐变
jsconst bg = ctx.createRadialGradient(x1, y1, r1, x2, y2, r2)
设置渐变的颜色
jsbg.addColorStop(百分比: number, 颜色: string)
阴影
设置阴影颜色
jsctx.shadowColor = string
设置阴影x轴的偏移方向
jsctx.shadowOffsetX = number
设置阴影y轴的偏移方向
jsctx.shadowOffsetY = number
设置模糊的距离
jsctx.shadowBlur = number
画出上面设置好的图形,并带阴影效果
jsctx.fillRect(100, 100, 100, 100)
js
ctx.shadowColor = 'red'
ctx.shadowOffsetX = 10
ctx.shadowOffsetY = 10
ctx.shadowBlur = 10
ctx.fillRect(100, 100, 100, 100)
文本
设置文字颜色
jsctx.fillStyle = string
设置文字的大小和字体
jsctx.font = string
设置文字 和 文字的起始位置
jsctx.fillText(文本: string, x: number, y: number)
镂空效果
jsctx.strokeText(文本: string, x: number, y: number)
设置文本的起始点
设置水平位置
jsctx.textAlign = string
设置垂直位置
jsctx.textBaseline = string
文字居中
jsctx.textAlign = 'center' ctx.textBaseline = 'middle' ctx.fillText('hello world', canvasWidth/2, cnavasHeight/2)
重叠图形的样式方案
- js
ctx.globalcompositeOperation = string
destination-out可以用来做刮刮乐
绘制图片
值 | 说明 |
---|---|
dom | 图片 |
number | 绘制图片的起始点的x |
number | 绘制图片的起始点的y |
number | 可选:绘制的宽度 |
number | 可选:绘制的高度 |
number | 可选:canvas绘制的起始点的x |
number | 可选:canvas绘制的起始点的y |
number | 可选:canvas绘制的宽 |
number | 可选:canvas绘制的高 |
jsconst oImg = document.createElement('img') oImg.src = './1.png' oImg.onload = () => { ctx.drawImage(oImg, 0, 0) }
jsctx.drawImage(oImg, 0, 0, 100, 100, 50, 50, 100, 100)
导出 Canvas
将
canvas
的内容抽取成一张图片,base64
编码格式jsconst base64 = canvas.toDataURL()
获取像素点信息
js
ctx.getImageData(起始点x, 起始点y, 宽, 高)
如何解决canvas高分屏模糊的问题
真实像素中放更大的画布,画布会按像素宽高比压缩放入dom中,得到更细致的画布
html
<style>
canvas{
width:200px;
height:200px;
}
</style>
<canvas width="500" height="500"></canvas>
与svg的区别
svg
绘制出来的每⼀个图形的元素都是独⽴的DOM
节点,能够⽅便的绑定事件或⽤来修 改。canvas
输出的是⼀整幅画布svg
输出的图形是⽮量图形,后期可以修改参数来⾃由放⼤缩⼩,不会失真和锯⻮。⽽canvas
输出标量画布,就像⼀张图⽚⼀样,放⼤会失真或者锯⻮