How do I get the width and height of a HTML5 canvas?

后端 未结 8 1242
陌清茗
陌清茗 2020-12-13 17:04

How can i get the width and height of the canvas element in JavaScript?

Also, what is the \"context\" of the canvas I keep reading about?

相关标签:
8条回答
  • 2020-12-13 17:11

    The answers mentioning canvas.width return the internal dimensions of the canvas, i.e. those specified when creating the element:

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

    If you size the canvas with CSS, its DOM dimensions are accessible via .scrollWidth and .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">

    0 讨论(0)
  • 2020-12-13 17:18

    Well, all the answers before aren't entirely correct. 2 of major browsers don't support those 2 properties (IE is one of them) or use them differently.

    Better solution (supported by most browsers, but I didn't check Safari):

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

    At least I get correct values with scrollWidth and -Height and MUST set canvas.width and height when it is resized.

    0 讨论(0)
  • 2020-12-13 17:22

    The context object allows you to manipulate the canvas; you can draw rectangles for example and a lot more.

    If you want to get the width and height, you can just use the standard HTML attributes width and height:

    var canvas = document.getElementById( 'yourCanvasID' );
    var ctx = canvas.getContext( '2d' );
    
    alert( canvas.width );
    alert( canvas.height ); 
    
    0 讨论(0)
  • 2020-12-13 17:24

    None of those worked for me. Try this.

    console.log($(canvasjQueryElement)[0].width)
    
    0 讨论(0)
  • 2020-12-13 17:24

    Here's a CodePen that uses canvas.height/width, CSS height/width, and context to correctly render any canvas at any size.

    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
      };
    }
    

    Basically, canvas.height/width sets the size of the bitmap you are rendering to. The CSS height/width then scales the bitmap to fit the layout space (often warping it as it scales it). The context can then modify it's scale to draw, using vector operations, at different sizes.

    0 讨论(0)
  • 2020-12-13 17:29

    It might be worth looking at a tutorial: MDN Canvas Tutorial

    You can get the width and height of a canvas element simply by accessing those properties of the element. For example:

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

    If the width and height attributes are not present in the canvas element, the default 300x150 size will be returned. To dynamically get the correct width and height use the following code:

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

    Or using the shorter object destructuring syntax:

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

    The context is an object you get from the canvas to allow you to draw into it. You can think of the context as the API to the canvas, that provides you with the commands that enable you to draw on the canvas element.

    0 讨论(0)
提交回复
热议问题