किसी भी विस्तार पुस्तकालय के बिना, क्या एक ही कैनवास तत्व में कई परतें होना संभव है?
तो अगर मैं शीर्ष परत पर एक स्पष्ट व्याख्या करता हूं, तो यह नीचे वाले को नहीं मिटाएगा?
धन्यवाद।
किसी भी विस्तार पुस्तकालय के बिना, क्या एक ही कैनवास तत्व में कई परतें होना संभव है?
तो अगर मैं शीर्ष परत पर एक स्पष्ट व्याख्या करता हूं, तो यह नीचे वाले को नहीं मिटाएगा?
धन्यवाद।
जवाबों:
नहीं, हालाँकि, आप <canvas>
एक-दूसरे के ऊपर कई तत्वों को परत कर सकते हैं और कुछ इसी तरह पूरा कर सकते हैं।
<div style="position: relative;">
<canvas id="layer1" width="100" height="100"
style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="layer2" width="100" height="100"
style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
</div>
layer1
कैनवास पर अपनी पहली परत , और दूसरी परत को कैनवास पर खींचें layer2
। फिर जब आप clearRect
ऊपरी परत पर होते हैं, तो निचले कैनवास पर जो कुछ भी होता है, वह दिखाएगा।
display: none;
। या बस कैनवास को साफ करें, अगर यह परत को फिर से दिखाने के लिए इसे फिर से लाल करने के लिए सुपर महंगा नहीं है, तो परत को दिखाया जाना चाहिए।
इससे संबंधित:
यदि आपके पास अपने कैनवास पर कुछ है और आप इसके पीछे कुछ आकर्षित करना चाहते हैं - तो आप इसे संदर्भ में बदलकर कर सकते हैं। GlobalCompositeOperation सेटिंग को 'गंतव्य-ओवर' तक - और फिर इसे 'सोर्स-ओवर' पर लौटाएं जब आप ' फिर से किया।
var context = document.getElementById('cvs').getContext('2d');
// Draw a red square
context.fillStyle = 'red';
context.fillRect(50,50,100,100);
// Change the globalCompositeOperation to destination-over so that anything
// that is drawn on to the canvas from this point on is drawn at the back
// of what's already on the canvas
context.globalCompositeOperation = 'destination-over';
// Draw a big yellow rectangle
context.fillStyle = 'yellow';
context.fillRect(0,0,600,250);
// Now return the globalCompositeOperation to source-over and draw a
// blue rectangle
context.globalCompositeOperation = 'source-over';
// Draw a blue rectangle
context.fillStyle = 'blue';
context.fillRect(75,75,100,100);
<canvas id="cvs" />
आप canvas
उन्हें दस्तावेज़ में शामिल किए बिना कई तत्व बना सकते हैं । ये आपकी परतें होंगी :
फिर आप उनके साथ जो भी करना चाहते हैं और अंत में अपनी सामग्री को गंतव्य कैनवास पर उचित क्रम में उपयोग करके प्रस्तुत drawImage
करें context
।
उदाहरण:
/* using canvas from DOM */
var domCanvas = document.getElementById('some-canvas');
var domContext = domCanvas.getContext('2d');
domContext.fillRect(50,50,150,50);
/* virtual canvase 1 - not appended to the DOM */
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
ctx.fillStyle = 'blue';
ctx.fillRect(50,50,150,150);
/* virtual canvase 2 - not appended to the DOM */
var canvas2 = document.createElement('canvas')
var ctx2 = canvas2.getContext('2d');
ctx2.fillStyle = 'yellow';
ctx2.fillRect(50,50,100,50)
/* render virtual canvases on DOM canvas */
domContext.drawImage(canvas, 0, 0, 200, 200);
domContext.drawImage(canvas2, 0, 0, 200, 200);
और यहाँ कुछ कोडपेन है: https://codepen.io/anon/pen/mQWMMW
मुझे भी यही समस्या हो रही थी, मैंने स्थिति के साथ कई कैनवास तत्वों को: निरपेक्ष काम करता है, यदि आप आउटपुट को एक छवि में सहेजना चाहते हैं, तो यह काम नहीं करेगा।
इसलिए मैंने आगे बढ़कर कोड करने के लिए एक सरल लेयरिंग "सिस्टम" किया जैसे कि प्रत्येक परत का अपना कोड होता है, लेकिन यह सभी एक ही तत्व में प्रदान किया जाता है।
https://github.com/federicojacobi/layeredCanvas
मैं अतिरिक्त क्षमताओं को जोड़ने का इरादा रखता हूं, लेकिन अभी के लिए यह करेगा।
आप कई कार्य कर सकते हैं और उन्हें "नकली" परतों के लिए कॉल कर सकते हैं।
आप http://www.concretejs.com को भी चेकआउट कर सकते हैं , जो कि एक आधुनिक, हल्का, Html5 कैनवस फ्रेमवर्क है जो हिट डिटेक्शन, लेयरिंग और बहुत सी अन्य परिधीय चीजों को सक्षम बनाता है। आप इस तरह की चीजें कर सकते हैं:
var wrapper = new Concrete.Wrapper({
width: 500,
height: 300,
container: el
});
var layer1 = new Concrete.Layer();
var layer2 = new Concrete.Layer();
wrapper.add(layer1).add(layer2);
// draw stuff
layer1.sceneCanvas.context.fillStyle = 'red';
layer1.sceneCanvas.context.fillRect(0, 0, 100, 100);
// reorder layers
layer1.moveUp();
// destroy a layer
layer1.destroy();
मैं समझता हूं कि क्यू एक पुस्तकालय का उपयोग नहीं करना चाहता है, लेकिन मैं इसे Google खोजों से आने वाले अन्य लोगों के लिए पेश करूंगा। @EricRowell ने एक अच्छे प्लगइन का उल्लेख किया है, लेकिन, एक और प्लगइन भी है जिसे आप आज़मा सकते हैं, html2canvas ।
हमारे मामले में हम z-index
"उत्पाद निर्माता" विजेट के रूप में स्तरित पारदर्शी पीएनजी का उपयोग कर रहे हैं । Html2canvas ने शानदार ढंग से स्टैक को छवियों को धक्का दिए बिना उबालने के लिए काम किया, और न ही जटिलताओं, वर्कअराउंड और "गैर-उत्तरदायी" कैनवास का उपयोग किया। हम इसे वेनिला कैनवास + जेएस के साथ सुचारू रूप से करने में सक्षम नहीं थे।
z-index
एक रिश्तेदार तैनात आवरण के भीतर स्तरित सामग्री उत्पन्न करने के लिए पूर्ण divs पर पहला उपयोग । फिर html2canvas के माध्यम से रैपर को एक प्रदान किए गए कैनवास को प्राप्त करने के लिए पाइप करें, जिसे आप एक इमेज के रूप में छोड़ सकते हैं, या आउटपुट के रूप में, ताकि एक क्लाइंट इसे बचा सके।
लेकिन परत 02, परत 01 में सभी ड्राइंग को कवर करेगा। मैंने इसका उपयोग दोनों परतों में ड्राइंग दिखाने के लिए किया। उपयोग (पृष्ठभूमि-रंग: पारदर्शी;) शैली में।
<div style="position: relative;">
<canvas id="lay01" width="500" height="500" style="position: absolute; left: 0; top: 0; z-index: 0; background-color: transparent;">
</canvas>
<canvas id="lay02" width="500" height="500" style="position: absolute; left: 0; top: 0; z-index: 1; background-color: transparent;">
</canvas>
</div>