javascript - 如何使 HTML Canvas 适合屏幕,同时保持宽高比而不切断 Canvas ?

标签 javascript html css canvas

我正在使用 HTML Canvas 和 javascript 制作游戏。我的 Canvas 尺寸为 1280 x 720 像素(16:9 比例)。我希望我的游戏能够全屏显示,如果屏幕比例不是 16:9,则显示黑条。

如果我这样做:

canvas {
    position: absolute;
    width: 100%;
    height: 100%;
}

然后我的游戏会以全屏模式运行,但如果屏幕比例不是 16:9,则会拉伸(stretch)至填满屏幕。我不希望它被拉伸(stretch),我想在需要时显示黑条。

如果我这样做:

canvas {
    position: relative;
    width: 100%;
    height: 100%;
}

然后 Canvas 保持正确的宽高比,但如果屏幕宽于 16:9,它就会被切断,我也不希望这样。

我怎样才能实现这个目标?我发现的其他答案围绕在调整窗口大小时更新 canvas.width 和 canvas.height ,但我不想调整 canvas.width 或 canvas.height 的大小,因为游戏设计为在 1280 x 720 下工作。当然我可以缩放绘图根据canvas.width和canvas.height,但我想知道如果不这样做是否可以实现。

谢谢

最佳答案

首先,正如评论中所述,canvas 是一个替换级别元素。因此,可以将 object-fit 应用于它,就像用于此演示的图像一样。

解决方案从“包装器”(div.fullscreen) 开始。通过使用以下方法定位此元素以填充整个视口(viewport): position:fixed; inset: 0; (inset: 0; = 上、右、下、左:0 尚未完全支持: https://developer.mozilla.org/en-US/docs/Web/CSS/inset )。

接下来,我们处理此包装器中的图像(或您的情况下的 Canvas )并将 max-heightmax-width 设置为 100%。然后我们使用 object-fit: contains; 让 Canvas 保持其纵横比,但填充包装器而不被切断。

最后但并非最不重要的一点是我们使用 display: flex;调整内容:居中; align-items: center; 在垂直和水平中心显示 Canvas 。

body {
  margin: 0;
}

.fullscreen {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background-color: black;
  display: flex;
  justify-content: center;
  align-items: center;
}

.fullscreen img {
  object-fit: contain;
  max-height: 100%;
  max-width: 100%;
}
<div class="fullscreen">
  <img src="https://via.placeholder.com/1280x720.jpg">
</div>

关于javascript - 如何使 HTML Canvas 适合屏幕,同时保持宽高比而不切断 Canvas ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67758479/

相关文章:

javascript - 下划线: Losing reference to collection when filtering

javascript - 我如何定位一个框以便使用 jQuery 隐藏它?

html - 如何 htaccess 301 重定向在 url 中带有问号的页面

css - Z-Index 绝对定位 - 使用 Z-Index 在面板位于后面时始终显示在顶部

javascript - 使用 jquery ajax 中选择的 Jquery

javascript - 如何从给定对象以指定方式获取构造对象

javascript - 添加属性backbone.js

html - 为什么在使用位置 : fixed, 时在 iPad 上更好地消除锯齿?

javascript - 在 jQuery Mobile 中打开弹出窗口时如何避免上下滚动

css下拉菜单过渡效果