SVG
फ़ाइल प्रारूप की तरह ड्राइंग का एक विनिर्देश है। एक एसवीजी एक दस्तावेज है। आप HTML फ़ाइलों की तरह एसवीजी फाइलों का आदान-प्रदान कर सकते हैं। और इसके अतिरिक्त, क्योंकि SVG एलिमेंट्स और HTML एलिमेंट एक ही DOM API को साझा करते हैं, उसी तरह से जावास्क्रिप्ट का उपयोग करना उसी तरह से SVG DOM को जेनरेट करना संभव है जिस तरह से HTML DOM को बनाना संभव है। लेकिन आपको SVG फ़ाइल बनाने के लिए जावास्क्रिप्ट की आवश्यकता नहीं है। एक साधारण टेक्स्ट एडिटर एसवीजी लिखने के लिए पर्याप्त है। लेकिन ड्राइंग में आकृतियों के निर्देशांक की गणना करने के लिए आपको कम से कम कैलकुलेटर की आवश्यकता है।
CANVAS
सिर्फ एक ड्राइंग क्षेत्र है। कैनवास की सामग्री उत्पन्न करने के लिए जावास्क्रिप्ट का उपयोग करना आवश्यक है। आप एक कैनवस का आदान-प्रदान नहीं कर सकते। यह कोई दस्तावेज नहीं है। और कैनवास के तत्व डोम ट्री का हिस्सा नहीं हैं। आप एक कैनवास की सामग्री में हेरफेर करने के लिए DOM API का उपयोग नहीं कर सकते हैं। इसके बजाय आपको कैनवास में आकृतियाँ बनाने के लिए एक समर्पित कैनवास एपीआई का उपयोग करना होगा।
का लाभ यह SVG
है कि, आप एक दस्तावेज के रूप में ड्राइंग का आदान-प्रदान कर सकते हैं। का लाभCANVAS
है कि इसमें कंटेंट जेनरेट करने के लिए वर्बोज़ जावास्क्रिप्ट एपीआई कम है।
यहां एक उदाहरण दिया गया है, जो दर्शाता है कि आप समान परिणाम प्राप्त कर सकते हैं, लेकिन इसे जावास्क्रिप्ट में कैसे किया जाए, इसका तरीका बहुत अलग है।
// Italic S in SVG
(function () {
const ns='http://www.w3.org/2000/svg';
let s = document.querySelector('svg');
let p = document.createElementNS (ns, 'path');
p.setAttribute ('id', 'arc');
p.setAttribute ('d', 'M 0.9 -0.9 a 0.8,0.4 -10 0,0 -0.9,0.9');
s.appendChild (p);
let u = document.createElementNS (ns, 'use');
u.setAttribute ('href', '#arc');
u.setAttribute ('transform', 'rotate(180)');
s.appendChild (u);
})();
// Italic S in CANVAS
(function () {
let c = document.querySelector('canvas');
let w = c.width = c.clientWidth;
let h = c.height = c.clientHeight;
let x = c.getContext('2d');
x.lineWidth = 0.05 * w;
x.moveTo (w/2, h/2);
x.bezierCurveTo (w*0.02, h*0.4,
w*0.4, -h*0.02,
w*0.95, h*0.05);
x.moveTo (w/2, h/2);
x.bezierCurveTo (w*(1-0.02), h*(1-0.4),
w*(1-0.4), h*(1+0.02),
w*(1-0.95), h*(1-0.05));
x.stroke();
})();
svg, canvas {
width: 3em;
height: 3em;
}
svg {
vertical-align: text-top;
stroke: black;
stroke-width: 0.1;
fill: none;
}
canvas {
vertical-align: text-bottom;
}
div {
float: left;
}
<div><svg viewBox="-1 -1 2 2"></svg>VG</div>
<div>CANVA<canvas></canvas></div>
जैसा कि आप देख सकते हैं कि परिणाम लगभग समान है, लेकिन जावास्क्रिप्ट कोड पूरी तरह से अलग है।
SVG DOM API का उपयोग करके बनाया गया है createElement
, setAttribute
और appendChild
। सभी ग्राफिक्स फ़ीचर स्ट्रिंग्स में हैं। एसवीजी में अधिक शक्तिशाली आदिम हैं। उदाहरण के लिए CANVAS में SVG चाप पथ के बराबर कुछ भी नहीं है। CANVAS उदाहरण एसवीजी चाप को एक बेज़ियर वक्र के साथ अनुकरण करने की कोशिश करता है। एसवीजी में आप उन्हें बदलने के लिए तत्वों का पुन: उपयोग कर सकते हैं। CANVAS में आप तत्वों का पुन: उपयोग नहीं कर सकते। इसके बजाय आपको दो बार कॉल करने के लिए जावास्क्रिप्ट फ़ंक्शन लिखना होगा। एसवीजी के पास viewBox
सामान्यीकृत निर्देशांक का उपयोग करने की अनुमति है, जो रोटेशन को सरल करता है। CANVAS में आपको खुद के आधार पर निर्देशांक की गणना करनी होगीclientWidth
औरclientHeight
। और आप CSS के साथ सभी SVG एलिमेंट्स को स्टाइल कर सकते हैं। CANVAS में आप CSS के साथ कुछ भी स्टाइल नहीं कर सकते। क्योंकि SVG एक DOM है, आप सभी SVG एलिमेंट्स को इवेंट हैंडलर असाइन कर सकते हैं। CANVAS के तत्वों में कोई DOM और कोई DOM इवेंट हैंडलर नहीं है।
लेकिन दूसरी ओर CANVAS कोड को पढ़ना बहुत आसान है। आपको XML नाम रिक्त स्थान की परवाह करने की आवश्यकता नहीं है। और आप सीधे ग्राफिक्स फ़ंक्शन को कॉल कर सकते हैं, क्योंकि आपको डोम बनाने की आवश्यकता नहीं है।
सबक स्पष्ट है: यदि आप जल्दी से कुछ ग्राफिक्स खींचना चाहते हैं, तो CANVAS का उपयोग करें। यदि आपको ग्राफिक्स साझा करने की आवश्यकता है, तो इसे सीएसएस के साथ स्टाइल करना या अपने ग्राफिक्स में डोम इवेंट हैंडलर का उपयोग करना चाहते हैं, एक एसवीजी का निर्माण करें।