एचटीएमएल 5 में कैनवास की चौड़ाई और ऊंचाई


181

क्या HTML5 canvasतत्व की चौड़ाई और ऊंचाई तय करना संभव है ?

सामान्य तरीका निम्नलिखित है:

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

जवाबों:


380

canvasडोम तत्व है .heightऔर .widthकरने के लिए गुण है कि अनुरूप height="…"और width="…"विशेषताओं। अपने कैनवास का आकार बदलने के लिए उन्हें जावास्क्रिप्ट कोड में संख्यात्मक मान पर सेट करें। उदाहरण के लिए:

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

ध्यान दें कि यह कैनवास को साफ करता है, हालांकि आपको ctx.clearRect( 0, 0, ctx.canvas.width, ctx.canvas.height);उन ब्राउज़रों को संभालने के लिए अनुसरण करना चाहिए जो कैनवास को पूरी तरह से साफ नहीं करते हैं। आपको आकार परिवर्तन के बाद आपके द्वारा प्रदर्शित किसी भी सामग्री को फिर से तैयार करना होगा।

आगे ध्यान दें कि ऊंचाई और चौड़ाई ड्राइंग के लिए उपयोग किए जाने वाले तार्किक कैनवास आयाम हैं और सीएसएस विशेषताओं से अलग हैं । यदि आप CSS विशेषताओं को सेट नहीं करते हैं, तो कैनवास के आंतरिक आकार को इसके प्रदर्शन आकार के रूप में उपयोग किया जाएगा; यदि आप CSS विशेषताओं को सेट करते हैं, और वे कैनवास आयामों से भिन्न होते हैं, तो आपकी सामग्री को ब्राउज़र में स्केल किया जाएगा। उदाहरण के लिए: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 द्वारा ज़ूम इन किया गया है।


1
@ हज़ारर्ट यदि आप उन्हें अलग तरीके से सेट करना चाहते हैं: $('#mycanvas').attr({width:400,height:300}).css({width:'800px',height:'600px'});यदि आप चाहते हैं कि दृश्य आकार पिक्सेल आकार के समान हो, तो कभी भी शैलियों को सेट न करें, केवल विशेषताएँ।
फ्रॉग्ज

1
"यदि आप चाहते हैं कि दृश्य आकार पिक्सेल आकार के समान हो, तो शैलियों को कभी सेट न करें, केवल विशेषताएँ", क्या इस वरीयता का कारण है? यदि मेरे पास कैनवास में कई ऑब्जेक्ट हैं और मैं ज़ूम / जूमआउट करना चाहता हूं, तो सीएसएस को रीसेट करने के लिए यह बहुत तेज़ होगा, नहीं! (सभी वस्तुओं के माध्यम से लूप के बजाय ...
EnglishAdam

3
@Gememorize: CSS के माध्यम से ज़ूम करने से यह धुंधला हो जाता है। हालाँकि, आप प्रत्येक ऑब्जेक्ट के 'आकार' को बदलने के बजाय रिड्यूस स्केलिंग के बीच संदर्भ स्केलिंग और अनुवाद के माध्यम से ज़ूम कर सकते हैं।
फ़रोज़

1
Thx बहुत सराहना की। मैं अब देखता हूं कि सीएसएस क्या कर रहा है ... यह कैनवास को 'एक छवि' की तरह मानता है, एक छवि को स्केल करना स्पष्ट रूप से उतना अच्छा नहीं है जितना कि 'पुन: ड्राइंग'!
अंग्रेजीएडम

3
इसके अलावा, अब आप कैनवास पर "धुंधली पिक्सेलयुक्त ज़ूम-इन" के बजाय "स्पष्ट पिक्सेलयुक्त ज़ूम-इन" कर सकते हैं, कम से कम क्रोम पर, शैली "छवि-प्रतिपादन: पिक्सेलयुक्त" का उपयोग कर सकते हैं। मैंने अंतर दर्शाने के लिए आपकी फिडेल्ड को दिखाया: jsfiddle.net/donhatch/9bheb/1663
डॉन हैच

62

एक कैनवास में 2 आकार होते हैं, कैनवास में पिक्सेल का आयाम (यह बैकिंगस्टोर या ड्रॉइंग बफ़र) और डिस्प्ले आकार होता है। पिक्सेल की संख्या कैनवास विशेषताओं का उपयोग करके सेट की गई है। HTML में

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

या जावास्क्रिप्ट में

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

उस से अलग कैनवास की सीएसएस शैली की चौड़ाई और ऊंचाई हैं

सीएसएस में

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

या जावास्क्रिप्ट में

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

यकीनन एक कैनवास 1x1 पिक्सल बनाने का सबसे अच्छा तरीका है, ALWAYS USE CSS आकार का चयन करने के फिर उस आकार से मेल खाने वाले पिक्सेल की संख्या बनाने के लिए एक छोटा सा जावास्क्रिप्ट लिखें।

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

यह सबसे अच्छा तरीका क्यों है? क्योंकि यह किसी भी कोड को बदलने के बिना ज्यादातर मामलों में काम करता है।

यहाँ एक पूर्ण विंडो कैनवास है:

और यहां एक पैराग्राफ में एक फ्लोट के रूप में एक कैनवास है

यहां एक बड़े आकार के नियंत्रण कक्ष में एक कैनवास है

यहाँ एक पृष्ठभूमि के रूप में एक कैनवास है

क्योंकि मैंने उन विशेषताओं को सेट नहीं किया था जो प्रत्येक नमूने में बदली सीएसएस है (जहाँ तक कैनवास का संबंध है)

टिप्पणियाँ:

  • एक कैनवास तत्व पर सीमाएं या गद्दी न डालें। तत्व के आयामों की संख्या से घटने के लिए आकार की गणना करना कष्टप्रद है

सर्वश्रेष्ठ उत्तर, यह स्निपेट एक मानक डोम कैनवास विधि होना चाहिए।
जंग खाकर

23

आपका बहुत बहुत धन्यवाद! अंत में मैंने इस कोड के साथ धुंधली पिक्सेल समस्या को हल किया:

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

'हाफ-पिक्सल' के जुड़ने के साथ ही यह अनब्लॉक लाइनों को ट्रिक करता है।


26
@UpTheCreek यदि आप कैनवास में एक रेखा खींचते हैं, तो यह टिकर दिखता है, जैसे कि यह धुंधला हो। आधे पिक्सेल्स पर लाइन लगाकर (जैसे, 50 के बजाय 50.5) आपको एक अच्छी, साफ लाइन मिलती है। यह अक्सर आपके कोड की शुरुआत में ctx.translate (0.5, 0.5) का उपयोग करके किया जाता है ताकि आप इसके बारे में भूल सकें
जोहान

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.