Solusi bersih, cepat, dan mudah diposting pada tanggal jawaban ini tidak memuaskan. Mereka dikonstruksi atas pernyataan yang salah bahwa dokumen SVG tidak memiliki urutan. Perpustakaan juga tidak perlu. Satu baris kode dapat melakukan sebagian besar operasi untuk memanipulasi urutan objek atau kelompok objek yang mungkin diperlukan dalam pengembangan aplikasi yang memindahkan objek 2D di sekitar dalam ruang xyz.
Z Memesan Pasti Ada dalam Fragmen Dokumen SVG
Apa yang disebut fragmen dokumen SVG adalah pohon elemen yang diturunkan dari SVGElement tipe simpul dasar. Node akar fragmen dokumen SVG adalah SVGSVGElement, yang terkait dengan tag <svg> HTML5 . SVGGElement terkait dengan tag <g> dan mengizinkan anak-anak yang bergabung.
Memiliki atribut z-index pada SVGElement seperti pada CSS akan mengalahkan model rendering SVG. Bagian 3.3 dan 3.4 dari Rekomendasi W3C SVG v1.1 Edisi ke-2 menyatakan bahwa SVG mendokumentasikan fragmen (pohon keturunan dari SVGSVGElement) dibuat dengan menggunakan apa yang disebut pencarian pertama kedalaman pohon . Skema itu adalah urutan az dalam setiap pengertian istilah.
Z order sebenarnya adalah jalan pintas visi komputer untuk menghindari kebutuhan rendering 3D sejati dengan kerumitan dan tuntutan komputasi penelusuran sinar. Persamaan linear untuk indeks-z elemen secara implisit dalam fragmen dokumen SVG.
z-index = z-index_of_svg_tag + depth_first_tree_index / tree_node_qty
Ini penting karena jika Anda ingin memindahkan lingkaran yang berada di bawah kotak ke atasnya, Anda cukup memasukkan kotak sebelum lingkaran. Ini dapat dilakukan dengan mudah dalam JavaScript.
Metode Pendukung
Mesin virtual SVGElement memiliki dua metode yang mendukung manipulasi urutan z yang sederhana dan mudah.
- parent.removeChild (anak)
- parent.insertBefore (child, childRef)
Jawaban yang Benar yang Tidak Membuat Pesan
Karena tag SVGGElement ( <g> ) dapat dihapus dan dimasukkan semudah SVGCircleElement atau bentuk lainnya, lapisan gambar yang khas dari produk Adobe dan alat grafis lainnya dapat diimplementasikan dengan mudah menggunakan SVGGElement. JavaScript ini pada dasarnya adalah perintah Move Below .
parent.insertBefore(parent.removeChild(gRobot), gDoorway)
Jika lapisan robot digambar sebagai anak-anak dari SVGGElement gRobot sebelum pintu digambar sebagai anak-anak dari SVGGElement gDoorway, robot sekarang berada di belakang pintu karena z urutan pintu sekarang adalah satu ditambah z urutan robot.
Perintah Move Above hampir semudah ini.
parent.insertBefore(parent.removeChild(gRobot), gDoorway.nextSibling())
Pikirkan a = a dan b = b untuk mengingat ini.
insert after = move above
insert before = move below
Meninggalkan DOM dalam Status yang Konsisten Dengan Tampilan
Alasan jawaban ini benar adalah karena itu minimal dan lengkap dan, seperti internal produk Adobe atau editor grafis yang dirancang dengan baik, meninggalkan representasi internal dalam keadaan yang konsisten dengan tampilan yang dibuat oleh rendering.
Pendekatan Alternatif Tapi Terbatas
Pendekatan lain yang biasa digunakan adalah menggunakan CSS z-index dalam hubungannya dengan beberapa fragmen dokumen SVG (tag SVG) dengan latar belakang sebagian besar transparan di semua kecuali yang bawah. Sekali lagi, ini mengalahkan keanggunan model rendering SVG, membuatnya sulit untuk memindahkan objek ke atas atau ke bawah dalam urutan z.
CATATAN:
- ( https://www.w3.org/TR/SVG/render.html v 1.1, Edisi 2, 16 Agustus 2011)
3.3 Elemen Urutan Rendering dalam fragmen dokumen SVG memiliki urutan gambar implisit, dengan elemen pertama dalam fragmen dokumen SVG mendapatkan "dicat" terlebih dahulu. Elemen-elemen selanjutnya dilukis di atas elemen-elemen yang sebelumnya dilukis.
3.4 Bagaimana kelompok diberikan Elemen pengelompokan seperti elemen 'g' (lihat elemen wadah) memiliki efek menghasilkan kanvas terpisah sementara diinisialisasi ke hitam transparan ke mana elemen anak-anak dicat. Setelah menyelesaikan grup, setiap efek filter yang ditentukan untuk grup diterapkan untuk membuat kanvas sementara yang dimodifikasi. Kanvas sementara yang dimodifikasi dikomposisikan ke dalam latar belakang, dengan mempertimbangkan setiap pengaturan level-masking dan opacity pada grup.