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

SVG с шириной/высотой не масштабируется на IE9/10/11

Известна проблема с IE 9/10/11, где, если у вас есть файл SVG, где элемент <svg> указывает ширину и высоту, а затем вы масштабируете изображение SVG с помощью атрибутов width и height тега <img>, IE неправильно масштабирует изображение.

Я столкнулся с этой проблемой. У меня есть серия значков флагов SVG. Для значка флага США объект SVG записывается как:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="480" width="640">

<!-- elements to draw flag .. -->

</svg>

И вот полный источник для SVG.

Я вставляю SVG в HTML-документ с тегом <img> и уменьшаю его до 20x15:

В Chrome 39 SVG отображается правильно:

enter image description here

Но в IE10 он выглядит следующим образом:

enter image description here

Итак, что здесь происходит, так это то, что хотя IE10 определяет размер элемента <img> на 20x15, он не уменьшает масштаб SVG, поэтому мы видим только верхний левый угол значка флага, который отображается как простой синий квадрат.

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

Лучшим решением является использование CSS для специфической ориентации элементов SVG в IE10, что, по-видимому, возможно с использованием специального медиа-запроса поставщика:

@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
  img[src*=".svg"] {
    width: 100%; 
  }
}

Хорошо, но я не понимаю этого решения. Когда я пытаюсь сделать это, IE10 просто расширяет размер SVG, чтобы заполнить весь родительский контейнер, чего я не хочу. Хорошо, возможно, я могу заставить IE масштабировать SVG, установив ширину SVG на 100%, но затем ограничивая размер родительского контейнера. Поэтому я обернул <img> в DIV с шириной и высотой 20x15. Но... это привело к той же проблеме, что и раньше: контейнер DIV зафиксирован на 20x15, но SVG не сжимается - так что все, что у нас заканчивается, - это верхний левый синий угол флага, как и раньше:

enter image description here

... так что я, вероятно, просто не понимаю что-то об этом решении. Как я могу заставить IE10/11 масштабировать значок флага до 20x15?

4b9b3361

Ответ 1

Это происходит, когда на вашем изображении отсутствует атрибут viewBox в элементе svg.

У вас должен быть установлен: 0 0 640 480. Нули X и Y смещения, а 640 и 480 соответствуют ширине и высоте. Он определяет прямоугольник, который представляет границы изображения.

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="480" width="640" viewBox="0 0 640 480">

Ответ 2

Вывести высоту и ширину из строки тега SVG.

IE9, IE10 и IE11 неправильно масштабируют файлы SVG, добавленные с помощью тегов img, когда указаны атрибуты viewBox, width и height.

Проблема может быть решена путем удаления только атрибутов width и height и управления ими только с помощью CSS.

img[src*=".svg"] {
  width: 100%; 
}

Ответ 3

вот node script мне пришлось писать, чтобы исправить ту же проблему (для папки с несколькими SVG), возможно, это будет полезно для кого-то:

'use strict'

const fs = require('fs')

fs.readdir(`./`, (err, flist) => {
    if (typeof flist != 'undefined') {
        flist.forEach((file, i) => {
            proceed(file)
        })
    }
})

function proceed(file){
    fs.readFile(`./${file}`, 'utf8', (err,svg) => {
        let out = svg.replace('<svg', '<svg viewBox="0 0 640 480" ')
        if (!svg.includes('viewBox')){
            fs.writeFile(file, out, err => {
                if(err) {
                    console.log(err);
                } else {
                    console.log("Saved: " + file);
                }
            }) 
        }
    })
}

Ответ 4

Посмотрите @этот флаг из wonderflags для вашего ответа, вам нужно установить viewbox = "0 0 640 480" или он не будет работать. (Флаг ЕС)

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="480" width="640" viewBox="0 0 640 480"><defs><g id="d"><g id="b"><path d="M0-1l-.3 1h.5z" id="a"/><use transform="scale(-1 1)" xlink:href="#a"/></g><g id="c"><use transform="rotate(72)" xlink:href="#b"/><use transform="rotate(144)" xlink:href="#b"/></g><use transform="scale(-1 1)" xlink:href="#c"/></g></defs><path fill="#039" d="M0 0h640v480H0z"/><g transform="translate(320 242.263) scale(23.7037)" fill="#fc0"><use height="100%" width="100%" xlink:href="#d" y="-6"/><use height="100%" width="100%" xlink:href="#d" y="6"/><g id="e"><use height="100%" width="100%" xlink:href="#d" x="-6"/><use height="100%" width="100%" xlink:href="#d" transform="rotate(-144 -2.344 -2.11)"/><use height="100%" width="100%" xlink:href="#d" transform="rotate(144 -2.11 -2.344)"/><use height="100%" width="100%" xlink:href="#d" transform="rotate(72 -4.663 -2.076)"/><use xlink:href="#d" transform="rotate(72 -5.076 .534)"/></g><use height="100%" width="100%" xlink:href="#e" transform="scale(-1 1)"/></g></svg>