画板实现的效果:可以切换画笔的粗细,颜色,还可以使用橡皮擦,还可以清除画布,然后将画的内容保存下载成一张图片:
具体用到的canvas功能有:画笔的粗细调整lineWidth,开始一个新的画笔路径beginPath,结束一个画笔路径closePath,这个可以保证不影响之前画的效果,重新开始一个画笔路径。 还有橡皮擦使用的ctx.globalCompositeOperation = 'destination-out'属性,清空画布使用的:ctx.clearRect(0, 0, canvas.width, canvas.height),保存图片使用的是let url = canvas.toDataURL('image/png')。
完整的代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>像素操作</title>
<style>
.active {
background-color: #f2a1a1;
}
</style>
</head>
<body>
<div>创建一个画布,可以使用画笔随意画画</div>
<div style="width: 800px; margin-top: 6px">
<button class="bold">粗线条</button>
<button class="thin">细线条</button>
<input id="color" type="color" />
<button class="del">橡皮擦</button>
<button class="clear">清空画布</button>
<button class="save">保存图片</button>
<hr />
<canvas id="myCanvas" width="800" height="600"></canvas>
</div>
<script>
// 获取画布
const canvas = document.getElementById('myCanvas')
// 获取画笔
const ctx = canvas.getContext('2d')
// 让画笔的拐弯处更加圆润,没有锯齿感
ctx.lineCap = 'round'
ctx.lineJoin = 'round'
// 获取控制按钮
const bold = document.querySelector('.bold')
const thin = document.querySelector('.thin')
const color = document.querySelector('#color')
const del = document.querySelector('.del')
const clear = document.querySelector('.clear')
const save = document.querySelector('.save')
// 添加点击事件
bold.onclick = function () {
ctx.lineWidth = 20
bold.classList.add('active')
thin.classList.remove('active')
del.classList.remove('active')
clear.classList.remove('active')
save.classList.remove('active')
}
thin.onclick = function () {
ctx.lineWidth = 5
thin.classList.add('active')
bold.classList.remove('active')
del.classList.remove('active')
clear.classList.remove('active')
save.classList.remove('active')
}
color.onchange = function (e) {
console.log('颜色改变了:', e.target.value)
ctx.strokeStyle = e.target.value
}
del.onclick = function () {
console.log('橡皮擦')
ctx.globalCompositeOperation = 'destination-out'
ctx.lineWidth = 30
del.classList.add('active')
bold.classList.remove('active')
thin.classList.remove('active')
clear.classList.remove('active')
save.classList.remove('active')
}
clear.onclick = function () {
console.log('清空画布')
ctx.clearRect(0, 0, canvas.width, canvas.height)
}
// 保存图片
save.onclick = function () {
console.log('保存图片')
let url = canvas.toDataURL('image/png')
let a = document.createElement('a')
a.href = url
a.download = 'canvas.png'
a.click()
}
// 监听画布画画事件
let mouseDown = false
// 鼠标按下将变量设置为true
canvas.onmousedown = function (e) {
ctx.beginPath()
mouseDown = true
ctx.moveTo(e.offsetX, e.offsetY)
}
// 鼠标抬起将变量设置为false
canvas.onmouseup = function () {
mouseDown = false
ctx.closePath()
ctx.globalCompositeOperation = 'source-over'
}
canvas.onmouseleave = function () {
mouseDown = false
ctx.closePath()
}
// 鼠标移动
canvas.onmousemove = function (e) {
if (mouseDown) {
console.log('鼠标移动')
ctx.lineTo(e.offsetX, e.offsetY)
ctx.stroke()
}
}
</script>
</body>
</html>