使画布与父级一样宽和一样高

IT技术 javascript css html canvas
2021-03-02 20:17:51

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

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

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

3个回答

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

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

你的例子有几个问题:

  1. A<div>没有heightwidth属性。您需要通过 CSS 设置这些。
  2. 即使 div 的大小正确,它也使用了 default position:static,这意味着它不是任何孩子的定位父级。如果您希望画布与 div 的大小相同,则必须将 div 设置为position:relative(or absoluteor fixed)。
  3. Canvas 上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;
}
哦,哇,我没有将位置更改为相对或绝对,因为我认为默认情况下 div 标签会拉伸以包含它拥有的子元素,所以情况并非如此?如果它是静态位置,它只会让孩子超出其边界吗?我认为位置与字面上的位置有关,而我想要的存档只是使其与父级一样宽和高。所以我猜位置也决定了哪个子元素(在 div 标签内)将引用宽度和高度?
2021-04-27 20:17:51
@user1118019 元素position:static(所有元素的默认值和行为)不会启动新的定位系统,但position:relative会启动(不会以其他方式更改元素的显示)。例如,请参阅此演示注意如何#a1相对于主体定位和调整大小,忽略其包含的<div>. 请注意如何#b1相对于其容器定位和调整大小,两者之间的唯一区别是#b { position:relative}.
2021-04-28 20:17:51
谢谢 Phrogz ......我现在明白了,谢谢你花时间向我解释事情,真的很感激
2021-04-28 20:17:51
“即使 div 的大小正确,它也使用默认位置:静态,这意味着它不是任何孩子的定位父级” smh ... 为什么是 tho,CSS?我只对你好。
2021-04-30 20:17:51
@user1118019 我没有完全理解你刚刚写的内容,但这里有一些重要的细节。display:block和没有width指定CSS 的元素会扩展到与它们的容器一样宽。height指定CSS 的容器元素仅与其内容一样高;具有百分比高度的内容相当于让height:0父级确定它需要多高。每当您使用绝对定位或百分比尺寸时,它们都是相对于“偏移父级”计算的;默认情况下,主体是唯一的偏移父级。
2021-05-18 20:17:51

如果您希望它实际上与父元素一样大,请使用画布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;

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

用于 JQuery 解决方案的JSFiddle

用于 Javascript 解决方案的JSFiddle

请注意,除非您style=""在父项上放置显式属性或使用 JS 设置样式,否则非 jQuery 解决方案将失败您应该使用getComputedStyle()or ,正如我在回答中所做的那样,offsetWidth/ offsetHeight
2021-04-20 20:17:51
我注意到提问者没有提到 jquery,所以也许不知道它。他们可能需要一个纯 Javascript 方法。
2021-04-22 20:17:51
@ jing3142 很好的电话。我已经更新了 JQuery 解决方案和非 JQuery 解决方案。
2021-04-28 20:17:51
感谢布兰特的回答,如果可以的话,我会接受你的回答和第一个。但无论如何,我也赞同你的回答。再次非常感谢您的解释。
2021-05-03 20:17:51

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

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

这似乎有效

这将拉伸画布而不是重新调整其大小,这将导致画布上的所有绘图看起来很奇怪。
2021-05-02 20:17:51