javascript - 调整 Canvas 大小以适合网格中的父引导单元

标签 javascript html5-canvas bootstrap-4

我正在使用 boostrap 网格设计仪表板。有些单元格中有一个 Canvas ,我想强制它与其父单元格的大小相匹配。我基本上是这样计算尺寸的:

var parent = canvas.parentElement;
if (parent.style) {
  var parentStyle = window.getComputedStyle(parent, null);

  var w = parseFloat(parentStyle.width) - (parseFloat(parentStyle.paddingLeft) + parseFloat(parentStyle.paddingRight) + parseFloat(parentStyle.borderLeftWidth) + parseFloat(parentStyle.borderRightWidth));
  var h = parseFloat(parentStyle.height) - (parseFloat(parentStyle.paddingTop) + parseFloat(parentStyle.paddingBottom) + parseFloat(parentStyle.borderTopWidth) + parseFloat(parentStyle.borderBottomWidth));

  canvas.width = w;
  canvas.height = h;
}

但是,当我调整页面大小时, Canvas 或单元格的高度似乎不断增长,我不明白为什么。

在“整页”中运行以下示例并水平调整窗口大小。您将看到细胞如何不断增长高度。

function resizeCanvas(canvas) {
  var parent = canvas.parentElement;
  if (parent.style) {
    var parentStyle = window.getComputedStyle(parent, null);

    var w = parseFloat(parentStyle.width) - (parseFloat(parentStyle.paddingLeft) + parseFloat(parentStyle.paddingRight) + parseFloat(parentStyle.borderLeftWidth) + parseFloat(parentStyle.borderRightWidth));
    var h = parseFloat(parentStyle.height) - (parseFloat(parentStyle.paddingTop) + parseFloat(parentStyle.paddingBottom) + parseFloat(parentStyle.borderTopWidth) + parseFloat(parentStyle.borderBottomWidth));

    canvas.width = w;
    canvas.height = h;
  }
}

function paintOnCanvas(canvas) {
  var ctx = canvas.getContext("2d");
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.fillStyle = "#FF0000";
  ctx.fillRect(0, 0, canvas.width, canvas.height);
  ctx.font = "20px Verdana";
  ctx.fillStyle = "black";
  ctx.fillText("Paint on Canvas", 10, 50);
}

document.addEventListener("DOMContentLoaded", function(event) {
  paintOnCanvas(document.getElementById("canvas"));
});

window.addEventListener('resize', function(event) {
  resizeCanvas(document.getElementById("canvas"));
  paintOnCanvas(document.getElementById("canvas"));
});
canvas {
  background-color: #ce8483;
  width: 100%;
  height: 100%;
}

.col-sm-6 {
  border: 1px #2e6da4 solid;
  padding: 15px 15px;
}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css" integrity="sha384-Smlep5jCw/wG7hdkwQ/Z5nLIefveQRIY9nfy6xoR1uRYBtpZgI6339F5dgvm/e9B" crossorigin="anonymous">

<div class="container-fluid">
  <div class="row">
    <div class="col-md-4 col-sm-6 col-xs-12">
    </div>
    <div class="col-md-4 col-sm-6 col-xs-12">
      <canvas id="canvas"></canvas>
    </div>
    <div class="col-md-4 col-sm-6 col-xs-12">
    </div>
  </div>
</div>

最佳答案

You should use the .offsetWidth and .offsetHeight properties.
Note they belong to the element, not .style.
Quoted from: How do I retrieve an HTML element's actual width and height?

我添加了一个最小尺寸的 div 来给 Canvas 一个最小的高度。您可以看到如果删除该 div 会发生什么。

function resizeCanvas(canvas) {
  var parent = canvas.parentElement;
  
  canvas.width = parent.offsetWidth;
  canvas.height = parent.offsetHeight;
}

function paintOnCanvas(canvas) {
  var ctx = canvas.getContext("2d");
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.fillStyle = "#FF0000";
  ctx.fillRect(0, 0, canvas.width, canvas.height);
  ctx.font = "20px Verdana";
  ctx.fillStyle = "black";
  ctx.fillText("Paint on Canvas", 10, 50);
}

document.addEventListener("DOMContentLoaded", function(event) {
  resizeCanvas(document.getElementById("canvas"));
  paintOnCanvas(document.getElementById("canvas"));
});

window.addEventListener('resize', function(event) {
  resizeCanvas(document.getElementById("canvas"));
  paintOnCanvas(document.getElementById("canvas"));
});
canvas {
  position:absolute;
  left: 0;
  top: 0;
}

.col-sm-6 {
  border: 1px #2e6da4 solid;
  padding: 15px 15px;
  height: 200px;
}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css" integrity="sha384-Smlep5jCw/wG7hdkwQ/Z5nLIefveQRIY9nfy6xoR1uRYBtpZgI6339F5dgvm/e9B" crossorigin="anonymous">

<div class="container-fluid">
  <div class="row">
    <div class="col-md-4 col-sm-6 col-xs-12">
    </div>
    <div class="col-md-4 col-sm-6 col-xs-12">
      <canvas id="canvas"></canvas>
    </div>
    <div class="col-md-4 col-sm-6 col-xs-12">
    </div>
  </div>
</div>

编辑:
我在 .col-sm-6 CSS 类中看到一个拼写错误。
高度:200px;没有:

现在不需要额外的 div 了。

关于javascript - 调整 Canvas 大小以适合网格中的父引导单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51416864/

相关文章:

javascript - Konva 中文本的 `fill` 颜色被 `stroke` 覆盖

css - javascript中的弹跳球动画

jquery - Bootstrap 4 中的下拉菜单内折叠

javascript - safari 浏览器不支持 ipad/iphone、Android 中的 HTML5 音频标签

vue.js - WebStorm 中 Bootstrap-Vue.js 支持的未知 html 标签警告

javascript - 内容丰富的按钮折叠成图标并显示导航选项卡内容

javascript - ng-repeat 需要太多时间来呈现数据

javascript - Nodejs 和 mongoose 的时间戳

javascript - XML Javascript解析问题(具体代码问题)

javascript - 360 度 Canvas 弧中的缺口