SVG-PanZoom не работает, если контейнер скрыт
У меня есть экземпляр SVG-Pan-Zoom, встроенный в Tabbing-Component. Когда активная вкладка изменяется, предыдущая скрывается с display: none
, После переключения на первую вкладку (которая снова отображается с display: block
) экземпляр svgPanZoom находится в непригодном для использования состоянии. Я не совсем понимаю, что происходит.
Мне удалось воспроизвести это поведение только в Google Chrome.
Я создал пример для проверки этого: http://svgpan-example.bitballoon.com/
Это ошибка, или я что-то упустил?
2 ответа
Кажется, это специфическая для браузера реализация. Когда вы устанавливаете display: none
на embed
элемент (или его родительский контейнер) браузер, скорее всего, выгружает ресурс. После удаления display: none
- похоже, что браузер переинициализирует / перезагружает ресурс. Вы можете видеть это на основе 2 фактов:
- На вкладках Сеть инструментов разработчика вы видите, что ресурс загружается снова, когда вы показываете элемент
- Если вы измените элемент внутри SVG (в инспекторе), то после скрытия и показа - изменение пропало.
svg-pan-zoom не контролирует изменения SVG из внешнего мира, так что это не проблема. Решение состоит в том, чтобы использовать встроенный SVG (они работали для меня при скрытии / показе) или просто протестировать все остальные параметры (теги object и img). Но встроенный SVG всегда является предпочтительным методом.
Объект с display: hidden удаляется из потока DOM, и поэтому в некоторых браузерах в это время не будет никаких размерных данных (ширина, высота). Мое решение может быть немного нелепым, но... Мне нужен был SVG в модале начальной загрузки. Поэтому я поместил элемент svg внизу тела за пределы модальной зоны, установил видимость: скрытый. Затем инициализировал svgPanZoom на нем. Затем переместил его (используя jQuery) в скрытый модал. Это решило проблему для меня.
<div id="svgContainer" style="width: 400px; height: 400px;
border:1px solid black; padding:5px; overflow:hidden;
visibility: hidden"><svg>...</svg></div>