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

canvas适配横竖屏及窗口resize时出现多余垂直滚动条问题求助

问题根源

  • canvas默认是内联块级元素,遵循文本基线对齐规则,底部会默认预留几像素的行高留白,这就是多余滚动条的核心来源
  • resize事件触发频率极高,窗口调整过程中临时出现的滚动条会挤压视口尺寸,导致反复触发计算逻辑,出现尺寸计算错乱、浏览器卡顿的问题
  • 横竖屏切换触发orientationchange事件时,浏览器视口尺寸可能还未完成更新,此时获取的宽高是旧值,进一步加剧了尺寸计算错误

修复方案

第一步:修改CSS代码

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  height: 100vh;
  overflow: hidden; /* 禁用全局滚动条,避免干扰容器滚动逻辑 */
}

#radarScreen {
  display: block;
  height: 100%;
  width: 100%;
  overflow: auto; /* 仅在内容超出时显示对应方向的滚动条 */
}

canvas {
  display: block; /* 取消canvas默认的内联块基线留白,消除多余滚动条 */
  background-color: #777;
}

第二步:修改JS代码(添加防抖逻辑,优化横竖屏切换的尺寸获取)

var canvasSize = 0;
var ctx;
var canvas;
var resizeTimer = null; // 防抖定时器

function init() {
  canvas = document.getElementById('myCanvas');
  if (canvas.getContext) {
    ctx = canvas.getContext("2d");
    // 防抖处理:resize事件停止触发100ms后再执行重绘逻辑,避免频繁计算
    window.addEventListener('resize', () => {
      clearTimeout(resizeTimer);
      resizeTimer = setTimeout(resizeCanvas, 100);
    }, false);
    // 横竖屏切换后延迟执行,等待视口尺寸更新完成
    window.addEventListener('orientationchange', () => {
      setTimeout(resizeCanvas, 100);
    }, false);
    resizeCanvas();
  } else {
    alert("ERROR:  APPLICATION CANNOT RUN ON THIS DEVICE");
    return;
  }
}

function resizeCanvas() {
  let viewPortWidth = document.getElementById("radarScreen").clientWidth;
  let viewPortHeight = document.getElementById("radarScreen").clientHeight;
  let portaitMode = viewPortHeight > viewPortWidth;

  if (portaitMode) {
    console.log("portait mode ON");
    canvas.width = viewPortHeight;
    canvas.height = viewPortHeight;
  } else {
    canvas.width = viewPortWidth;
    canvas.height = viewPortWidth;
  }
  canvasSize = canvas.width;

  ctx.clearRect(0, 0, canvasSize, canvasSize);

  ctx.strokeStyle = "black";
  ctx.lineWidth = 0.2 * canvasSize;
  ctx.beginPath();
  ctx.rect(0, 0, canvasSize, canvasSize);
  ctx.stroke();

  ctx.font = "80px Arial";
  ctx.fillStyle = "red";
  ctx.textAlign = "center";
  if (portaitMode) ctx.fillText("Portrait ", canvasSize / 2, canvasSize / 4);
  else ctx.fillText("Landscape ", canvasSize / 2, canvasSize / 4);
}

HTML代码无需修改,调整后即可消除多余滚动条,同时解决窗口调整、横竖屏切换时的不稳定问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:06:05