ความกว้างและความสูงของผืนผ้าใบใน HTML5


181

เป็นไปได้ไหมที่จะแก้ไขความกว้างและความสูงของcanvasองค์ประกอบHTML5

วิธีปกติคือต่อไปนี้:

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

คำตอบ:


380

canvasองค์ประกอบ DOM มี.heightและ.widthคุณสมบัติที่สอดคล้องกับheight="…"และwidth="…"คุณลักษณะ ตั้งค่าเป็นตัวเลขในรหัส JavaScript เพื่อปรับขนาด Canvas ของคุณ ตัวอย่างเช่น:

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

โปรดทราบว่านี่จะเป็นการลบผ้าใบแม้ว่าคุณควรทำตาม ctx.clearRect( 0, 0, ctx.canvas.width, ctx.canvas.height);เพื่อจัดการกับเบราว์เซอร์เหล่านั้นที่ไม่ได้ลบผ้าใบทั้งหมด คุณจะต้องวาดใหม่ของเนื้อหาใด ๆ ที่คุณต้องการแสดงหลังจากการเปลี่ยนแปลงขนาด

โปรดทราบว่าความสูงและความกว้างเป็นขนาดผ้าใบแบบลอจิคัลที่ใช้สำหรับการวาดและแตกต่างจากแอตทริบิวต์style.heightและstyle.widthCSS หากคุณไม่ได้ตั้งค่าแอตทริบิวต์ CSS ขนาดที่แท้จริงของ Canvas จะถูกใช้เป็นขนาดการแสดงผล หากคุณตั้งค่าแอตทริบิวต์ CSS และแตกต่างจากขนาดพื้นที่ผ้าใบเนื้อหาของคุณจะถูกปรับขนาดในเบราว์เซอร์ ตัวอย่างเช่น:

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


1
@Hazaart หากคุณต้องการตั้งค่าให้แตกต่างกัน: $('#mycanvas').attr({width:400,height:300}).css({width:'800px',height:'600px'});หากคุณต้องการให้ขนาดภาพเหมือนกับขนาดพิกเซลอย่าตั้งค่าสไตล์เลยห้ามใช้เฉพาะคุณลักษณะ
Phrogz

1
"หากคุณต้องการให้ขนาดภาพเหมือนกับขนาดพิกเซลไม่เคยกำหนดรูปแบบเฉพาะแอตทริบิวต์" มีเหตุผลสำหรับการตั้งค่านี้หรือไม่ ถ้าผมมีวัตถุจำนวนมากในผืนผ้าใบและฉันต้องการ ZoomIn / ZoomOut ก็จะได้เร็วขึ้นมากเพียงแค่ตั้งค่า CSS, ไม่มี (แทนที่จะห่วงผ่านวัตถุทั้งหมด) ... ?
EnglishAdam

3
@Gememorize: การซูมผ่าน CSS ทำให้มันพร่ามัว อย่างไรก็ตามคุณสามารถซูมผ่านการปรับขนาดบริบทและการแปลระหว่างการวาดใหม่แทนที่จะเปลี่ยน 'ขนาด' ของแต่ละวัตถุ
Phrogz

1
ขอบคุณมาก ฉันเห็นตอนนี้สิ่งที่ CSS กำลังทำ ... มันปฏิบัติต่อผืนผ้าใบ 'เหมือน' ภาพการปรับขนาดภาพไม่ชัดเท่าการวาดใหม่ '!
EnglishAdam

3
นอกจากนี้คุณสามารถทำ "ซูมแบบพิกเซลที่ชัดเจน" แทน "ซูมพิกเซลแบบเบลอ" อย่างน้อยบน Chrome โดยใช้สไตล์ "การแสดงผลภาพ: พิกเซล" บนผืนผ้าใบ ฉันเล่นซอของคุณเพื่อแสดงความแตกต่าง: jsfiddle.net/donhatch/9bheb/1663
ดอนแฮทช์

62

ผ้าใบมี 2 ขนาดขนาดของพิกเซลในผืนผ้าใบ (เป็นข้อมูลสำรองหรือ drawingBuffer) และขนาดการแสดงผล จำนวนพิกเซลถูกตั้งค่าโดยใช้แอ็ตทริบิวต์ canvas ในรูปแบบ HTML

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

หรือในจาวาสคริปต์

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

แยกออกจากนั้นคือความกว้างและความสูงของ CSS สไตล์ผ้าใบ

ใน CSS

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

หรือในจาวาสคริปต์

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

วิธีที่ดีที่สุดในการสร้าง Canvas 1x1 พิกเซลคือ ใช้ CSS เสมอเพื่อเลือกขนาดจากนั้นเขียน JavaScript เล็กน้อยเพื่อให้จำนวนพิกเซลตรงกับขนาดนั้น

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

ทำไมเป็นวิธีที่ดีที่สุด เพราะมันใช้งานได้ในกรณีส่วนใหญ่โดยไม่ต้องเปลี่ยนรหัสใด ๆ

นี่คือผืนผ้าใบแบบเต็มหน้าต่าง:

และนี่คือผืนผ้าใบที่ลอยอยู่ในย่อหน้า

นี่คือผืนผ้าใบในแผงควบคุมขนาดใหญ่

นี่คือผืนผ้าใบเป็นพื้นหลัง

เนื่องจากฉันไม่ได้ตั้งค่าคุณลักษณะสิ่งเดียวที่เปลี่ยนแปลงในแต่ละตัวอย่างคือ CSS (เท่าที่ผืนผ้าใบเกี่ยวข้อง)

หมายเหตุ:

  • อย่าใส่เส้นขอบหรือช่องว่างบนองค์ประกอบผ้าใบ การคำนวณขนาดเพื่อลบออกจากจำนวนมิติขององค์ประกอบนั้นลำบาก

คำตอบที่ดีที่สุดตัวอย่างนี้ควรเป็นวิธี DOM ผืนผ้าใบมาตรฐาน
rustypaper

23

ขอบคุณมาก! ในที่สุดฉันก็แก้ไขปัญหาพิกเซลเบลอด้วยรหัสนี้:

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

ด้วยการเพิ่มของ 'ครึ่งพิกเซล' ไม่หลอกลวงเพื่อแยกบรรทัด


26
@UpTheCreek หากคุณวาดเส้นบนผืนผ้าใบมันก็จะดูดีกว่าถ้ามันเบลอ โดยการใส่เส้นครึ่งพิกเซล (พูด 50.5 แทน 50) คุณจะได้เส้นที่ดีและสะอาด มักจะทำโดยใช้ ctx.translate (0.5, 0.5) ที่จุดเริ่มต้นของรหัสของคุณเพื่อให้คุณสามารถลืมมันในภายหลัง
Johan

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.