Bir HTML5 tuvalinin genişliğini ve yüksekliğini nasıl elde ederim?


99

JavaScript öğesinin genişliğini ve yüksekliğini nasıl alabilirim?

Ayrıca, okumaya devam ettiğim tuvalin "bağlamı" nedir?

Yanıtlar:


131

Bir öğreticiye bakmaya değer olabilir: MDN Canvas Eğitimi

Bir tuval öğesinin genişliğini ve yüksekliğini yalnızca öğenin bu özelliklerine erişerek elde edebilirsiniz. Örneğin:

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

Tuval öğesinde genişlik ve yükseklik özellikleri yoksa, varsayılan 300x150 boyutu döndürülür. Doğru genişliği ve yüksekliği dinamik olarak elde etmek için aşağıdaki kodu kullanın:

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

Veya daha kısa nesne yıkıcı sözdizimini kullanarak:

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

Bu context, tuvalin içine çizim yapmanıza izin vermek için aldığınız bir nesnedir. Bunu context, tuval öğesi üzerinde çizim yapmanızı sağlayan komutları sağlayan tuval için API olarak düşünebilirsiniz .


Mozilla eğitiminin maalesef şu anda temelde bir grup bozuk bağlantı olduğunu unutmayın. Umarım bir gün düzeltirler.
Sz.

1
Bu, Chrome 31'de bağlam tuval boyutunu döndürür.
shuji

12
Bu durumunda çalışır widthve heightdoğrudan belirtilen <canvas />etiketi özelliklerinin
vladkras

5
Bu doğru değil. Her zaman etiket öznitelikleri olmasa bile bir değer döndürür, varsayılan olarak 300 x 150'dir.
Michael Theriot

GetBoundingClientRect () öğesinin bazen kenarlıklar içerdiğini unutmayın. Bu önemli olabilir veya olmayabilir, ancak CSS'mde genişliği ve yüksekliği 100,100 olarak ayarladım ve getBoundingClientRect 102, 102'yi döndürüyor. ClientHeight ve clientWidth (veya scrollHeight ve scrollWidth) 100'ü doğru olarak döndürüyor.
DoomGoober

38

Eh, önceki tüm cevaplar tamamen doğru değil. 2 büyük tarayıcı bu 2 özelliği desteklemiyor (IE bunlardan biridir) veya farklı şekilde kullanmıyor.

Daha iyi çözüm (çoğu tarayıcı tarafından destekleniyor, ancak Safari'yi kontrol etmedim):

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

En azından scrollWidth ve -Height ile doğru değerleri alıyorum ve yeniden boyutlandırıldığında canvas.width ve yüksekliği ayarlamalıdır.


IE9, canvas.width ve height'i destekliyor gibi görünüyor (9'dan önceki sürümler tuvali hiç desteklemiyordu), sadece bir şans verdim. Ne tür sıkıntılarla karşılaştın? Ve diğer büyük tarayıcı hangisi?
thomanski

1
Doğru, IE'yi gerçekten hiç güncellemiyorum çünkü kullanmıyorum. Diğer büyük tarayıcı, yeniden boyutlandırma sırasında genişliği ve yüksekliği güncellemeyen / güncellemeyen Opera'dır.
Bitterblue

2
canvas.width veya height, tuvalin toplam boyutunu döndürmez, tuvalin toplam gerçek boyutunu elde etmek için canvas.scrollWidth veya yüksekliği tercih edin.
Ürdün

1
Bu benim için çalıştı ama diğer cevaplar işe yaramadı. Tuval önyükleme kullanılarak ayarlanmışsa genişliği ve yüksekliği elde edebilecek bir çözüm arıyordum.
wanderer0810

22

Bahsedilen cevaplar canvas.width, tuvalin iç boyutlarını, yani öğeyi oluştururken belirtilenleri döndürür:

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

Tuvali CSS ile boyutlandırırsanız, DOM boyutlarına .scrollWidthve aracılığıyla erişilebilir .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">


bu doğru cevaptı. Dikkate alınması gereken 2 boyut.
Nadir

2
bu seçilen cevap olmalıdır. direct widthve heightcall, herhangi bir değer belirtmezseniz ve göreli boyutlandırma kullanırsanız (bootstrap kullanırken ... vb.) her zaman 300x150 döndürür. Teşekkürler.
mcy

16

Bağlam nesnesi, tuvali değiştirmenize olanak tanır; örneğin dikdörtgenler ve çok daha fazlasını çizebilirsiniz.

Genişliği ve yüksekliği elde etmek istiyorsanız, sadece standart HTML özelliklerini kullanabilirsiniz widthve height:

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

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

3
Bu cevap @ andrewmu's ile hemen hemen aynıdır ve tuvali CSS ile boyutlandırırsanız işe yaramayacaktır. Bkz Cevabımı daha sağlam bir çözüm.
Dan Dascalescu

9

şimdi 2015'ten itibaren tüm (büyük?) tarayıcılar küçülmüş c.widthve c.heighttuvalin boyutunu alacak gibi görünüyor , ancak:

Cevaplar olarak soru yanlış yönlendiricidir, çünkü tuvalin prensipte 2 farklı / bağımsız boyutu vardır.

"Html", CSS genişliği / yüksekliği ve kendi (öznitelik-) genişliği / yüksekliği diyelim

200/200 tuvali bir 300/100 html öğesine koyduğum bu farklı boyutlandırma örneğine bakın

Çoğu örnekte (gördüğüm tek şey) css boyutu kümesi yoktur, bu nedenle bunlar (çizim) tuval boyutunun genişliğini ve yüksekliğini ifade eder. Ancak bu bir zorunluluk değildir ve yanlış beden alırsanız komik sonuçlar verebilir - yani. iç konumlandırma için css genişlik / yükseklik.


0

Bunların hiçbiri benim için çalışmadı. Bunu dene.

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

0

İşte, herhangi bir boyuttaki herhangi bir tuvali doğru şekilde oluşturmak için canvas.height / width, CSS yüksekliği / genişliği ve bağlamı kullanan bir CodePen .

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

Temel olarak, canvas.height / width, oluşturduğunuz bitmap'in boyutunu ayarlar. CSS yüksekliği / genişliği daha sonra bitmap'i mizanpaj alanına sığacak şekilde ölçeklendirir (genellikle ölçeklendirirken onu çarpıtır). Bağlam daha sonra, farklı boyutlarda vektör işlemlerini kullanarak çizmek için ölçeğini değiştirebilir.


-1

Bir sorun yaşadım çünkü tuvalim kimliği olmayan bir kabın içindeydi, bu yüzden aşağıdaki jquery kodunu kullandım

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

Her zaman kullandığım zaman mesaj gönderiyorum .. Cevabımı reddeden dahi kim? bilmek isterim ..
Brian Sanchez

JQuery, bu küçük görev için büyük bir bağımlılıktır.
sdgfsdh

Oylanan seçeneği denedim ve benim için çalışmadım, bu yüzden çözümümü gönderdim, kodlama yaparken ihtiyacınız olan şey zaman, zaman altın, bu yüzden neden jquery kullanmıyorsunuz ?? .. ilginç, o zaman neden olumsuz oy kullanıyorsunuz? ...
Brian Sanchez

1
JQuery, bir web sitesine önemli ölçüde şişkinlik ekler. Size zaman kazandırabilir, ancak kullanıcılarınız için sayfayı yavaşlatır. Bu değiş tokuşun farkında olmalısınız.
sdgfsdh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.