Apa perbedaan antara SVG dan HTML5 Canvas? Mereka berdua sepertinya melakukan hal yang sama padaku. Pada dasarnya, mereka berdua menggambar karya seni vektor menggunakan titik koordinat.
Apa yang saya lewatkan? Apa perbedaan utama antara SVG dan HTML5 Canvas? Mengapa saya harus memilih salah satu dari yang lain?
Jawaban:
Lihat Wikipedia: http://en.wikipedia.org/wiki/Canvas_element
UPDATE: Saya menggunakan SVG karena kemampuan bahasa markupnya - dapat diproses oleh XSLT dan dapat menampung markup lain di node-nya. Demikian pula saya bisa memegang SVG di markup saya (kimia). Ini memungkinkan saya untuk memanipulasi atribut SVG (mis. Rendering) dengan kombinasi markup. Ini mungkin dilakukan di Canvas tapi saya rasa ini jauh lebih sulit.
sumber
SVG seperti program "menggambar". Gambar ditentukan sebagai instruksi menggambar untuk setiap bentuk dan setiap bagian dari bentuk apa pun dapat diubah. Gambar berorientasi pada bentuk.
Kanvas itu seperti program "melukis". Setelah piksel menyentuh layar, itulah gambar Anda. Anda tidak dapat mengubah bentuk kecuali dengan menimpanya dengan piksel lain. Lukisan berorientasi piksel.
Mampu mengubah gambar sangat penting untuk beberapa program; misalnya membuat draf aplikasi, alat diagram, dll. Jadi, SVG memiliki keuntungan di sini.
Mampu mengontrol piksel individu penting untuk beberapa program artistik.
Mendapatkan kinerja animasi yang luar biasa untuk manipulasi pengguna melalui seret mouse lebih mudah dengan Canvas daripada SVG.
Satu piksel pada layar komputer akan sering memakan 4 byte informasi dan layar komputer saat ini membutuhkan beberapa megabyte. Jadi Canvas mungkin tidak nyaman jika Anda ingin membiarkan pengguna mengedit gambar dan kemudian menguploadnya lagi.
Sebaliknya, menggambar beberapa bentuk yang menutupi seluruh layar menggunakan SVG membutuhkan beberapa byte, mengunduh dengan cepat, dan dapat diunggah lagi dengan mudah dengan keuntungan yang sama menuju ke arah itu seperti ketika turun ke arah lain. Jadi SVG bisa lebih cepat dari Canvas.
Google menerapkan Google Maps dengan SVG. Itu memberi aplikasi web kinerja lincah dan pengguliran yang mulus.
sumber
Ringkasan Tingkat Tinggi Canvas vs. SVG
Kanvas
SVG
Untuk perbedaan mendetail, baca http://msdn.microsoft.com/en-us/library/ie/gg193983(v=vs.85).aspx
sumber
Ada perbedaan dalam hal itu, dan apa yang mereka lakukan untuk Anda.
Untuk menguraikan sedikit, tentang format versus API:
Dengan svg Anda dapat melihat, menyimpan dan mengedit file di berbagai alat. Dengan kanvas yang baru saja Anda gambar, dan tidak ada yang disimpan tentang apa yang baru saja Anda lakukan selain dari gambar yang dihasilkan di layar. Anda dapat menganimasikan keduanya, SVG menangani penggambaran ulang untuk Anda hanya dengan melihat elemen dan atribut yang ditentukan, sedangkan dengan kanvas Anda harus menggambar ulang setiap bingkai sendiri menggunakan API. Anda dapat menskalakan keduanya, tetapi SVG melakukannya secara otomatis, sementara dengan kanvas lagi, Anda harus mengeluarkan kembali perintah gambar untuk ukuran yang diberikan.
sumber
Dua hal yang paling menarik bagi saya untuk SVG dan Canvas adalah,
Kemampuan untuk menggunakan Canvas tanpa DOM, dimana SVG sangat bergantung pada DOM dan ketika kompleksitas meningkatkan kinerja melambat. Seperti dalam desain game.
Keuntungan menggunakan SVG adalah resolusinya tetap sama di seluruh platform yang tidak memiliki Canvas.
Lebih banyak detail disediakan di situs ini. http://dev.opera.com/articles/view/svg-or-canvas-choosing-between-the-two/
sumber
Ini sangat tergantung pada kebutuhan / kebutuhan Anda.
Jika Anda hanya ingin menampilkan gambar / grafik di layar maka pendekatan yang disarankan adalah kanvas. (Contohnya adalah PNG, GIF, BMP dll.)
Jika Anda ingin memperluas fitur grafik Anda misalnya jika Anda mengarahkan mouse pada grafik ingin memperbesar area tertentu tanpa merusak kualitas tampilan maka Anda pilih SVG. (Contoh yang bagus adalah file AutoCAD, Visio, GIS).
Jika Anda ingin membangun alat pembuat diagram aliran dinamis dengan konektor bentuk, lebih baik memilih SVG daripada CANVAS.
Saat ukuran layar meningkat, kanvas mulai menurun karena semakin banyak piksel yang perlu digambar.
Saat jumlah objek meningkat di layar, SVG mulai
menurun saat kami terus menambahkannya ke DOM.
Lihat juga: http://msdn.microsoft.com/en-us/library/gg193983(v=vs.85).aspx
sumber
SVG
Berdasarkan kasus penggunaan, SVG digunakan untuk logo, bagan karena grafik vektornya Anda gambar dan lupakan. Ketika port tampilan berubah seperti mengubah ukuran (atau zoom) itu akan menyesuaikan sendiri dan tidak perlu menggambar ulang.
Kanvas
Kanvas adalah bitmap (atau raster) yang dilakukan dengan melukis piksel ke layar. Ini digunakan untuk mengembangkan game atau pengalaman grafis ( https://www.chromeexperiments.com/webgl ) di area tertentu, ia mengecat piksel dan mengubahnya dengan menggambar ulang yang lain. Karena ini jenis raster, kita perlu menggambar ulang sepenuhnya saat port tampilan berubah.
Referensi
http://www.sitepoint.com/7-reasons-to-consider-svgs-instead-of-canvas
http://en.wikipedia.org/wiki/WebGL
http://vector-conversions.com/vectorizing/raster_vs_vector.html
sumber
SVG
adalah spesifikasi gambar seperti format file. SVG adalah dokumen. Anda dapat bertukar file SVG seperti file HTML. Selain itu, karena elemen SVG dan elemen HTML berbagi API DOM yang sama, JavaScript dapat digunakan untuk membuat DOM SVG dengan cara yang sama seperti membuat DOM HTML. Tetapi Anda tidak membutuhkan JavaScript untuk menghasilkan file SVG. Editor teks sederhana sudah cukup untuk menulis SVG. Tapi Anda membutuhkan setidaknya kalkulator untuk menghitung koordinat bentuk pada gambar.CANVAS
hanyalah area menggambar. Itu perlu menggunakan JavaScript untuk menghasilkan konten kanvas. Anda tidak bisa bertukar kanvas. Ini bukan dokumen. Dan elemen kanvas bukanlah bagian dari pohon DOM. Anda tidak dapat menggunakan API DOM untuk memanipulasi konten kanvas. Sebagai gantinya Anda harus menggunakan API kanvas khusus untuk menggambar bentuk ke kanvas.Keuntungan dari a
SVG
adalah, Anda dapat menukar gambar tersebut sebagai dokumen. Keuntungan dariCANVAS
is, yaitu memiliki JavaScript API yang lebih sedikit untuk menghasilkan konten.Berikut adalah sebuah contoh, yang menunjukkan bahwa Anda dapat mencapai hasil yang serupa, tetapi cara melakukannya di JavaScript sangat berbeda.
// 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>
Seperti yang Anda lihat, hasilnya hampir sama, tetapi kode JavaScript-nya sangat berbeda.
SVG dibuat dengan DOM API menggunakan
createElement
,setAttribute
danappendChild
. Semua grafik ada dalam string atribut. SVG memiliki primitif yang lebih kuat. CANVAS misalnya tidak memiliki apa pun yang setara dengan jalur busur SVG. Contoh CANVAS mencoba meniru busur SVG dengan kurva Bezier. Dalam SVG Anda dapat menggunakan kembali elemen untuk mengubahnya. Di CANVAS Anda tidak dapat menggunakan kembali elemen. Sebagai gantinya, Anda harus menulis fungsi JavaScript untuk memanggilnya dua kali. SVG memilikiviewBox
yang memungkinkan untuk menggunakan koordinat yang dinormalisasi, yang menyederhanakan rotasi. Di CANVAS Anda harus menghitung sendiri koordinatnya berdasarkanclientWidth
danclientHeight
. Dan Anda dapat mengatur gaya semua elemen SVG dengan CSS. Di CANVAS Anda tidak dapat mengatur gaya apa pun dengan CSS. Karena SVG adalah DOM, Anda dapat menetapkan penangan kejadian ke semua elemen SVG. Elemen di CANVAS tidak memiliki DOM dan tidak ada penangan kejadian DOM.Namun di sisi lain kode CANVAS jauh lebih mudah dibaca. Anda tidak perlu peduli dengan ruang nama XML. Dan Anda bisa langsung memanggil fungsi grafik, karena Anda tidak perlu membangun DOM.
Pelajarannya jelas: jika Anda ingin menggambar beberapa grafik dengan cepat, gunakan CANVAS. Jika Anda perlu membagikan grafik, ingin menatanya dengan CSS atau ingin menggunakan event handler DOM dalam grafik Anda, buat SVG.
sumber
menambahkan ke poin di atas:
SVG ringan untuk ditransfer melalui web jika dibandingkan dengan JPEG, GIF dll dan juga sangat diskalakan saat diubah ukurannya tanpa kehilangan Kualitas.
sumber
SVG
Ini adalah berbasis Model Objek.
Cocok untuk menggunakan area rendering yang luas.
SVG memberikan dukungan apa pun untuk penangan acara.
Modifikasi diperbolehkan melalui skrip dan CSS.
SVG memiliki skalabilitas yang lebih baik
SVG berbasis Vektor (terdiri dari bentuk).
SVG tidak cocok untuk grafik Game. SVG tidak bergantung pada resolusi.
SVG mampu untuk animasi API.
SVG cocok untuk pencetakan dengan kualitas tinggi dan resolusi apa pun.
Elemen kanvas
Ini berbasis piksel.
Cocok untuk menggunakan rendering kecil
Canvas tidak menyediakan bantuan apa pun untuk penangan acara.
Modifikasi hanya diperbolehkan melalui skrip.
Canvas memiliki skalabilitas yang buruk.
Kanvas berbasis Raster (terdiri dari piksel).
Canvas cocok untuk grafis game.
Kanvas sepenuhnya bergantung pada resolusi.
Canvas tidak memiliki API untuk animasi.
Kanvas tidak cocok untuk pencetakan kualitas tinggi dan resolusi tinggi.
sumber