SVG в пропорциях элементов img не соблюдается в ie9

CSS:

img{
    max-height:30px;
}

HTML:

<img src="foo.svg" />

Я ищу это изображение SVG, чтобы масштабировать его пропорционально максимальной высоте 30 пикселей в высоту. Естественные размеры svg - 200 на 200 пикселей. Отлично работает в FF и Chrome (30x30), но в IE9 изображение 30x200. Теперь вот кикер. Это происходит только с определенными SVG файлами, другие svgs корректно масштабируются.

Кажется, разница в том, что один состоит из полигонов, а другой - из путей.

неправильно масштабируется:

http://www.radiantinteractive.com/rs/images/allies/other/crocs.svg

правильно масштабируется:

Любая идея о том, почему это происходит, или как я могу получить первый масштаб пропорционально в ie9?

Ответ 1

Чтобы обеспечить более последовательное масштабирование в браузерах, всегда убедитесь, что вы указываете viewBox, но оставьте атрибуты width и height в элементе svg. Я создал тестовую страницу для сравнения эффекта указания различных атрибутов SVG в сочетании с ширинами и высотами, указанными в CSS. Сравните это рядом в нескольких браузерах, и вы увидите много различий в обработке.

Ответ 2

Зафиксировать его в ie9 и не зацикливаться на этом. Я не знаю почему, но вы должны установить ширину: 100% через css-правило, но не в img-теге. Соотношение сторон будет работать по волшебству)) Это помогло мне, надеюсь, этот пост поможет другим.

Ответ 3

Вы также можете посмотреть здесь: https://gist.github.com/larrybotha/7881691 - это продолжение этой "истории".


Исправить SVG в тегах <img> не масштабируется в IE9, IE10, IE11

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

Высота изображения не будет масштабироваться, если изображения внутри контейнеров будут более узкими, чем ширина изображения. Это можно решить двумя способами.

Используйте sed в bash, чтобы удалить атрибуты ширины и высоты в файлах SVG

В соответствии с fooobar.com/questions/132845/... проблема может быть решена путем удаления только атрибутов width и height.

Этот маленький script будет рекурсивно искать ваш текущий рабочий каталог для файлов SVG и удалять атрибуты для совместимости с несколькими браузерами:

find ./ -name '*.svg' -print0 | xargs -0 sed -i "" -e 's/width="[0-9]*\.*\[0-9]*" //' -e 's/height="[0-9]*\.*\[0-9]*" //'

Предостережения

Удаление атрибутов ширины и высоты заставит изображение занять всю ширину своего контейнера в браузерах, отличных от IE.

IE10 (другие браузеры требуют тестирования) масштабирует изображения до некоторого произвольного размера - это означает, что вам нужно будет добавить width: 100% в ваш CSS, чтобы эти изображения соответствовали их контейнерам.

Целевой IE с CSS

Так как вышеупомянутое решение требует CSS в любом случае, мы могли бы также использовать взломать, чтобы заставить IE вести себя, и не беспокоиться о необходимости управлять каждым отдельным SVG файлом.

Следующие будут нацелены на все теги img, содержащие SVG файл, в IE6 + (только для файлов SVG, поддерживающих только IE9 +).

/*
 * Let target IE to respect aspect ratios and sizes for img tags containing SVG files
 *
 * [1] IE9
 * [2] IE10+
 */
/* 1 */
.ie9 img[src*=".svg"] {
  width: 100%; 
}
/* 2 */
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
  img[src*=".svg"] {
    width: 100%; 
  }
}

Предостережения

Это предназначено для каждого тега img, содержащего ".svg" в IE9, IE10 и IE11 - если вы не хотите этого поведения на конкретном изображении, вам придется добавить класс, чтобы переопределить это поведение для этого изображения.

Ответ 4

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

SVG необходимо масштабировать с использованием CSS-процентов и включать встроенные растровые изображения.

Единственное решение, которое я нашел для процентного изменения размера в IE, - это встроить внешний SVG в объект <object> тег.

Существуют различные решения для изменения размера SVG в IE до строгих размеров пикселей, но ни один из них не работает для изменения размера процентов.

Я создал не исчерпывающий набор тестов здесь.

Ответ 5

Как-то этот scss исправил мою проблему.

ul {
  li {
    list-style: none;
    margin: 0;
    padding: 0;
    display: inline;
    img {
      height: 20px;
      margin: 0 10px;
      display: inline-block;
    }
  }
}

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