【问题标题】:make canvas as wide and as high as parent使画布与父级一样宽和一样高
【发布时间】:2012-04-30 04:31:00
【问题描述】:

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

请看下面的例子
http://jsfiddle.net/PQS3A/

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

【问题讨论】:

    标签: javascript css html canvas


    【解决方案1】:

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

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

    您的示例有几个问题:

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

    上面链接的示例使用 CSS 设置 div 大小并使其成为定位的父级。它创建了一个 JS 函数(如下所示),将画布设置为与其定位的父级相同的 display 大小,然后调整内部 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 标签内)将参考宽度和高度??
    • @user1118019 我没有完全理解你刚刚写的内容,但这里有一些重要的细节。 display:block 且未指定 CSS width 的元素扩展为与其容器一样宽。未指定 CSS height 的容器元素仅与其内容一样高;具有百分比高度的内容相当于拥有height:0,当涉及到父级计算它需要多高时。每当您使用绝对定位或百分比尺寸时,它们都是相对于“偏移父级”计算的;默认情况下,body 是唯一的偏移父级。
    • @user1118019 position:static 的元素(所有元素的默认值和行为)不会启动新的定位系统,但 position:relative 会启动(不改变元素的显示)。例如,请参阅this demo。注意#a1 是如何相对于主体定位和调整大小的,忽略它包含的<div>。请注意 #b1 是如何相对于其容器进行定位和调整大小的,两者之间的唯一区别是 #b { position:relative}
    • 感谢 Phrogz...我现在明白了,感谢您抽出宝贵时间向我解释事情,非常感谢
    • “即使 div 的大小正确,它也使用默认位置:静态,这意味着它不是任何子元素的定位父元素” smh ...为什么,CSS?我只对你好。
    【解决方案2】:

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

    JSFiddle 用于 JQuery 解决方案。

    JSFiddle 用于 Javascript 解决方案。

    【讨论】:

    • 我注意到提问者没有提到 jquery,所以可能不知道。他们可能需要纯 Javascript 方法。
    • @jing3142 好电话。我已经更新了 JQuery 解决方案和非 JQuery 解决方案。
    • 请注意,非jQuery解决方案将失败,除非您将显式style=""属性放在父级上,或者使用JS设置样式。您应该使用getComputedStyle(),或者就像我在回答中所做的那样,offsetWidth/offsetHeight
    • 感谢布兰特的回答,如果可以的话,我会接受你的回答和第一个回答。但无论如何我也赞成你的回答。再次非常感谢您的解释。
    【解决方案3】:

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

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

    That seems to work

    【讨论】:

    • 这将拉伸画布而不是重新调整大小,这将导致画布上的所有绘图看起来很奇怪。
    猜你喜欢
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    相关资源
    最近更新 更多