为什么 box-sizing 不适用于 canvas 元素上的宽度/高度属性?

陪伴阿菲

让我们考虑一下这段代码:

.canvas {
  width:150px;
  height:150px;
}
canvas {
  box-sizing:border-box;
  border:5px solid;
}
<canvas height="150" width="150"></canvas>
<canvas class="canvas"></canvas>

我们canvas定义了两个具有相同宽度/高度、相同边框和box-sizing:border-box. 我们可以清楚地看到,我们使用 CSS 属性的画布尊重box-sizing(边框从宽度/高度减少),但使用属性定义的第一个是忽略box-sizing(边框添加到宽度/高度)。

我首先认为它与属性的使用有关,但在使用imgor时似乎不像预期的那样工作iframe

.canvas {
  width:150px;
  height:150px;
}
iframe,img {
  box-sizing:border-box;
  border:5px solid;
}
<iframe height="150" width="150"></iframe>
<iframe class="canvas"></iframe>

<img height="150" width="150" src="https://picsum.photos/200/300?image=1069">
<img class="canvas" src="https://picsum.photos/200/300?image=1069">

为什么canvas元素有这种行为


经过一番搜索,我发现应该避免对画布使用宽度/高度属性,因为它会缩放画布并且不会像我们想象的那样调整它的大小。

var canvas = document.querySelector("canvas"),
ctx = canvas.getContext("2d");
ctx.fillRect(0, 0, 150, 150);
canvas {
  width: 150px;
  height: 150px;
  border:1px solid red;
}
<canvas ></canvas>

直观地说,上面的代码应该生成一个150x150正方形,但我们以一个矩形结束!这是因为画布最初是300x150(默认尺寸),而我们的正方形是在里面绘制的。然后我们像处理图像一样缩放整个想法,并获得不需要的结果。

但是,使用属性将创建所需的结果:

var canvas = document.querySelector("canvas"),
ctx = canvas.getContext("2d");
ctx.fillRect(0, 0, 150, 150);
canvas {
  border:1px solid red;
}
<canvas height="150" width="150"></canvas>

这在某种程度上解释了为什么浏览器box-sizing为了避免收缩效应而忽略它,但它仍然违反直觉,因为它可能导致canvas. 如果这是原因,那么浏览器也应该这样做,img因为它们面临相同的收缩效果。

再说一次,为什么会有这种行为?为什么浏览器决定忽略box-sizing而不是缩小画布?

最重要的问题:这种行为在哪里定义?

我无法找到规范的哪一部分正在处理这个问题。

阿洛奇

作为猜测,我会说这是spec 中的这一段

当其canvas上下文模式为none时,canvas元素没有渲染上下文,其位图必须是全透明黑色,固有宽度等于元素width属性的数值,固有高度等于元素的数值height 属性,这些值在 CSS 像素中被解释,并随着属性的设置、更改或删除而更新。

即位必须取自高度和宽度属性。盒子尺寸无关紧要。

还要注意 HTML5 渲染部分说:

embed、iframe、img、object 或 video 元素上的 width 和 height 属性,以及在 Image Button 状态下具有 type 属性且表示图像或用户期望最终表示图像的 input 元素,映射到维度分别为元素的宽度和高度属性。

那里没有提到画布。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么宽度/高度不适用于未定位的伪元素?

为什么Fade过渡不适用于共享元素

为什么此代码不适用于svg元素?

为什么maxWidth属性不适用于EditText?

为什么isEqual:不适用于属性UIButton?

为什么输入模式属性不适用于数字?

为什么.foregroundColor属性不适用于NSMutableAttributedString?

为什么边框属性不适用于列表项?

为什么此过渡属性不适用于 css?

高度:100%; 不适用于Flex Box

为什么box-sizing属性没有padding-box值?

为什么“条件”属性不适用于“元素组”元素?

为什么方向属性不适用于块级元素

为什么HTML中“ <input>”标记中的“ size”属性仅适用于TEXT而不适用于NUMBER?

访问文字的属性适用于所有类型,但不适用于`int`;为什么?

CSS中的box-sizing属性是什么?

即使我已经应用了“box-sizing: border-box”,为什么我的输入元素比其他元素更宽?

为什么显示父元素时转换延迟不适用于子元素?

为什么除了高度和宽度之外的任何 CSS 都不适用于我的 div?

为什么 addClass 不适用于 Angular 中的 DOM 元素?

为什么CSS过滤器不适用于Chrome中的SVG元素?

为什么margin-top不适用于<i>元素?

.on()处理程序不适用于使用.html()创建的元素,为什么?

为什么“ z-index”不适用于具有转换的元素:translateY()

为什么动画不适用于所有类元素?

CSS图像替换:为什么kellum方法不适用于按钮元素?

为什么z-index样式不适用于<body>元素?

为什么z-index不适用于具有绝对位置的div元素

为什么同级选择器不适用于 contenteditable 元素?