HTML宽度属性和CSS宽度属性(画布)之间的区别? [复制]

Posted

技术标签:

【中文标题】HTML宽度属性和CSS宽度属性(画布)之间的区别? [复制]【英文标题】:Difference between HTML width attribute and CSS width property (canvas)? [duplicate] 【发布时间】:2016-04-17 13:59:21 【问题描述】:

当我注意到一些奇怪的东西时,我正试图在画布上画一个圆圈 - 基本上,当我通过 CSS 定义画布的尺寸时,元素超出了比例 - 看起来像是“被压扁了”。

但如果我通过“宽度”和“高度”html 属性设置尺寸,它会正常呈现。

$(document).ready(function() 

  function highlightAreaTrial(elementId, x, y, radius) 
    console.log("x, y: " + x + ", " + y);
    canvas = document.getElementById(elementId);
    ctx = canvas.getContext('2d');
    ctx.beginPath();
    ctx.arc(x, y, radius, 0, 2*Math.PI);
    ctx.strokeStyle="#FF0000";
    ctx.stroke();
  

  highlightAreaTrial("trial", 50, 50, 20);
  highlightAreaTrial("myCanvas", 50, 50, 20);

);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<canvas id="trial" style="height: 100px; width: 100px; border: 1px solid black;"></canvas>
    
<canvas id="myCanvas"   style="border:1px solid #d3d3d3;"></canvas>

这是一个小提琴:https://jsfiddle.net/codeapprenti/vnoukemm/

有人可以解释这种行为吗?

谢谢。

【问题讨论】:

我已更新您的问题,以便两个示例使用相同的维度来重现您所描述的问题。 CSS 用于像素。您可以在 CSS 中设置上下左右的像素数。元素属性是屏幕显示尺寸并定义页面/窗口的大小。虽然只有在标记中有画布时才会出现这种情况。如果您在 javascript 中创建画布,元素的宽度和高度属性也会设置画布像素分辨率。 您的问题经常在这里被问到。使用 CSS 调整画布大小时,您正在拉伸(或挤压)像素,直到原始绘图适合新的 CSS 尺寸。将其视为带有徽标的 T 恤。如果您拉伸衬衫,徽标会因拉伸而变形……与画布图纸相同——它们会拉伸和收缩。另一方面,更改画布元素的宽度/高度 (canvas.width=400) 您实际上是在向画布绘图表面添加或删除像素——因此不会发生变形。如果这有意义,您可能会删除您的问题 b/ 它是重复的。 ;-) @markE 解释很清楚,但只是为了尊重每个努力评论和回答的人,我想我会保留它。不过谢谢。 :) 【参考方案1】:

根据相关规范:

4.8.11 The canvas element — HTML5

canvas元素有两个属性来控制坐标空间的大小:widthheight。这些属性在指定时必须具有有效的非负整数值。必须使用解析非负整数的规则来获取它们的数值。如果缺少某个属性,或者如果解析其值返回错误,则必须使用 默认值。 width属性默认为300,height属性默认为150。

已添加重点。

在您的情况下,由于第一个元素 #trail 没有 widthheight 属性,因此属性值默认为 width="300" height="150",这就是您看到差异的原因。

本质上,width/height 属性设置画布坐标空间的固有尺寸,而 CSS 属性设置canvas 元素的实际大小:

canvas 元素的固有尺寸等于坐标空间的大小,数字以 CSS 像素解释。但是,可以通过样式表任意调整元素的大小。在渲染过程中,图像会被缩放以适应此布局大小。

因此,如果您为canvas 元素赋予width="100" height="100" 属性,然后将CSS 宽度设置为100%,则图像将被缩放以适应布局,同时保持纵横比(example)。

【讨论】:

非常有帮助 - 所以当你缩放它时,它会变得模糊。谢谢。【参考方案2】:

heightwidth 属性定义画布的固有大小(坐标空间)。默认情况下,它也会以该大小呈现。

如果更改 CSS widthheight,画布将以新的大小呈现,但坐标空间不会改变。所以相同的内容将被缩放以适应画布的渲染大小。

【讨论】:

以上是关于HTML宽度属性和CSS宽度属性(画布)之间的区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用 CSS 时画布会被拉伸,但“宽度”/“高度”属性正常

使用 CSS 时画布会被拉伸,但使用“宽度”/“高度”属性是正常的

画布的 HTML 属性(宽度、高度)独立变化

IE9 中 CSS 高度为 100% 的画布

如何获取 HTML5 画布的宽度和高度?

ThreeJS canvas画布自适应的原理