HTML5中的画布宽度和高度


181

是否可以固定HTML5 canvas元素的宽度和高度?

通常的方法如下:

<canvas id="canvas" width="300" height="300"></canvas>

Answers:


379

canvasDOM元素具有.height.width对应的属性的height="…"width="…"属性。在JavaScript代码中将它们设置为数值,以调整画布的大小。例如:

var canvas = document.getElementsByTagName('canvas')[0];
canvas.width  = 800;
canvas.height = 600;

请注意,这会清除画布,尽管您应该遵循此操作ctx.clearRect( 0, 0, ctx.canvas.width, ctx.canvas.height);来处理那些不能完全清除画布的浏览器。您需要重新绘制尺寸更改后想要显示的所有内容。

进一步注意的是,高度和宽度是用于绘制逻辑帆布尺寸和是不同的距离style.heightstyle.widthCSS属性。如果您未设置CSS属性,则画布的固有大小将用作其显示大小;如果您确实设置了CSS属性,并且它们与画布尺寸不同,则将在浏览器中缩放内容。例如:

// Make a canvas that has a blurry pixelated zoom-in
// with each canvas pixel drawn showing as roughly 2x2 on screen
canvas.width  = 400;
canvas.height = 300; 
canvas.style.width  = '800px';
canvas.style.height = '600px';

请参见此实时画布放大4倍的示例


1
@Hazaart如果要不同地设置它们:$('#mycanvas').attr({width:400,height:300}).css({width:'800px',height:'600px'});如果要使视觉尺寸与像素尺寸相同,则不要设置样式,而只能设置属性。
Phrogz

1
“如果要使视觉尺寸与像素尺寸相同,不要设置样式,而只能设置属性”,是否有这种偏好的原因?如果我在画布上有很多对象,并且想要放大/缩小,只需重置css会更快得多,不是吗(而不是遍历所有对象)...
EnglishAdam

3
@Gamemorize:通过CSS缩放使其模糊。但是,您可以通过上下文缩放和重绘之间的转换来缩放,而不用更改每个对象的“大小”。
Phrogz 2014年

1
非常感谢。现在我知道CSS正在做什么...它将画布“像”图像一样对待,缩放图像显然不如“重绘”它!
EnglishAdam

3
此外,您现在至少可以在Chrome上使用画布上的样式“ image-rendering:pixelated”来执行“清除像素化放大”,而不是“模糊像素化放大”。我摆弄你的小提琴以显示差异:jsfiddle.net/donhatch/9bheb/1663
Don Hatch

62

画布具有2种尺寸,即画布中像素的尺寸(它的后备存储区或drawingBuffer)以及显示尺寸。像素数是使用canvas属性设置的。在HTML中

<canvas width="400" height="300"></canvas>

或用JavaScript

someCanvasElement.width = 400;
someCanvasElement.height = 300;

与此不同的是画布的CSS样式的宽度和高度

在CSS中

canvas {  /* or some other selector */
   width: 500px;
   height: 400px;
}

或用JavaScript

canvas.style.width = "500px";
canvas.style.height = "400px";

可以将画布制作为1x1像素的最佳方法是始终使用CSS选择尺寸,然后编写少量JavaScript以使像素数量与该尺寸匹配。

function resizeCanvasToDisplaySize(canvas) {
   // look up the size the canvas is being displayed
   const width = canvas.clientWidth;
   const height = canvas.clientHeight;

   // If it's resolution does not match change it
   if (canvas.width !== width || canvas.height !== height) {
     canvas.width = width;
     canvas.height = height;
     return true;
   }

   return false;
}

为什么这是最好的方法?因为它在大多数情况下都可以工作,而无需更改任何代码。

这是一个全窗口画布:

这是一块浮在段落中的画布

这是一个相当大的控制面板中的画布

这是一张画布作为背景

因为我没有设置属性,所以每个示例中唯一更改的是CSS(就画布而言)

笔记:

  • 不要在画布元素上放置边框或填充。计算大小以从元素的维数中减去会很麻烦

最佳答案,此代码段应该是标准的DOM canvas方法。
rustypaper

23

非常感谢你!最后,我用以下代码解决了像素模糊的问题:

<canvas id="graph" width=326 height=240 style='width:326px;height:240px'></canvas>

通过添加“半像素”,可以消除线条模糊的问题。


26
@UpTheCreek如果您在画布上画一条线,则它看起来像股票行情指示器,应该看起来像是模糊的。通过将线条放在半像素上(例如,用50.5而不是50),您会得到一条漂亮,干净的线条。这通常是在代码的开头使用ctx.translate(0.5,0.5)完成的,因此您以后就可以忘记了
Johan

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.