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


94

如何获取JavaScript中canvas元素的宽度和高度?

另外,我一直在阅读的画布的“上下文”是什么?

Answers:


122

可能值得看一下教程:Firefox Canvas教程

您可以通过访问画布元素的那些属性来简单获取其宽度和高度。例如:

var canvas = document.getElementById('mycanvas');
var width = canvas.width;
var height = canvas.height;

如果canvas元素中没有width和height属性,则将返回默认的300x150尺寸。要动态获取正确的宽度和高度,请使用以下代码:

const canvasW = canvas.getBoundingClientRect().width;
const canvasH = canvas.getBoundingClientRect().height;

或者使用较短的对象解构语法:

const { width, height } = canvas.getBoundingClientRect();

context是一个对象,你从画布到让你吸引到它。您可以将其context视为画布的API,它为您提供了使您能够在canvas元素上进行绘制的命令。


请注意,不幸的是,Mozilla教程现在基本上是一堆断开的链接。希望他们有一天能解决。
Sz。

1
这将返回上下文画布大小在Chrome 31
修治

12
这只有当widthheight直接指定为<canvas />标签的属性
vladkras

5
那是不对的。它总是返回一个值,即使没有标记属性,默认为300×150
迈克尔塞里奥特

请注意,getBoundingClientRect()有时包含边框。这可能会或可能不会影响,但是在我的CSS中,我将width和height设置为100,100,并且getBoundingClientRect返回102和102。clientHeight和clientWidth(或scrollHeight和scrollWidth)正确返回100。
DoomGoober

38

好吧,之前的所有答案都不完全正确。2个主要浏览器不支持这2个属性(IE是其中之一)或以不同方式使用它们。

更好的解决方案(大多数浏览器支持,但我没有检查Safari):

var canvas = document.getElementById('mycanvas');
var width = canvas.scrollWidth;
var height = canvas.scrollHeight;

至少我可以通过scrollWidth和-Height获得正确的值,并且在调整其大小时必须设置canvas.width和height。


IE9似乎确实支持canvas.width和height(在9之前的版本根本不支持canvas),我已经批准了。你遇到了什么麻烦?哪个是其他主要浏览器?
thomanski

1
是的,我真的从不更新IE,因为我不使用它。另一个主要的浏览器是Opera,它在调整大小时不会/不更新宽度和高度。
Bitterblue

2
canvas.width或height不返回画布的总大小,而是使用canvas.scrollWidth或height可以获取画布的总实际大小。
约旦

1
这对我有用,但其他答案没有。我一直在寻找一种解决方案,如果使用引导程序设置画布,则可以获取宽度和高度。
wanderer0810

21

提及的答案canvas.width返回画布的内部尺寸,即在创建元素时指定的尺寸:

<canvas width="500" height="200">

如果使用CSS调整画布大小,则可以通过.scrollWidth和访问其DOM尺寸.scrollHeight

var canvasElem = document.querySelector('canvas');
document.querySelector('#dom-dims').innerHTML = 'Canvas DOM element width x height: ' +
      canvasElem.scrollWidth +
      ' x ' +
      canvasElem.scrollHeight

var canvasContext = canvasElem.getContext('2d');
document.querySelector('#internal-dims').innerHTML = 'Canvas internal width x height: ' +
      canvasContext.canvas.width +
      ' x ' +
      canvasContext.canvas.height;

canvasContext.fillStyle = "#00A";
canvasContext.fillText("Distorted", 0, 10);
<p id="dom-dims"></p>
<p id="internal-dims"></p>
<canvas style="width: 100%; height: 123px; border: 1px dashed black">


那是正确的答案。2个尺寸要考虑。
纳迪尔

2
这应该是选定的答案。如果您未指定任何值并使用相对大小(在使用bootstrap ... etc时),则direct widthheightcall将始终返回300x150。谢谢。
mcy

16

上下文对象允许您操纵画布;例如,您可以绘制矩形等等。

如果要获取宽度和高度,则可以使用标准HTML属性widthheight

var canvas = document.getElementById( 'yourCanvasID' );
var ctx = canvas.getContext( '2d' );

alert( canvas.width );
alert( canvas.height ); 

3
这个答案与@andrewmu的答案几乎相同,如果通过CSS调整画布的大小,它将无法正常工作。请参阅我的答案以获得更强大的解决方案。
Dan Dascalescu 2015年

9

现在从2015年开始,所有(主要?)浏览器似乎运行缓慢c.widthc.height获得画布的内部尺寸,但是:

这个问题作为答案具有误导性,因为画布原则上具有2种不同/独立的尺寸。

“ html”可以说CSS宽度/高度和它自己的(属性-)宽度/高度

看一下这个不同大小的简短示例,我将200/200画布放入300/100 html元素中

在大多数示例(我所看到的所有示例)中,都没有设置css-size,因此,这些人隐含了(绘图)画布大小的宽度和高度。但这不是必须的,并且如果您选择了错误的大小,也可以产生有趣的结果。css宽度/高度用于内部定位。


0

这些都不对我有用。试试这个。

console.log($(canvasjQueryElement)[0].width)

0

这是一个CodePen,它使用canvas.height / width,CSS height / width和上下文正确呈现任何大小的画布

HTML:

<button onclick="render()">Render</button>
<canvas id="myCanvas" height="100" width="100" style="object-fit:contain;"></canvas>

CSS:

canvas {
  width: 400px;
  height: 200px;
  border: 1px solid red;
  display: block;
}

Javascript:

const myCanvas = document.getElementById("myCanvas");
const originalHeight = myCanvas.height;
const originalWidth = myCanvas.width;
render();
function render() {
  let dimensions = getObjectFitSize(
    true,
    myCanvas.clientWidth,
    myCanvas.clientHeight,
    myCanvas.width,
    myCanvas.height
  );
  myCanvas.width = dimensions.width;
  myCanvas.height = dimensions.height;

  let ctx = myCanvas.getContext("2d");
  let ratio = Math.min(
    myCanvas.clientWidth / originalWidth,
    myCanvas.clientHeight / originalHeight
  );
  ctx.scale(ratio, ratio); //adjust this!
  ctx.beginPath();
  ctx.arc(50, 50, 50, 0, 2 * Math.PI);
  ctx.stroke();
}

// adapted from: https://www.npmjs.com/package/intrinsic-scale
function getObjectFitSize(
  contains /* true = contain, false = cover */,
  containerWidth,
  containerHeight,
  width,
  height
) {
  var doRatio = width / height;
  var cRatio = containerWidth / containerHeight;
  var targetWidth = 0;
  var targetHeight = 0;
  var test = contains ? doRatio > cRatio : doRatio < cRatio;

  if (test) {
    targetWidth = containerWidth;
    targetHeight = targetWidth / doRatio;
  } else {
    targetHeight = containerHeight;
    targetWidth = targetHeight * doRatio;
  }

  return {
    width: targetWidth,
    height: targetHeight,
    x: (containerWidth - targetWidth) / 2,
    y: (containerHeight - targetHeight) / 2
  };
}

基本上,canvas.height / width设置要渲染到的位图的大小。然后,CSS高度/宽度会缩放位图以适合布局空间(通常在缩放时会变形)。然后,上下文可以使用矢量操作修改其比例以绘制为不同大小。


-1

我遇到了一个问题,因为我的画布位于没有ID的容器内,因此我在下面使用了此jquery代码

$('.cropArea canvas').width()

我总是在发布时使用它..天才是谁在拒绝我的答案?想知道..
布莱恩·桑切斯

jQuery是此小任务的主要依赖项。
sdgfsdh

我尝试了表决的选项,但对我没有用,所以我发布了我的解决方案,当您编码所需的时间是时间,时间是黄金时,为什么不使用jquery ?? ..有趣,然后为什么要投票?...
Brian Sanchez

1
JQuery给网站增加了很大的膨胀。它可以节省您的时间,但会降低用户的页面速度。您需要意识到这种折衷。
sdgfsdh
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.