97

我想制作一个矩形画布来模拟进度条,但似乎当我将画布的宽度和高度设置为 100% 时,它并没有真正使它像父级一样高和宽

请参阅下面的示例
http://jsfiddle.net/PQS3A/

甚至可以制作非正方形的画布吗?我不想硬编码画布的高度和宽度,因为在更大或更小的屏幕(包括移动设备)中查看时它应该动态变化

4

3 回答 3

162

这是一个解决问题的工作示例:

http://jsfiddle.net/PQS3A/7/

你的例子有几个问题:

  1. A<div>没有heightwidth属性。您需要通过 CSS 设置它们。
  2. 即使 div 的大小正确,它也使用 default position:static,这意味着它不是任何子级的定位父级。如果希望画布与 div 大小相同,则必须将 div 设置为position:relative(orabsolutefixed)。
  3. Canvas 上的width和属性指定要绘制到的数据像素数(就像图像中的实际像素一样),并且与画布的显示大小height分开。这些属性必须设置为整数。

上面链接的示例使用 CSS 设置 div 大小并使其成为定位的父级。它创建了一个 JS 函数(如下所示),将画布设置为与其定位的父级相同的显示大小,然后调整内部widthheight属性,使其具有与显示相同的像素数。

var canvas = document.querySelector('canvas');
fitToContainer(canvas);

function fitToContainer(canvas){
  // Make it visually fill the positioned parent
  canvas.style.width ='100%';
  canvas.style.height='100%';
  // ...then set the internal size to match
  canvas.width  = canvas.offsetWidth;
  canvas.height = canvas.offsetHeight;
}
于 2012-04-18T18:34:36.357 回答
16

如果您希望画布实际上与父元素一样大,请使用画布的width和属性。height您可以使用JQuery设置它们。

$(document).ready(function() {
  var canvas = document.getElementById("theCanvas");
  canvas.width = $("#parent").width();
  canvas.height = $("#parent").height();
});

如果您不知道JQuery,请使用以下 Javascript:

var canvas = document.getElementById("theCanvas");
var parent = document.getElementById("parent");
canvas.width = parent.offsetWidth;
canvas.height = parent.offsetHeight;

如果您使用cssheight 和 width 属性,style="width:100%; height:100%;"那么您只是在拉伸画布。这将导致您在画布上绘制的所有内容看起来都被拉伸了。

JQuery 解决方案的JSFiddle

用于 Javascript 解决方案的JSFiddle 。

于 2012-04-18T17:46:10.967 回答
0

在标签上使用 CSS 属性而不是属性:

<div style="background-color:blue;width:140px;height:20px">
    <canvas style="background-color: red;width:100%;height:100%">
    </canvas>
</div>​

这似乎有效

于 2012-04-18T17:44:40.343 回答