【问题标题】:Scale full screen canvas to fit content as window changes size随着窗口大小的改变,缩放全屏画布以适应内容
【发布时间】:2018-07-28 03:45:32
【问题描述】:

基本上,我有一个可以绘制网格的画布。当窗口改变大小时,它会刷新网格和场景以用网格填充整个屏幕。

当我将浏览器窗口调整为更小的尺寸时,我希望网格和画布内的所有内容都随之缩小,同时保持网格框为方形。像Agar.io 这样的网站在他们的画布上使用它。

var canvas = document.getElementById("mainCanvas");
var ctx = canvas.getContext("2d");

function resize() {
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;
}


function createMap() {
  var gridOptions = {
    majorLines: {
      separation: 30,
      color: '#e8e8e8'
    }
  };
  drawGridLines(canvas, gridOptions.majorLines);
  return;
}

function drawGridLines(canvas, lineOptions) {
  var iWidth = canvas.width;
  var iHeight = canvas.height;
  ctx.strokeStyle = lineOptions.color;
  ctx.strokeWidth = 1;
  ctx.beginPath();
  var iCount = null;
  var i = null;
  var x = null;
  var y = null;
  iCount = Math.floor(iWidth / lineOptions.separation);
  for (i = 1; i <= iCount; i++) {
    x = (i * lineOptions.separation);
    ctx.moveTo(x, 0);
    ctx.lineTo(x, iHeight);
    ctx.stroke();
  }
  iCount = Math.floor(iHeight / lineOptions.separation);
  for (i = 1; i <= iCount; i++) {
    y = (i * lineOptions.separation);
    ctx.moveTo(0, y);
    ctx.lineTo(iWidth, y);
    ctx.stroke();
  }

  ctx.closePath();
  return;
}

function refresh() {
  resize();
  createMap();
}
window.onresize = function() {
  refresh();
}
refresh();
body,
html {
  align-content: center;
  overflow: hidden;
  border: 0;
  margin: 0;
  padding: 0;
}

#mainCanvas {
  top: 0;
  left: 0;
  position: absolute;
  overflow: hidden;
  border: 0;
  margin: 0;
  padding: 0;
}
&lt;canvas id="mainCanvas"&gt;&lt;/canvas&gt;

换句话说,画布的视图就像鸟瞰图,如果从屏幕中心到左侧有 10 个网格框。当窗口完全放大时,屏幕将保持从中心到左侧的相同数字或网格框,就像将浏览器窗口调整为较小状态时一样。 (当然,根据屏幕比例,大概有10个格子框左右,但差不多就差不多了)

我尝试在宽度和高度上使用 CSS 将画布大小设置为 100%,但这会导致网格正方形变成模糊的矩形。

我可以添加什么来使画布中的元素随着窗口大小而缩小和增长?

【问题讨论】:

  • 试试100vh100vw 的高度和宽度
  • 目前JS会覆盖CSS设置的宽高。如果没有 JS,它会将网格框缩放为模糊的矩形,就像 width: 100%height: 100% 所做的那样。
  • 澄清问题:你想要从左到右的20个单元格,但上下单元格数无所谓?还是您希望上下单元格数也为 20(或其他固定数字)?
  • 每一边应该大致保持不变。宽度可以保持在左右 20 个单元格左右,上下 10 个单元格。顶部和底部会根据浏览器窗口大小波动更大。即使在更改大小时它们相差 5 个单位,只要它的缩放比例与我当前的情况不同,这也适用于我的情况。

标签: javascript html canvas


【解决方案1】:

这是一个示例,其中画布中的元素随着窗口大小而缩小和增长:

<style>body{margin:0}</style>
<canvas id="mainCanvas"></canvas>


<script>
var canvas = document.getElementById("mainCanvas");
var ctx = canvas.getContext("2d");

function resize() {
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;

    var gridOptions = {
        majorLines: {
        separation: 20,
        color: '#e8e8e8'
        }
    };
    drawGridLines(canvas, gridOptions.majorLines);
}

function drawGridLines(canvas, lineOptions) {
    ctx.strokeStyle = lineOptions.color;
    ctx.strokeWidth = 1;
    ctx.beginPath();

    var size = Math.floor(canvas.width / lineOptions.separation);
    for (var i = 1; i <= lineOptions.separation; i++) {
        var x = (i * size);
        ctx.moveTo(x, 0);
        ctx.lineTo(x, canvas.height);
        ctx.stroke();
    }
    for (var i = 1; i <= Math.floor(canvas.height / size); i++) {
        var y = (i * size);
        ctx.moveTo(0, y);
        ctx.lineTo(canvas.width, y);
        ctx.stroke();
    }
    ctx.closePath();
}

window.onresize = function() { resize(); }
resize();
</script>

这是一个现场示例:

https://raw.githack.com/heldersepu/hs-scripts/master/HTML/canvasResize2.html

【讨论】:

  • 效果很好!究竟是什么造成了不同?
  • @TomJaquo 我简化了你的代码,去掉了很多 CSS,和你的比较看看有什么不同
猜你喜欢
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
相关资源
最近更新 更多