将 html 画布大小调整为所有可用宽度并向下调整到底部

Posted

技术标签:

【中文标题】将 html 画布大小调整为所有可用宽度并向下调整到底部【英文标题】:Resize html canvas to all available width and down to the bottom 【发布时间】:2021-12-13 06:58:18 【问题描述】:

我希望设置一个 html 页面,在其中显示一些文本和一个 html 画布。文本会出现在画布上方,一些额外的文本可能会出现在一侧。分别是this diagram中的A和B。 仅使用 css 的解决方案将是首选,但我在使用 js 时没有问题。可以假设文本足够短以至于不需要滚动。


我用 js 做了一些实验并获得了视口的大小(下面的代码),但画布超出了视口。这是由于现有的利润规则。我可能可以用边距和类似的东西做一些数学运算,但我想避免这种情况,因为如果页面稍后进入更复杂的布局,它会变得更棘手。

problem.html:
<html>
  <head>
    <meta charset="utf-8">
    <script src="problem.js"></script>
  </head>
  <body>
    <h1>Some fancy title</h1>
    <canvas id="my-canvas"></canvas>
  </body>
</html>
problem.js:
window.addEventListener('DOMContentLoaded', () => 
  const ctx = document.getElementById('my-canvas').getContext('2d');

  // https://***.com/a/28241682/2923526
  const width = window.innerWidth
    || document.documentElement.clientWidth
    || document.body.clientWidth;
  const height = window.innerHeight
    || document.documentElement.clientHeight
    || document.body.clientHeight;
  ctx.canvas.width = width
  ctx.canvas.height = height

  ctx.fillStyle = "#7fdbbb"
  ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height)
)

【问题讨论】:

【参考方案1】:

您可以尝试将画布封装在flexbox

<div style="display:flex; flex-direction:column; height:100%;">
    <div style="display: flex; flex: 0 1 auto;">Some fancy title</div>
    <div style="display: flex; border:1px solid red; width:100%; flex: 1 1 auto;">
        <canvas id="my-canvas"  ></canvas>
    </div>
</div>

【讨论】:

嘿@Vinicius,这几乎可行。画布保留在视口内。然而,出于某种原因,画布在该容器内保持为正方形,而不是占据所有水平空间。可以通过在 Web 控制台中运行 const ctx = document.getElementById('my-canvas').getContext('2d'); ctx.fillStyle = "red"; ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); 来检查 嘿@ffigari,您可能需要从外部 DIV 读取 bounding rectanglevar element = document.getElementById('divcanvas'); var positionInfo = element.getBoundingClientRect(); var hx = positionInfo.height; var wx = positionInfo.width; ctx.canvas.width = wx; ctx.canvas.height = hx【参考方案2】:
                        <div style= display: 'grid', height: '100vh'   >
                         <p> upper text ..... </p>
                         <div style= display: 'flex'  >
                            <p> side text of image </p>
                            <div style= height: '100vh' > html canvas codes... </div>
                         </div>
                        </div>

这段代码可以创建你想要的布局。

【讨论】:

这样,画布保持默认创建大小,其容器不会占用所有可用宽度 给出与画布相关的 div 的 100% 宽度...&lt;div style= height: '100vh', width: '100%' &gt; html canvas codes... &lt;/div&gt;...如果问题解决了,请给我更新。

以上是关于将 html 画布大小调整为所有可用宽度并向下调整到底部的主要内容,如果未能解决你的问题,请参考以下文章

将图像动态加载到覆盖的画布中并调整它们的大小

在窗口调整大小时动态调整画布大小

使用fabric js调整画布大小[重复]

FabricJS:始终在画布上居中对象

如何使用 JavaScript 调整画布大小?

调整图像大小并使其适合画布大小