W przeglądarce Google Chrome 24, jeśli element, do którego odnosi się element <use>
jest zdefiniowany w dalszej części dokumentu, nie jest renderowany. Nie zauważyłem niczego związanego z porządkiem elementów w dokumentacji elementu use
.Czy kolejność elementów ma znaczenie dla wbudowanej SVG?
Czy to zachowanie jest niezdefiniowane i nie należy oczekiwać, że będzie ono spójne w różnych przeglądarkach lub po prostu błąd w przeglądarce Chrome?
Przykład tego można zobaczyć poniżej (nieznacznie zmodyfikowane z pytania this). Niebieskie koło renderuje się zgodnie z oczekiwaniami, czerwone, nie tak bardzo. Firefox 17 i IE 9 renderują oba kręgi, jak się spodziewam. Gdy ta sama treść jest określana jako zewnętrzna <img />
, oba kręgi również się wyświetlają.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Chrome use-tag bug?</title>
</head>
<body>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="200px" height="200px" viewBox="0 0 200 200">
<defs>
<g id="test2">
<circle cx="50" cy="50" r="25" fill="blue"/>
</g>
</defs>
<g>
<rect x="0.5" y="0.5" width="199" height="199" stroke="black" fill="none"/>
<use xlink:href="#test1" x="0" y="0"/>
<use xlink:href="#test2" x="0" y="0"/>
</g>
<defs>
<g id="test1">
<circle cx="100" cy="100" r="25" fill="red"/>
</g>
</defs>
</svg>
</body>
</html>
UPDATE: wydaje się działać w Chrome 39.
_i think_, kolejność jest ważna, przynajmniej spec tak mówi - http://www.w3.org/TR/SVG/render.html#RenderingOrder - więc masz, _prawdopodobnie_, uruchomić jeszcze jeden błąd webkita. – c69
Do malowania masz absolutną rację, robią. W tym przypadku odwołuję się do innego elementu (który w rzeczywistości nie zostanie namalowany). Nie jestem pewien, czy musisz zadeklarować elementy, zanim będziesz mógł z nich korzystać (np. Kompilatory old school, w których możesz tylko wywoływać funkcje, które zadeklarowałeś). – R0MANARMY
Zgadzam się z Tobą, to musi być błąd. Mechanizm odwoływania "xlink: href" ma niestety kilka wad w pakiecie Webkit. –