วิธีแก้ปัญหาที่สะอาดเร็วและง่ายที่โพสต์ ณ วันที่คำตอบนี้ไม่น่าพอใจ พวกเขาถูกสร้างขึ้นด้วยคำสั่งที่มีข้อบกพร่องว่าเอกสาร SVG ขาดคำสั่ง z ห้องสมุดก็ไม่จำเป็นเช่นกัน บรรทัดหนึ่งของรหัสสามารถดำเนินการส่วนใหญ่เพื่อจัดการกับลำดับ z ของวัตถุหรือกลุ่มของวัตถุที่อาจจำเป็นในการพัฒนาแอพที่เคลื่อนย้ายวัตถุ 2 มิติในพื้นที่ xyz
ใบสั่ง Z มีอยู่จริงในชิ้นส่วนเอกสาร SVG
สิ่งที่เรียกว่าชิ้นส่วนเอกสาร SVG เป็นต้นไม้ขององค์ประกอบที่ได้มาจากประเภทโหนดฐาน SVGElement โหนดรูทของส่วนของเอกสาร SVG คือ SVGSVGElement ซึ่งสอดคล้องกับแท็กHTML5 <svg> SVGGElement สอดคล้องกับแท็ก<g>และอนุญาตให้รวมเด็ก ๆ
การมีแอ็ตทริบิวต์ z-index บน SVGElement เหมือนกับใน CSS จะเอาชนะรูปแบบการแสดงผล SVG ส่วนที่ 3.3 และ 3.4 ของ W3C SVG คำแนะนำ v1.1 รัฐฉบับที่ 2 ว่า SVG เศษเอกสาร (ต้นไม้ของลูกหลานจาก SVGSVGElement) จะแสดงผลโดยใช้สิ่งที่เรียกว่าความลึกแรกค้นหาของต้นไม้ แบบแผนนั้นเป็นระเบียบในทุกความหมายของคำ
คำสั่ง Z เป็นทางลัดในการมองเห็นคอมพิวเตอร์เพื่อหลีกเลี่ยงความจำเป็นในการเรนเดอร์ 3D ที่มีความซับซ้อนและความต้องการใช้คอมพิวเตอร์ในการติดตามเรย์ สมการเชิงเส้นสำหรับดัชนีซีโดยนัยขององค์ประกอบในส่วนของเอกสาร SVG
z-index = z-index_of_svg_tag + depth_first_tree_index / tree_node_qty
นี่เป็นสิ่งสำคัญเพราะถ้าคุณต้องการย้ายวงกลมที่อยู่ด้านล่างของสี่เหลี่ยมจัตุรัสไปด้านบนคุณเพียงแค่แทรกสี่เหลี่ยมที่อยู่ตรงหน้าวงกลม สิ่งนี้สามารถทำได้อย่างง่ายดายใน JavaScript
วิธีการสนับสนุน
อินสแตนซ์ SVGElement มีสองวิธีที่สนับสนุนการจัดการคำสั่ง z ที่ง่ายและสะดวก
- parent.removeChild (เด็ก)
- parent.insertBefore (child, childRef)
คำตอบที่ถูกต้องที่ไม่ได้สร้างความยุ่งเหยิง
เนื่องจาก SVGGElement ( แท็ก<g> ) สามารถลบและแทรกได้ง่ายเหมือนกับ SVGCircleElement หรือรูปร่างอื่น ๆ เลเยอร์ภาพทั่วไปของผลิตภัณฑ์ Adobe และเครื่องมือกราฟิกอื่น ๆ สามารถนำไปใช้งานได้อย่างง่ายดายโดยใช้ SVGGElement JavaScript นี้เป็นหลักคำสั่งย้ายด้านล่าง
parent.insertBefore(parent.removeChild(gRobot), gDoorway)
ถ้าเลเยอร์ของหุ่นยนต์ที่ดึงมาเป็นลูกของ SVGGElement gRobot อยู่ก่อนทางเข้าประตูในฐานะที่เป็นเด็กของ SVGGElement gDoorway ตอนนี้หุ่นยนต์จะอยู่ด้านหลังทางเข้าประตูเนื่องจากคำสั่ง z ของทางเข้านั้นเป็นหนึ่งในคำสั่ง z ของหุ่นยนต์
ย้ายเหนือคำสั่งเกือบจะเป็นเรื่องง่าย
parent.insertBefore(parent.removeChild(gRobot), gDoorway.nextSibling())
แค่คิดว่า = a และ b = b เพื่อจดจำสิ่งนี้
insert after = move above
insert before = move below
ออกจาก DOM ในสถานะที่สอดคล้องกับมุมมอง
เหตุผลที่คำตอบนี้ถูกต้องเพราะมีน้อยและสมบูรณ์และเช่นเดียวกับผลิตภัณฑ์ของ Adobe หรือบรรณาธิการกราฟิกที่ได้รับการออกแบบมาเป็นอย่างดีทำให้การเป็นตัวแทนภายในอยู่ในสถานะที่สอดคล้องกับมุมมองที่สร้างขึ้นโดยการแสดงผล
วิธีทางเลือก แต่ จำกัด
อีกวิธีที่ใช้กันโดยทั่วไปคือการใช้ CSS z-index ร่วมกับชิ้นส่วนเอกสาร SVG หลายรายการ (แท็ก SVG) ที่มีพื้นหลังโปร่งใสส่วนใหญ่ในทั้งหมดยกเว้นด้านล่าง อีกครั้งนี่เป็นการกำจัดความสง่างามของรูปแบบการเรนเดอร์ SVG ทำให้ยากที่จะย้ายวัตถุขึ้นหรือลงตามลำดับ z
หมายเหตุ:
- ( https://www.w3.org/TR/SVG/render.html v 1.1, รุ่นที่ 2, 16 สิงหาคม 2554)
3.3 องค์ประกอบการสั่งซื้อการแสดงผลในส่วนของเอกสาร SVG มีลำดับการวาดโดยนัยโดยองค์ประกอบแรกในส่วนของเอกสาร SVG จะได้รับ "ทาสี" ก่อน องค์ประกอบที่ตามมาจะถูกทาสีทับองค์ประกอบที่ทาสีไว้ก่อนหน้านี้
3.4 วิธีการแสดงผลของกลุ่มการจัดกลุ่มองค์ประกอบเช่นองค์ประกอบ 'g' (ดูองค์ประกอบของภาชนะบรรจุ) มีผลต่อการสร้างผืนผ้าใบแยกชั่วคราวซึ่งเริ่มต้นเป็นสีดำโปร่งใสบนองค์ประกอบของเด็กที่ถูกทาสี เมื่อเสร็จสิ้นของกลุ่มเอฟเฟกต์ตัวกรองใด ๆ ที่ระบุสำหรับกลุ่มจะถูกนำไปใช้เพื่อสร้างผืนผ้าใบชั่วคราวที่ถูกดัดแปลง ผืนผ้าใบชั่วคราวที่ผ่านการดัดแปลงจะถูกนำมาประกอบเป็นพื้นหลังโดยคำนึงถึงการตั้งค่าการปิดบังระดับกลุ่มและความทึบของกลุ่ม