2016-01-27 15 views
31

TRZECIA EDYCJA: oto działający przypadek testowy. Wygląda na to, że ma coś wspólnego z buforowaniem arkusza spritehev svg. Jeśli skonfiguruję kontrolę pamięci podręcznej na moim serwerze, aby nie było buforowania SVG, zachodzi takie zachowanie. Zapraszam do oglądania źródła (wszystko to w jednym pliku, ale nie chcę tutaj tego wszystkiego włączać).SVG w Chrome czasami nie renderują się.

https://stuff.spherical.fish/svgtest.html

DRUGA EDIT: poprawka wymienione poniżej (bezpośrednio wstrzykiwanie elementy w index.html zamiast korzystania z zewnętrznego spritesheet) po prostu przestał działać w v49 Chrome (która moja przeglądarka kanał beta właśnie zaktualizowaną do). v48 ma sporadyczny problem z renderowaniem, ale v49 całkiem konsekwentnie nie renderuje żadnego z następujących elementów: , który jest następujący: <svg><use></use></svg>; ale tylko na dużej, skomplikowanej, kanciastej stronie. Nudny prosty przypadek testowy działa dobrze. Dodano nagrodę dla każdego, kto może bezpośrednio wskazać mi znany problem lub skąd to się bierze. Z całą pewnością nie jest to plik nieznajdujący, ponieważ wciąż jest sporadycznym błędem, a cała strona jest w porządku w firefoxie i safari.

EDYCJA: to na pewno ma coś wspólnego z odwoływaniem się do zewnętrznego źródła. Kiedy osadzam pliki SVG bezpośrednio w pliku index.html i odwołuję się do nich za pomocą <use xlink:href="#id"></use>, działają poprawnie, ale jeśli odwołuję się do zewnętrznego pliku w elemencie <use>, ładują się tylko czasami.

Mam dziwne zachowanie w chrome (tylko - to nie dzieje się w operze, firefox, safari); Widzę to od co najmniej początku lat 40., w wersji.

Moje zachowanie jest w środku powtarzanej struktury kątowej. Wszystko jest takie samo - jest grupa dwojga flexboxowanych razem. Istnieje również element SVG, który wygląda następująco:

<svg class="icon-3"> 
    <use xlink:href="/assets/trellis-icons.svg#icon-users"></use> 
</svg> 

dość prosta.

Chodzi o to, że dla niektórych tych powtarzających się elementów ikona nie renderuje się. Sprawdzanie elementu w narzędziach chrome chrome wskazuje, że renderowany element SVG <use> ma wysokość i szerokość, podczas gdy nierenderowany ma zerową wysokość i szerokość.

To nie jest jakaś prawdziwa różnica; Ręcznie zmontowałem DOM, aby jeden z tych nieprawidłowych wpisów całkowicie pasował do jednego z wyrenderowanych elementów, ale svg nadal się nie wyświetla. Oto odpowiedni zrzut ekranu.

strange svg render issue

można zobaczyć poniżej (i ignorować moje problemy wypełniające z przycisku) pierwszy wiersz nie posiada małe głowy i słowo bubble ikon. Jest to sporadyczny problem - jeśli ponownie załaduję stronę, może to być w porządku, a może żadna z ikon nie zostanie załadowana.

Zastanawiam się: czy istnieje jakiś niejasny problem związany z używaniem arkuszy sprite (wszystkie SVG, które wykazują to zachowanie są w tym samym dużym pliku SVG i są przywoływane przez #id) ładują się asynchronicznie czy coś?

Jeśli to naprawdę nieznane/nowe zachowanie, będę pracował nad inżynierią przypadku testowego, ale budowanie czegoś, co prawdopodobnie opiera się na pewnym rodzaju błędu współbieżności, jest trochę trudne. Więc pomyślałem, że najpierw zapytam.

EDYTUJ, aby dodać: Takie zachowanie nie występuje, jeśli wyeksportuję pojedynczy plik svg jako samodzielny i używam go w stylu <img src="icon.svg">.To nadal się nie udaje, jeśli zrobię użycie svg na ikonie w pojedynczym pliku autonomicznym.

EDYCJA: na życzenie użytkownika @ kaiido, tutaj znajduje się odpowiedni svg.

<svg xmlns="http://www.w3.org/2000/svg"> 
    <!-- thirty other symbols snipped --> 
    <symbol id="icon-users" viewBox="0 0 512 512"> 
    <path d="m352 397c-15-16-78-32-109-48c-21-11-32-33-32-53c0-10 7-19 13-26c5-6 9-14 13-24c8-4 18-12 18-31c0-12-2-19-5-24c1-11 2-22 3-34c4-45-42-90-89-90c-47 0-92 45-88 90c1 12 2 23 3 34c-4 5-5 12-5 24c0 19 9 27 18 31c4 10 8 18 13 24c6 7 13 16 13 26c0 20-11 42-32 53c-18 9-48 19-72 28l0 68l354 0c0 0 0-32-16-48z m146-7c-21-8-46-16-62-24c-17-8-25-27-25-43c0-8 5-15 10-21c4-5 8-12 11-20c7-3 15-10 15-25c0-10-2-16-5-20c1-9 2-18 3-27c3-37-34-76-73-76c-38 0-75 39-72 76c1 9 2 18 3 27c-3 4-5 10-5 20c0 16 8 22 15 25c3 8 7 15 11 20c4 6 10 13 10 21c0 10-4 22-11 31c30 11 43 22 53 33c19 19 19 58 19 58l103 0z"/> 
    </symbol> 
</svg> 
+0

Jakieś błędy lub podobne w konsoli? taki błąd istniał jakiś czas temu, naprawą było użycie zamiast . Spróbuj się bawić z bezwzględnym identyfikatorem URI i formatowaniem tagów, ale wydaje się, że to dość dziwny błąd. Może przesłać bilet? również testujesz na komputerze lokalnym lub na zdalnym serwerze i czy istnieje on w firefox/IE? –

+0

brak błędów na konsoli, używam . testowanie na serwerze localhost i serwerze zdalnym, błąd występuje tylko w chrome: ff, safari działają zarówno (nie testując na IE/edge/operze). Wygląda trochę jak błąd współbieżności - zwykle są to tylko pierwsze elementy z listy, które się renderują, a które nie, np. Jeśli spróbujesz użyć svg, który nie jest jeszcze załadowany, nic nie dostajesz. Bawię się próbując absolutnych identyfikatorów URI. – pfooti

+0

mała aktualizacja - bezwzględne adresy URL nie pomogły, a także nie usunęłam całej zagadki na mojej liście ikonek SVG. (Pierwotnie właśnie zaimportowałem duży plik do pracy dev, ale użyłem tylko 10% symboli w nim). Wciąż przerywany (klikanie w kanciastą aplikację w sposób, który powoduje mutacje drzewa DOM, kończy się nagle renderowaniem ikon). – pfooti

Odpowiedz

13

Cóż, okazuje się, że jest to bug chrom po wszystkim, i dość dużo, co myślałem, że było: zmiana <use> elementy wokół przerw w pewnych okolicznościach. Okoliczności te są w zasadzie następujące: gdy arkusz podręczny svg nie jest buforowany w przeglądarce.

https://code.google.com/p/chromium/issues/detail?id=580809

Poprawiono w Kanaryjskie (M50), może się połączyły się w M49.

Sposób obejścia tego problemu polega na ustawieniu nagłówka kontrolki pamięci podręcznej w arkuszu papieru błyskawicznego SVG na wartość większą niż zero. Pomaga to również wyjaśnić, dlaczego widziałem tylko ten błąd na moim serwerze testowym, a nie w produkcji - mam różne ustawienia pamięci podręcznej w moim pudełku beta.

+0

Czy ktoś może potwierdzić, że to nadal jest błąd? Wydaje mi się, że widzę dokładnie to samo w Chrome v. 50.0.2661.102 m. Mam witrynę z wordpressami, ponieważ regularnie doświadczam tego problemu. .htaccess ma nagłówek pamięci podręcznej ustawiony jako takie: < "\ (SVG) $" FilesMatch> Header set "max-age = 604800" Cache-Control Najdziwniejsze jest to, że ja również mieć. Strona NET Umbraco, która używa ikonki SVG, działa dokładnie tak samo, ale tutaj nie napotykam żadnych problemów. –

+0

Ja i kilka innych osób nadal widzimy ten problem w aktualnej wersji Chrome (~ v54, v55). Wydaje się, że nie jest to dokładnie ten sam błąd, Google zauważa w połączonym błędu powyżej, że ich testy się nie kończą (chociaż to nie gwarantuje, że nie jest to ten sam błąd, a testy nie są dokładne). trochę denerwujące. – LocalPCGuy

+0

Ten problem nadal występuje w chrome 63. – zhoujy

2

Miałem też ten błąd. Naprawiono rozwiązanie pfooti, ​​buforując &, a następnie aktualizując Webkit.

Ale później wrócił: nie było to samo, ale może być przydatne dla innych, później.

Otworzyłam SVG z Inkscape (ale tych samych prac w Illustrator, zbyt), wybrany mój obiekt i stosowane path>union, i zapisane:

<path class="st0" d="M32 272l128 48 16 160 80-112 112 112L480 32 32 272zm318.7 145.4L256 320l128-176-192 153.8-82.6-31 322-172.5-80.7 323.1z"/>

stał

<path d="M480 32L32 272l128 48 16 160 80-112 112 112L480 32zm-48.6 62.3l-80.7 323.1L256 320l128-176-192 153.8-82.6-31 322-172.5z"/>

A teraz działa!

Nie wiem dokładnie dlaczego, ale wydaje się, że Chrome ma problem z pierwszą składnią. Mam nadzieję, że to pomoże!

1

Atrybut xlink:href jest przestarzały od wersji SVG 2 (proof link). Nowe wersje Chrome działają dziwnie z tym atrybutem.

Jeśli korzystasz z xlink:href (dla starszych przeglądarek) i href (dla nowych przeglądarek) wszystko będzie działać dobrze wszędzie.

+0

FWIW, był to chromowany błąd od jakiegoś czasu (wersja 48) związany z chromem, który niewłaściwie używał zasobów, które nie miały nagłówka kontrolki pamięci podręcznej. – pfooti

+0

Ten błąd jest czasami odtwarzany w Chrome 62 i aplikacji Single Page (Angular 1.6). Jeśli zawartość jest ładowana dynamicznie i zawiera obrazy SVG. –

+0

Tak, mam ten sam problem na chrome 63. Rok temu błąd istniał.Teraz wciąż istnieje. – zhoujy

Powiązane problemy