javascript - 使用 clientWidth 和 offsetWidth 读取 div 元素的宽度和高度时遇到问题
问题描述
我想动态调整画布元素的大小。我的页面分为两部分,左侧有一些设置,右侧有一个画布元素。由于页面可能会调整大小,因此画布元素应随之调整大小。到目前为止,我正在尝试使用 CSS 网格和一个事件监听器来实现这一点,它会在每次调整窗口大小时调整画布元素的大小。
现在来看实际问题:当我将画布宽度和高度设置为 CanvasContainer 的宽度和高度(在事件监听器运行的函数中)时,CanvasContainer div 没有正确调整大小。事实上,当我使窗口的宽度变小时,div 的宽度会增加。如果我留下这两行 CanvasContainer div 会按预期调整大小。
HTML:
<div class="Container">
<div class="Control">
<input id="StateCodeText" type="text" placeholder="State code">
<br>
<input id="StateOutputText" type="text" placeholder="State output">
<br>
<button id="NewStateButton">New state</button>
</div>
<div class="CanvasContainer">
<canvas></canvas>
</div>
</div>
Javascript:
let CanvasContainer = document.querySelector(".CanvasContainer");
Resize();
window.addEventListener("resize", Resize);
function Resize() {
canvas.width = CanvasContainer.clientWidth;
canvas.height = CanvasContainer.clientHeight;
}
CSS:
.Container {
display: grid;
grid-template-columns: 1fr 8fr;
height: 100%;
}
.CanvasContainer {
border: 2px solid rgb(255, 0, 13);
width: 100%;
height: 100%;
}
解决方案
你确定canvas
在你的js中定义了吗?也许给它一个id
<canvas id=canvas'></canvas>
然后定义
const canvas = document.getElementById('canvas')
但也许这种方法无论如何都不是最好的。css 网格将确保自行调整所有元素的大小。到目前为止,似乎也不需要画布容器。那么如何取而代之
<div class="Container">
<div class="Control">
...
</div>
<canvas id='canvas'></canvas>
</div>
和一些CSS
.Container {
display: grid;
grid-template-columns: 1fr 8fr;
height: 100%;
}
#canvas {
border: 2px solid rgb(255, 0, 13);
width: 100%;
height: 100%;
}
如果您在某些时候确实需要画布的当前大小,您可以随时通过
const width = document.getElementById('canvas').getBoundingClientRect().width
推荐阅读
- powershell - 将多个命令结果输出到单个 TXT 文件
- javascript - 子视图忽略父视图填充,因此它适合全宽
- ruby-on-rails - Rails - 需要应用程序中每个页面的通用反向链接
- ember.js - Ember - 多排序表
- reactjs - 使用反应导航渲染抽屉式导航和选项卡式导航
- pandas - 如何在matplotlib pandas中将两个文件的两个条形图组合在一张图中
- linux - iptables NAT 一对一
- c - 按位表达式清除常量的低字节
- java - 如何添加 glassfish 工具来蚀氧 3a
- python-3.x - 朱莉娅 UndefVarError