HTML5'te tuval genişliği ve yüksekliği


181

Bir HTML5 canvasöğesinin genişliğini ve yüksekliğini düzeltmek mümkün mü ?

Olağan yol şudur:

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

Yanıtlar:


380

canvasDOM öğesi vardır .heightve .widthhiç özelliklerinin olduğunu uyumluluğunu height="…"ve width="…"nitelikler. Tuvalinizi yeniden boyutlandırmak için bunları JavaScript kodundaki sayısal değerlere ayarlayın. Örneğin:

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

Bu tuvali temizler, ancak bunu takip etmelisiniz ctx.clearRect( 0, 0, ctx.canvas.width, ctx.canvas.height); tamamen temizlemeyen tarayıcıları ele . Boyut değişikliğinden sonra görüntülenmesini istediğiniz içeriği yeniden çizmeniz gerekir.

Ayrıca, yükseklik ve genişliğin çizim için kullanılan mantıksal kanvas boyutları olduğunu ve ve CSS niteliklerinden farklı olduğunu unutmayın . CSS niteliklerini ayarlamazsanız, tuvalin gerçek boyutu görüntü boyutu olarak kullanılır; CSS niteliklerini ayarlarsanız ve bunlar tuval boyutlarından farklıysa, içeriğiniz tarayıcıda ölçeklendirilir. Örneğin:style.heightstyle.width

// 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';

4x oranında yakınlaştırılmış bir tuvalin bu canlı örneğine bakın .


1
@Hazaart Onları farklı ayarlamak istiyorsanız: $('#mycanvas').attr({width:400,height:300}).css({width:'800px',height:'600px'});Görsel boyutun piksel boyutuyla aynı olmasını istiyorsanız, stilleri asla ayarlamayın, yalnızca nitelikleri ayarlayın.
Phrogz

1
"Görsel boyutun piksel boyutuyla aynı olmasını istiyorsanız, asla stilleri, yalnızca nitelikleri ayarlamayın", bu tercihin bir nedeni var mı? ? Ben tuval birçok nesneleri var ve zoomin / ZoomOut, çok daha hızlı olacaktır istiyorsanız, sadece css, hayır ... (daha doğrusu tüm nesneler arasında döngü yerine) reset
EnglishAdam

3
@Gamemorize: CSS ile yakınlaştırma, görüntüyü bulanıklaştırır. Ancak, her nesnenin 'boyutunu' değiştirmek yerine bağlam ölçekleme ve yeniden çizim arasında çeviri yoluyla yakınlaştırma yapabilirsiniz.
Phrogz

1
Teşekkürler çok takdir. Şimdi CSS'nin ne yaptığını görüyorum ... tuvali bir görüntüye 'benziyor' gibi davranıyor, görüntüyü ölçeklendirmek açıkça 'yeniden çizmek' kadar iyi değil!
EnglishAdam

3
Ayrıca, tuvalde "görüntü oluşturma: pikselli" stilini kullanarak artık en azından Chrome'da "bulanık pikselli yakınlaştırma" yerine "net pikselli yakınlaştırma" yapabilirsiniz. Farkı göstermek için kemanını oynadım: jsfiddle.net/donhatch/9bheb/1663
Don Hatch

62

Bir tuvalin 2 boyutu, tuvaldeki piksellerin boyutu (arka mağaza veya drawingBuffer) ve ekran boyutu vardır. Piksel sayısı, tuval özellikleri kullanılarak ayarlanır. HTML'de

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

Veya JavaScript'te

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

Bundan ayrı olarak, tuvalin CSS stili genişliği ve yüksekliği

CSS'de

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

Veya JavaScript'te

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

Tuval 1x1 piksel yapmanın tartışmasız en iyi yolu , boyutu seçmek için DAİMA CSS KULLANMAK ve piksel sayısını bu boyuta ulaştırmak için küçük bir JavaScript yazmasıdır.

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

Neden bu en iyi yol? Çünkü çoğu durumda herhangi bir kodu değiştirmek zorunda kalmadan çalışır.

İşte tam bir pencere tuvali:

Ve işte bir paragrafta şamandıra olarak bir tuval

İşte oldukça büyük bir kontrol panelinde bir tuval

arka plan olarak bir tuval

Nitelikleri ayarlamadığım için her örnekte değişen tek şey CSS'dir (tuval söz konusu olduğunda)

Notlar:

  • Bir tuval elemanına kenarlık veya dolgu koymayın. Elemanın boyut sayısından çıkarılacak boyutu hesaplamak zahmetlidir

En iyi cevap, bu snippet'in standart bir DOM tuval yöntemi olması gerekir.
Rustypaper

23

Çok teşekkür ederim! Sonunda bu kod ile bulanık piksel sorunu çözüldü:

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

'Yarım piksel' ilavesi ile çizgileri bulanıklaştırma hile yapar.


26
@UpTheCreek Tuvalde bir çizgi çizerseniz, daha bulanık görünüyor, sanki bulanık görünüyor. Çizgileri yarım piksele (örneğin 50 yerine 50,5) koyarak güzel, temiz bir çizgi elde edersiniz. Bu genellikle kodunuzun en başında ctx.translate (0.5, 0.5) kullanılarak yapılır, böylece daha sonra unutabilirsiniz
Johan

-2

Bunu yapmanın en iyi yolu:

<canvas id="myChart" style="height: 400px; width: 100px;"></canvas>
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.