Tuval CSS kullanılırken gerilir ancak "genişlik" / "yükseklik" özellikleriyle normaldir


195

2 tuval var, biri HTML öznitelikleri kullanır widthve heightboyutlandırmak için, diğer CSS kullanır:

<canvas id="compteur1" width="300" height="300" onmousedown="compteurClick(this.id);"></canvas>
<canvas id="compteur2" style="width: 300px; height: 300px;" onmousedown="compteurClick(this.id);"></canvas>

Compteur1 gerektiği gibi görüntülenir, ancak compteur2 göstermez. İçerik 300x300'lik bir tuval üzerinde JavaScript kullanılarak çizilir.

Neden ekran farkı var?

alternatif metin

Yanıtlar:


216

O görünüyor widthve heightCSS özelliklerini sadece gösterilir hangi kutunun boyutunu belirlemek oysa koordinat sistemi var nitelikleri genişliği veya tuval yüksekliğini belirler.

Bu, http://www.whatwg.org/html#attr-canvas-width (JS gerekir) veya http://www.whatwg.org/c#attr-canvas-width adresinde açıklanmaktadır (muhtemelen bilgisayarınızı yiyecektir) :

canvasEleman, bit haritasının büyüklüğü kontrol etmek için iki özelliği vardır: widthve height. Bu öznitelikler belirtildiğinde, geçerli negatif olmayan tamsayılar olmalıdır . Negatif olmayan tamsayılar ayrıştırmak için kurallar onların sayısal değerleri elde etmek için kullanılmalıdır. Bir öznitelik eksikse veya değerini ayrıştırmak bir hata döndürürse, bunun yerine varsayılan değer kullanılmalıdır. width300 öznitelik varsayılan ve height150 öznitelik varsayılan.


11
gerçekten .. Ben her zaman "genişlik" ve "yükseklik" gibi doğrudan nitelikleri son html sürümlerinde kaldırıldı
düşündüm

4
Oh, görünüşe göre aslında whatwg.org/specs/web-apps/current-work/multipage/… (bölüm #attr-canvas-width) ' de oldukça iyi tanımlanmış . Sorun, daha widthönce yanlış tıkladım ve #dom-canvas-widthbunun yerine bölüme gittim . Bu konuda w3.org/Bugs/Public/show_bug.cgi?id=9469 dosyalandı .
SamB

3
Benzeyen ancak temelde diğerinden farklı bir API'ye sahip olmak (css width, height). Vay.
Ben Aston

1
Bunları dahili koordinat sisteminin farklı olmasını istediğiniz zamanlar için ayırmak önemlidir. (yani retina ekranlar veya 8 bit tarzı oyun için)
Samy Bencherif

1
Bu gerçekten kafa karıştırıcıydı. Biz burada css genişliği ve yüksekliğini ayarlamak için çalışıyor. Genişlik ve yükseklik ile ilgili bu 2 farklı yorumu öğrenmek için bize 2 gün saç stresi çekti. Sadece vay ...
NME Yeni Medya Eğlence

39

Ayarlamak widthve heightihtiyacınız için, kullanabilirsiniz

canvasObject.setAttribute('width', '475');

6
+1 el.setAttribute('width', parseInt($el.css('width')))hile yaptı, teşekkürler
Shanimal

9
Tuvalimin göreceli bir boyuta sahip olmasını istersem ne olur? Yani, bir width: 100%;css özelliği nasıl taklit edilir ?
Maxbester

1
Harika bir yanıt, ancak canvasObject.setAttribute ('height', '123') öğesini de eklemeyi unutmayın!
Tom Wells

.SetAttribute () kullanmanız gerektiğini düşünmüyorum .width ve .height özelliklerini her zaman kullandım
Zorgatone

4
GetComputedStyle : kullanarak düz JavaScript (jQuery olmadan) sürümü canvas.setAttribute('width', window.getComputedStyle(canvas, null).getPropertyValue("width"));. Yükseklik için tekrarlayın.
Ben J

25

İçin <canvas>elemanları, CSS kuralları widthve heightsayfaya çekilecek Tuval öğesi gerçek boyutunu ayarlayın. Öte yandan, tuval API'sinin kullanacağı koordinat sisteminin veya 'ızgaranın' HTML özellikleri widthve heightboyutunu ayarlar.

Örneğin, şunu düşünün ( jsfiddle ):

var ctx = document.getElementById('canvas1').getContext('2d');
ctx.fillStyle = "red";
ctx.fillRect(10, 10, 30, 30);

var ctx2 = document.getElementById('canvas2').getContext('2d');
ctx2.fillStyle = "red";
ctx2.fillRect(10, 10, 30, 30);
canvas {
  border: 1px solid black;
}
<canvas id="canvas1" style="width: 50px; height: 100px;" height="50" width="100"></canvas>
<canvas id="canvas2" style="width: 100px; height: 100px;" height="50" width="100"></canvas>

Her ikisi de tuval öğesinin iç koordinatlarına göre üzerlerine çizildi. Ancak ikinci tuvalde, kırmızı dikdörtgen iki kat daha geniş olacaktır, çünkü bir bütün olarak tuval CSS kurallarına göre daha büyük bir alana uzanmaktadır.

Not: CSS için kurallar widthve / veya heightbelirtilmezse, tarayıcı, öğeyi boyutlandırmak için HTML niteliklerini kullanır, böylece bu değerlerin 1 birimi sayfada 1 piksele eşit olur. Bu nitelikler belirtilmemişse sonra da bir varsayılan olacaktır widtharasında 300bir heightbir 150.


16

CSS'nizdeki genişliği ve yüksekliği ayarlarsanız tuval gerilir. Tuvalin boyutunu dinamik olarak değiştirmek istiyorsanız, JavaScript'i aşağıdaki gibi kullanmanız gerekir:

canvas = document.getElementById('canv');
canvas.setAttribute('width', '438');
canvas.setAttribute('height', '462');

1
Harika! Bu cevap için teşekkürler. Görüntünün gerilmesini önlemek için daha canvas.setAttributeönce koymak zorunda kaldım canvas.getContext('2d').
hhh

6

Tarayıcı css genişliğini ve yüksekliğini kullanır, ancak tuval öğesi tuval genişliğine ve yüksekliğine göre ölçeklenir. Javascript'te, css genişliğini ve yüksekliğini okuyun ve tuval genişliğini ve yüksekliğini buna ayarlayın.

var myCanvas = $('#TheMainCanvas');
myCanvas[0].width = myCanvas.width();
myCanvas[0].height = myCanvas.height();

2

Shannimal düzeltme

var el = $('#mycanvas');
el.attr('width', parseInt(el.css('width')))
el.attr('height', parseInt(el.css('height')))

0

CSS, tuval öğesinin genişliğini ve yüksekliğini ayarlar, böylece çizilmiş her şeyi eğri bırakarak koordinat alanını etkiler

İşte Vanilla JavaScript ile genişlik ve yüksekliği nasıl ayarlayacağım

canvas.width = numberForWidth

canvas.height = numberForHeight

-1

Örneğin CSS medya sorgularını temel alan dinamik bir davranış istiyorsanız, tuval genişliği ve yükseklik niteliklerini kullanmayın. CSS kurallarını kullanın ve ardından tuval oluşturma bağlamını almadan önce width ve height özelliklerine atayın CSS width ve height stilleri:

var elem = document.getElementById("mycanvas");

elem.width = elem.style.width;
elem.height = elem.style.height;

var ctx1 = elem.getContext("2d");
...

Yalnızca CSS'de boyut belirtilirse, bir tuvalin varsayılan koordinat boyutunu (300 x 150) alacağı açıktır. Ancak, bu öneri benim için işe yaramıyor, ancak aşağıdaki çözüm işe yarıyor.
Per Lindberg

@PerLindberg - Tuval çözümü için piksel cinsinden bir CSS genişliği ve yüksekliği tanımladıysanız bu çözüm çalışır.
Manolo
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.