使画布与父对象一样宽和一样高


79

我想制作一个矩形画布来模拟进度条,但是当我将画布的宽度和高度设置为100%时,它实际上并没有使其高度和父级一样高

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

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

Answers:


135

这是一个解决问题的可行示例:

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

您的示例有几个问题:

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

上面链接的示例使用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;
}

1
哦,我没有改变相对或绝对位置的位置,因为我认为div标签默认情况下会拉伸以包含其具有的子元素,所以不是这样吗?如果它是静态位置,它只会让孩子长出边界吗?我认为位置实际上与位置有关,而我想要存档的只是使其与父项一样宽和高。所以我想位置也决定了宽度和高度将引用哪个子元素(在div标签内)?
user1118019 2012年

@ user1118019我不太了解您刚刚写的内容,但是这里有一些重要的细节。display:block没有width指定CSS的元素将扩展到与其容器一样宽。没有height指定CSS的容器元素只能和它们的内容一样高。具有百分比高度的内容等同于height:0父母确定其高度需要多少。每当您使用绝对定位或百分比尺寸时,它们都是相对于“偏移父级”计算的;默认情况下,主体是唯一的偏移父级。
Phrogz

@ user1118019元素position:static(所有元素的默认值和行为)不会启动新的定位系统,但是position:relative会启动(不会改变元素的显示)。例如,请参见此演示。请注意#a1,相对于主体的位置和大小如何设置,而忽略了其<div>。请注意#b1,相对于其容器的位置和大小是如何确定的,两者之间的唯一区别是#b { position:relative}
Phrogz

谢谢Phrogz ...我现在明白了,谢谢您抽出宝贵的时间向我解释事情,真的很感激
user1118019 2012年

1
“即使div的大小正确,它也会使用默认位置:静态,这意味着它不是任何子级的定位父级。” smh ...为什么使用CSS?我只对你好。
CCJ

15

如果希望画布的大小与父元素一样大,请使用它的widthheight属性。您可以使用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%;",那么您只是在拉伸画布。这将使您在画布上绘制的所有内容看起来都被拉伸。

JSFiddle用于JQuery解决方案。

JSFiddle for Javascript解决方案。


2
我注意到发问者没有提到jquery,所以也许不知道它。他们可能需要纯Javascript方法。
jing3142'4

@ jing3142好的电话。我已经更新了JQuery解决方案和非JQuery解决方案。
布兰特·奥尔森

1
请注意,除非您style=""在父级上放置显式属性或使用JS设置样式,否则非jQuery解决方案将失败。您应该使用getComputedStyle()或,就像我在回答中所做的那样offsetWidth/ offsetHeight
Phrogz

感谢布兰特的回答,如果可以的话,我会接受您的回答和第一个回答。但无论如何,我也赞成您的回答。再次非常感谢您的解释。
user1118019 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.