Подтвердить что ты не робот

SVG в Chrome иногда не отображают

ТРЕТЬЕ ИЗМЕНЕНИЕ: здесь рабочий тестовый пример. Похоже, что это имеет какое-то отношение к кешированию svg spritesheet. Если я настрою управление кешем на своем сервере, чтобы не было кеширования SVG, это происходит. Не стесняйтесь просматривать исходный код (все в одном файле, но я не хочу включать все здесь).

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

SECOND EDIT: исправление, перечисленное ниже (прямое вложение элементов в index.html вместо использования внешнего спрайта) просто перестало работать в Chrome v49 (о котором только что обновил браузер бета-канала). v48 имеет проблему прерывистого рендеринга, но v49 довольно последовательно не отображает ничего, что указано в шаблоне <svg><use></use></svg>; но только на большой, сложной странице angular. Скучный простой тест работает нормально. Добавлена ​​щедрость для всех, кто может прямо указать мне на известную проблему или где бы это ни происходило. Это, безусловно, не файл-не-найденный, так как он все еще является прерывистой ошибкой, и вся страница выглядит просто отлично в firefox и safari.

EDIT: это определенно связано со ссылкой на внешний ресурс. Когда я встраиваю SVG непосредственно в index.html и ссылаюсь на них с помощью <use xlink:href="#id"></use>, они работают нормально, но если я ссылаюсь на внешний файл в элементе <use>, они иногда загружаются.

У меня какое-то странное поведение в хроме (только - это не происходит в опере, firefox, safari); Я видел это с по крайней мере в начале 40-х, по версии.

Мое поведение находится в середине ng-повторной структуры angular. Все одно и то же - там куча divs flexboxed вместе. Также есть элемент SVG, который выглядит следующим образом:

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

довольно просто.

Дело в том, что для некоторых из этих повторяющихся элементов значок не отображается. Проверка элемента в инструментах chrome dev означает, что отображаемый SVG <use> элемент имеет высоту и ширину, тогда как неоригинальный имеет нулевую высоту и ширину.

Здесь нет никакой реальной разницы; Я даже вручную отредактировал DOM, чтобы одна из оскорбительных записей полностью соответствовала одному из рендерингов, но svg все равно не отображает. Вот соответствующий скриншот.

странная проблема с SVG-рендером

Вы можете видеть ниже (и игнорировать мои проблемы с добавлением кнопки), в первой строке нет маленьких головок и значков словосочетания. Это периодическая проблема - если я перезагружаю страницу, это может быть хорошо, или, возможно, ни одна из иконки не загрузится.

Мне интересно: есть ли какая-то неясная проблема, связанная с использованием списков спрайтов (все SVG, которые демонстрируют это поведение, находятся в одном большом SVG файле и на которые ссылается #id) загружаются асинхронно или что-то в этом роде?

Если это действительно неизвестно/новое поведение, я буду работать над созданием тестового примера, но создание чего-то, что, вероятно, зависит от какой-то ошибки concurrency, отчасти тяжело. Поэтому я решил, что сначала спрошу.

РЕДАКТИРОВАТЬ, чтобы добавить: Такое поведение не происходит, если я экспортирую отдельный svg out как автономный и использую его в модуле <img src="icon.svg">. Он все еще терпит неудачу, если я использую svg для использования в значке в отдельном автономном файле.

EDIT: по запросу @kaiido, вот соответствующий вопрос 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>
4b9b3361

Ответ 1

Ну, оказывается, это хромовая ошибка в конце концов, и в значительной степени я думал, что это: изменение <use> элементов вокруг разрывов при определенных обстоятельствах. Эти обстоятельства в основном: когда svg spritesheet не кэшируется в браузере.

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

Исправлено в канареечном канале (M50), которое можно объединить в M49.

Обходной путь - установить заголовок управления кешем в spritesheet SVG, который больше нуля. Это также помогает объяснить, почему я только видел эту ошибку на моем тестовом сервере, а не в производстве - у меня разные настройки кеша в бета-блоке.

Ответ 2

У меня тоже была эта ошибка. Был исправлен с помощью pfooti путем кеширования, а затем с помощью обновления webkit.

Но потом он вернулся: не то же самое, но может быть полезно для других, позже.

Я открыл SVG с помощью Inkscape (но то же самое работает и в Illustrator), выбрал мой объект и применил path > union и сохранил:

<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"/>

стал

<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"/>

И теперь это работает!

Я не знаю точно, почему, но у Chrome, похоже, есть проблема с первым синтаксисом. Надеюсь, это поможет!

Ответ 3

Атрибут xlink:href устарел, поскольку SVG 2 (ссылка на доказательство). Новые версии Chrome работают с этим атрибутом.

Если вы используете xlink:href (для древних браузеров) и href (для новых браузеров) все будет хорошо работать везде.