Svg элемент изображения не отображается в Safari
Браузер Safari (я тестирую под Windows), похоже, испытывает проблемы с отображением элемента Svg Image.
<!DOCTYPE html>
<html>
<body>
<h1>My first SVG</h1>
<img src="image.svg" />
</body>
</html>
А вот и содержание image.svg:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<rect x="50" y="50" width="100" height="100" style="fill:blue"></rect>
<rect id="foo" x="50" y="150" width="500" height="500" style="fill:green"></rect>
<image x="50" y="10" width="200" height="200" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="></image>
</svg>
Есть ли какое-либо решение или обходной путь, чтобы сделать эту работу в Safari?
8 ответов
Я думаю, что здесь есть две проблемы:
Вы ничего не сказали о том, насколько велико ваше изображение SVG. Как правило, вы должны хотя бы включить
viewBox
атрибут в<svg>
тег. Например:<svg width="250" height="250" viewBox="0 0 250 250" ... >
Другая проблема заключается в том, что Safari не особенно хорош в рендеринге SVG. Тем не менее, это имеет тенденцию быть лучше, когда вы вставляете их с
<iframe>
или же<object>
тег вместо использования<img>
, Например:<object data="image.svg" type="image/svg+xml"></object>
Также убедитесь, что ваш сервер доставляет SVG-контент с правильным типом MIME (
Content-Type: image/svg+xml
), так как это может вызвать проблемы тоже.
Так что попробуйте:
HTML источник:
<!DOCTYPE html>
<html>
<body>
<h1>My first SVG</h1>
<object data="image.svg" type="image/svg+xml"></object>
</body>
</html>
image.svg:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="250" height="250" viewBox="0 0 250 250"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<rect x="50" y="50" width="100" height="100" style="fill:blue"></rect>
<rect id="foo" x="50" y="150" width="500" height="500" style="fill:green"></rect>
<image x="50" y="10" width="200" height="200" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="></image>
</svg>
Для меня проблема заключалась в том, что я использовал href
атрибут без проблем в Chrome. Для правильной работы в Safari вам необходимо использовать xlink:href
, Иметь ввиду xlink:href
устарела и заменяется href
, Однако это еще не поддерживается в Safari.
https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/href
Обязательно поставьте свой
<svg>
тег с высотой, шириной и полем просмотра, например. Safari не любит, когда высота или ширина установлены на
auto
по какой-то причине. ⤵︎
<svg height="16px" width="16px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path d="M60......"></path></svg>
Я обнаружил эту же проблему, когда проверял приложение, над которым работал, в Safari, после того, как большую часть времени использовал Chrome. Я написал этот фрагмент кода TypeScript/jQuery (достаточно легко превращенный в простой JavaScript), чтобы решить эту проблему:
export function setSvgHref(elem: JQuery, href: string) {
elem.attr('href', href);
if (isSafari()) {
elem.each(function() {
this.setAttributeNS('http://www.w3.org/1999/xlink', 'href', href);
});
}
}
В моем случае проблема была связана с
<mask>
теги в. Я удалил следующую строку в своем
svg
компонент, и он начал работать в Safari.
<mask id="y9iogdw0wd" fill="#fff">
<use xlink:href="#jz8vxv0q6c"/>
</mask>
У меня возникла проблема со словесным знаком (текстом, который я использую в качестве логотипа), который я сохранил как файл.svg. Это было на моей странице с<img src="...svg">
но не отображался должным образом в Safari (текущая версия по состоянию на июль 2020 г.). SVG отлично работал с FireFox, Chrome и Brave.
Я создал SVG в Inkscape. Я выделил весь объект, затем использовал Path -> Object to Path... и сохранил полученный файл.
Это правильно отображается во всех четырех браузерах. (Я пишу это здесь, если у меня снова возникнет эта проблема: он скажет мне, что я сделал, чтобы ее исправить.)
Для современного Safari 15.6.1 (настольный компьютер) он будет отображаться без каких-либо атрибутов, еслиheight
иwidth
ОБА определены для чего-то иного, чемauto
(по умолчанию).
<svg height="48" width="48">...</svg>
ОДНАКО , чтобы обеспечить правильное масштабирование и возможность изменения размера с помощью CSS, лучше использовать соотношение viewBox и позволить CSS делать то, что он делает лучше всего (и да, из-за Safari вам все равно нужно определить ширину и высоту):
<svg viewBox="0 0 48 48">...</svg>
svg {
width: 96px;
height: 96px;
}
У меня была эта проблема с SVG из Figma : мое решение -> перетащите сломанный SVG в новый пустой файл Figma и повторно экспортируйте его как SVG
Теперь он должен работать и даже правильно отображаться в Finder QuickLook на MacOS.
-
Вы также можете импортировать его в AI и повторно экспортировать как SVG для того же результата.
Ваше здоровье!