You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HTML5 Canvas窗口Resize后无法绘制问题求助

解决Canvas resize后内容消失的问题

嗨,我发现你的问题出在**firstRowX和secondRowX没有在每次重绘时重置初始值**!

每次调用redraw()函数时,你都会让firstRowX = firstRowX + 10和secondRowX = secondRowX + 10,但没有把它们重置回初始的0和5。第一次绘制完成后,这两个变量已经变成了画布的宽度值(因为repetitions = canvass.width /10,循环repetitions次后,firstRowX刚好等于canvass.width)。等resize后再次调用redraw(),循环里绘制的矩形全部都在画布外面了,所以看起来就是空白的——而调整过程中偶尔能看到,是因为resize事件会触发多次,某次执行时变量还没累加太夸张,但最终结束后就完全超出画布了。

另外,redraw()里不需要重复获取canvass和ctx,外面已经定义过这些变量了,重复获取反而容易引发不必要的问题。

下面是修正后的代码:

var canvass = document.getElementById('zipper-canvas');
var ctx = canvass.getContext('2d');
var repetitions;
var firstRowX = 0;
var firstRowY ;
var secondRowX = 5;
var secondRowY ;

$(function() {
    initCanvas();
    redraw();
    window.addEventListener('resize', resizecanvass, false);

    function resizecanvass() {
        initCanvas();
        redraw();
    }

    // 把初始化画布尺寸和变量的逻辑抽出来,避免重复代码
    function initCanvas() {
        canvass.width = window.innerWidth;
        repetitions = canvass.width / 10;
        canvass.height = 30;
        // 重置ctx(因为修改canvas宽高会清空画布并重置上下文)
        ctx = canvass.getContext('2d');
        firstRowY = canvass.height / 2 - 3;
        secondRowY = canvass.height / 2 + 1;
    }

    function redraw() {
        // 关键:每次重绘前重置X坐标的初始值!
        firstRowX = 0;
        secondRowX = 5;
        
        ctx.clearRect(0, 0, canvass.width, canvass.height);
        console.log(repetitions);
        
        for (var r = 0; r < repetitions; r++) {
            ctx.beginPath();
            ctx.rect(firstRowX, firstRowY, 5, 5);
            ctx.fillStyle = "#edeeef";
            ctx.fill();
            ctx.closePath();
            firstRowX = firstRowX + 10;
        }
        
        for (var r2 = 0; r2 < repetitions; r2++) {
            ctx.beginPath();
            ctx.rect(secondRowX, secondRowY, 5, 5);
            ctx.fillStyle = "#a2a3a5";
            ctx.fill();
            ctx.closePath();
            secondRowX = secondRowX + 10;
        }
    }
});

我还把初始化画布的逻辑抽成了initCanvas()函数,这样resize和初始加载时的代码可以复用,更简洁。现在每次resize后,redraw()都会把X坐标重置回初始值,绘制的矩形就会正确显示在画布范围内了。

内容的提问来源于stack exchange,提问作者ValNeo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:21:44