带背景的Canvas图形擦除方法

1  需求:

在一张图上,可以擦除自绘图形,但不能擦除背景。

2. 实现方法

用两张完全重合的Canvas元素来实现,前景Canvas的背景色为rgba(0,0,0,0),擦除操作只在前景Canva上实现。

3. 代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>canvas保留背景擦除演示</title>
    <style type="text/css">
        #bg,#fg {
            border: 1px solid #ADACB033;
            background-color: red;
            display: block;
            margin: 20px auto;
            position: absolute;
            left: 0px;
            top: 0px;
            z-index: 0;
        }
        
        #fg {
            background-color: rgba(0, 0, 0, 0);
            z-index: 1;
        }
    </style>
</head>
<body>
    <canvas id="bg" width="300" height="300"></canvas>
    <canvas id="fg" width="300" height="300"></canvas>
</body>
<script type="text/javascript">
    window.onload = function() {
        //背景:
        var bg = document.getElementById('bg');
        var ctxb = bg.getContext('2d');
        ctxb.font = "40pt Calibri";
        ctxb.fillText("背景文字", 50, 90);

        //前景
        var fg = document.getElementById('fg');
        var ctx = fg.getContext('2d');
        ctx.moveTo(210, 10);
        ctx.lineTo(20, 210);
        ctx.lineWidth = 20;
        ctx.strokeStyle = "#fff";
        ctx.stroke();

        fg.onmousedown = function(ev) {
            var ev = ev || window.event;
            ctx.moveTo(ev.clientX - fg.offsetLeft, ev.clientY - fg.offsetTop);
            document.onmousemove = function(ev) {
                var ev = ev || window.event;
                let x = ev.clientX - fg.offsetLeft;
                let y = ev.clientY - fg.offsetTop;

                ctx.fillStyle = "#0000";
                ctx.clearRect(x - 20, y - 20, 40, 40);
            };
            fg.onmouseup = function() {
                document.onmousemove = null;
                document.onmouseup = null;
            };
        };
    };
</script>
</html>

4. 效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值