js canvas实现橡皮擦效果
(编辑:jimmy 日期: 2025/11/3 浏览:3 次 )
本文实例为大家分享了canvas实现橡皮擦效果的具体代码,供大家参考,具体内容如下
html部分
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8" />
<meta name="viewport" content="initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title>My Canvas 0.1</title>
<style type="text/css">
html,body,div,img{
margin:0;
padding:0;
}
a,a:hover{
text-decoration:none;
}
.background{
width:100%;
position:fixed;
top:0;
left:0;
}
</style>
</head>
<body>
<img src="/UploadFiles/2021-04-02/background.png">
lottery.js
function Lottery(node, cover, coverType, width, height, drawPercentCallback) {
//node:canvas的id,cover:上面一层的图片地址,coverType:'image'or'color',width:canvas宽, height:canvas高, drawPercentCallback:回调函数
//canvas
this.conNode = node;
this.background = null;
this.backCtx = null;
this.mask = null;
this.maskCtx = null;
this.lottery = null;
this.lotteryType = 'image';
this.cover = cover || "#000";
this.coverType = coverType;
this.pixlesData = null;
this.width = width;
this.height = height;
this.lastPosition = null;
this.drawPercentCallback = drawPercentCallback;
this.vail = false;
}
Lottery.prototype = {
createElement: function(tagName, attributes) {
var ele = document.createElement(tagName);
for (var key in attributes) {
ele.setAttribute(key, attributes[key]);
}
return ele;
},
getTransparentPercent: function(ctx, width, height) {
var imgData = ctx.getImageData(0, 0, width, height),
pixles = imgData.data,
transPixs = [];
for (var i = 0, j = pixles.length; i < j; i += 4) {
var a = pixles[i + 3];
if (a < 128) {
transPixs.push(i);
}
}
return (transPixs.length / (pixles.length / 4) * 100).toFixed(2);
},
resizeCanvas: function(canvas, width, height) {
canvas.width = width;
canvas.height = height;
canvas.getContext('2d').clearRect(0, 0, width, height);
},
resizeCanvas_w: function(canvas, width, height) {
canvas.width = width;
canvas.height = height;
canvas.getContext('2d').clearRect(0, 0, width, height);
if (this.vail) this.drawLottery();
else this.drawMask();
},
drawPoint: function(x, y, fresh) {
this.maskCtx.beginPath();
this.maskCtx.arc(x, y, 20, 0, Math.PI * 2);
this.maskCtx.fill();
this.maskCtx.beginPath();
this.maskCtx.lineWidth = 60;
this.maskCtx.lineCap = this.maskCtx.lineJoin = 'round';
if (this.lastPosition) {
this.maskCtx.moveTo(this.lastPosition[0], this.lastPosition[1]);
}
this.maskCtx.lineTo(x, y);
this.maskCtx.stroke();
this.lastPosition = [x, y];
this.mask.style.zIndex = (this.mask.style.zIndex == 20) "touchmove", function(e) {
if (isMouseDown) {
e.preventDefault();
}
if (e.cancelable) {
e.preventDefault();
} else {
window.event.returnValue = false;
}
}, false);
_this.conNode.addEventListener('touchend', function(e) {
isMouseDown = false;
var per = _this.getTransparentPercent(_this.maskCtx, _this.width, _this.height);
if (per >= 80) {//在大于等于80%的时候调用回调函数
if (typeof(_this.drawPercentCallback) == 'function') _this.drawPercentCallback();
}
}, false);
}
this.mask.addEventListener(clickEvtName, function(e) {
e.preventDefault();
isMouseDown = true;
var x = (device "0", "#fff");
// gradient.addColorStop("1.0", "#000");
// _this.maskCtx.font = 'Bold ' + fontSize + 'px Arial';
// _this.maskCtx.textAlign = 'left';
// _this.maskCtx.fillStyle = gradient;
// _this.maskCtx.fillText(txt, _this.width / 2 - _this.maskCtx.measureText(txt).width / 2, 100);
// _this.maskCtx.globalAlpha = 1;
_this.maskCtx.globalCompositeOperation = 'destination-out';
}
image.src = this.cover;
}
},
init: function(lottery, lotteryType) {
if (lottery) {
this.lottery = lottery;
this.lottery.width = this.width;
this.lottery.height = this.height;
this.lotteryType = lotteryType || 'image';
this.vail = true;
}
if (this.vail) {
this.background = this.background || this.createElement('canvas', {
style: 'position:fixed;top:0;left:0;background-color:transparent;'
});
}
this.mask = this.mask || this.createElement('canvas', {
style: 'position:fixed;top:0;left:0;background-color:transparent;'
});
this.mask.style.zIndex = 20;
if (!this.conNode.innerHTML.replace(/[\w\W]| /g, '')) {
if (this.vail) this.conNode.appendChild(this.background);
this.conNode.appendChild(this.mask);
this.bindEvent();
}
if (this.vail) this.backCtx = this.backCtx || this.background.getContext('2d');
this.maskCtx = this.maskCtx || this.mask.getContext('2d');
if (this.vail) this.drawLottery();
else this.drawMask();
var _this = this;
window.addEventListener('resize', function() {
_this.width = document.documentElement.clientWidth;
_this.height = document.documentElement.clientHeight;
_this.resizeCanvas_w(_this.mask, _this.width, _this.height);
}, false);
}
}
另一个zepto.js是库函数文件,可网上自行查找
出来的效果如图
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
下一篇:JS闭包原理与应用经典示例
