【发布时间】: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;
}
<canvas id="mainCanvas"></canvas>
换句话说,画布的视图就像鸟瞰图,如果从屏幕中心到左侧有 10 个网格框。当窗口完全放大时,屏幕将保持从中心到左侧的相同数字或网格框,就像将浏览器窗口调整为较小状态时一样。 (当然,根据屏幕比例,大概有10个格子框左右,但差不多就差不多了)
我尝试在宽度和高度上使用 CSS 将画布大小设置为 100%,但这会导致网格正方形变成模糊的矩形。
我可以添加什么来使画布中的元素随着窗口大小而缩小和增长?
【问题讨论】:
-
试试
100vh和100vw的高度和宽度 -
目前JS会覆盖CSS设置的宽高。如果没有 JS,它会将网格框缩放为模糊的矩形,就像
width: 100%和height: 100%所做的那样。 -
澄清问题:你想要从左到右的20个单元格,但上下单元格数无所谓?还是您希望上下单元格数也为 20(或其他固定数字)?
-
每一边应该大致保持不变。宽度可以保持在左右 20 个单元格左右,上下 10 个单元格。顶部和底部会根据浏览器窗口大小波动更大。即使在更改大小时它们相差 5 个单位,只要它的缩放比例与我当前的情况不同,这也适用于我的情况。
标签: javascript html canvas