Czyste, szybkie i łatwe rozwiązania opublikowane na dzień udzielenia tej odpowiedzi są niezadowalające. Są one zbudowane na błędnym stwierdzeniu, że dokumenty SVG nie mają kolejności z. Biblioteki też nie są potrzebne. Jedna linia kodu może wykonać większość operacji, aby manipulować kolejnością obiektów lub grup obiektów z, które mogą być wymagane przy tworzeniu aplikacji, która przenosi obiekty 2D w przestrzeni xyz.
Porządek Z na pewno istnieje we fragmentach dokumentów SVG
To, co nazywamy fragmentem dokumentu SVG, jest drzewem elementów pochodzących z węzła podstawowego typu SVGElement. Węzeł główny fragmentu dokumentu SVG to SVGSVGElement, który odpowiada znacznikowi HTML5 <svg> . SVGGElement odpowiada znacznikowi <g> i umożliwia agregację elementów potomnych.
Posiadanie atrybutu z-index na SVGElement, tak jak w CSS, pokonałoby model renderowania SVG. Sekcje 3.3 i 3.4 W3C SVG Zalecenie v1.1 2nd Edition stwierdzają, że fragmenty dokumentów SVG (drzewa potomstwa z SVGSVGElement) są renderowane przy użyciu tak zwanego przeszukiwania w głąb drzewa . Ten schemat jest porządkiem az w każdym znaczeniu tego słowa.
Porządek Z jest w rzeczywistości skrótem do wizji komputerowej, który pozwala uniknąć prawdziwego renderowania 3D przy złożoności i wymaganiach obliczeniowych związanych ze śledzeniem promieni. Równanie liniowe dla niejawnego indeksu Z elementów we fragmencie dokumentu SVG.
z-index = z-index_of_svg_tag + depth_first_tree_index / tree_node_qty
Jest to ważne, ponieważ jeśli chcesz przenieść koło, które znajdowało się poniżej kwadratu, na nad nim, po prostu wstaw kwadrat przed okręgiem. Można to łatwo zrobić w JavaScript.
Metody wspomagające
Instancje SVGElement mają dwie metody, które obsługują prostą i łatwą manipulację porządkiem z.
- parent.removeChild (dziecko)
- parent.insertBefore (child, childRef)
Prawidłowa odpowiedź, która nie tworzy bałaganu
Ponieważ SVGGElement ( tag <g> ) można usunąć i wstawić równie łatwo jak SVGCircleElement lub jakikolwiek inny kształt, warstwy obrazu typowe dla produktów Adobe i innych narzędzi graficznych można z łatwością zaimplementować za pomocą SVGGElement. Ten JavaScript jest w zasadzie poleceniem Przesuń poniżej .
parent.insertBefore(parent.removeChild(gRobot), gDoorway)
Jeśli warstwa robota narysowanego jako elementy podrzędne SVGGElement gRobot była przed drzwiami narysowana jako elementy podrzędne SVGGElement gDoorway, robot znajduje się teraz za drzwiami, ponieważ kolejność z drzwi wynosi teraz jeden plus kolejność z robota.
Move Przede polecenia jest niemal tak proste.
parent.insertBefore(parent.removeChild(gRobot), gDoorway.nextSibling())
Pomyśl tylko a = a i b = b, żeby o tym pamiętać.
insert after = move above
insert before = move below
Pozostawienie DOM w stanie zgodnym z poglądem
Powodem, dla którego ta odpowiedź jest poprawna, jest to, że jest ona minimalna i kompletna oraz, podobnie jak elementy wewnętrzne produktów Adobe lub innych dobrze zaprojektowanych edytorów graficznych, pozostawia wewnętrzną reprezentację w stanie zgodnym z widokiem utworzonym przez renderowanie.
Podejście alternatywne, ale ograniczone
Innym powszechnie stosowanym podejściem jest użycie indeksu z CSS w połączeniu z wieloma fragmentami dokumentów SVG (tagami SVG) z przeważnie przezroczystymi tłami we wszystkich poza dolnym. Ponownie, podważa to elegancję modelu renderowania SVG, utrudniając przesuwanie obiektów w górę lub w dół w kolejności z.
UWAGI:
- ( https://www.w3.org/TR/SVG/render.html v 1.1, wydanie drugie, 16 sierpnia 2011)
3.3 Kolejność renderowania elementów we fragmencie dokumentu SVG ma niejawną kolejność rysowania, przy czym pierwsze elementy we fragmencie dokumentu SVG są „malowane” jako pierwsze. Kolejne elementy malujemy na wcześniej pomalowanych elementach.
3.4 Jak renderowane są grupy Grupowanie elementów, takich jak element „g” (zobacz elementy kontenera), skutkuje utworzeniem tymczasowej oddzielnej kanwy zainicjowanej w przezroczystą czerń, na którą malowane są elementy potomne. Po zakończeniu tworzenia grupy wszystkie efekty filtrów określone dla grupy są stosowane w celu utworzenia zmodyfikowanej tymczasowej kanwy. Zmodyfikowana tymczasowa kanwa jest umieszczana w tle, z uwzględnieniem wszelkich ustawień maskowania i krycia na poziomie grupy w grupie.