【问题标题】:SVG with width/height doesn't scale on IE9/10/11具有宽度/高度的 SVG 在 IE9/10/11 上无法缩放
【发布时间】:2015-03-14 06:21:00
【问题描述】:

IE 9/10/11 存在一个已知问题,如果您有一个 SVG 文件,其中 <svg> 元素指定宽度和高度,然后您使用 widthheight 属性缩放 SVG 图像<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>

And here's the full source for the SVG.

我将 SVG 插入带有 &lt;img&gt; 标签的 HTML 文档中,并将其缩小到 20x15:

在 Chrome 39 上,SVG 被正确渲染,如下所示:

但在 IE10 上呈现如下:

因此,这里似乎发生的情况是,即使 IE10 将 &lt;img&gt; 元素大小调整为 20x15,它也不会缩小 SVG - 所以我们最终只能看到标志图标的左上角,显示为纯蓝色框。

好的...所以这似乎是documented solutions 的一个已知问题。一种解决方案是简单地删除 SVG 文件中的所有 widthheight 属性。这似乎有点危险,因为我不想搞砸实际的设计。如果您有很多 SVG 文件,这也有点麻烦 - 需要更多脚本来处理文件。

更好的解决方案是使用 CSS 专门针对 IE10 中的 SVG 元素,这显然可以使用供应商特定的媒体查询:

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

好的,但我不明白这个解决方案。当我尝试上述方法时,IE10 只是扩展了 SVG 的大小以填充整个父容器,这不是我想要的。好的,所以也许我可以通过将 SVG 宽度设置为 100% 来强制 IE 缩放 SVG,然后限制父容器的大小。所以我将&lt;img&gt; 包裹在一个宽度和高度为20x15 的DIV 中。但是......这只是导致了与以前相同的问题:容器 DIV 固定为 20x15,但 SVG 并没有缩小 - 所以我们最终得到的只是标志的左上角蓝色角落:

...所以,我可能只是不了解此解决方案。如何让 IE10/11 将标志图标缩小到 20x15?

【问题讨论】:

    标签: html css internet-explorer svg


    【解决方案1】:

    从 SVG 标记行中取出高度和宽度。

    在指定 viewBox、宽度和高度属性时,IE9、IE10 和 IE11 无法正确缩放添加了 img 标签的 SVG 文件。

    可以通过仅删除 widthheight 属性并仅通过 CSS 操作它们来解决此问题。

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

    注意:如果你在 IE11 中内嵌 SVG,那么 SVG 标签中需要 width 和 height 属性,同时使用 CSS 将 SVG 标签的宽度设置为 100%,以便正确缩放。

    【讨论】:

    • 这解决了我的问题。只想添加“viewBox” - attr 不应该被删除
    • 如果我想使用少于 100% 的图像怎么办?换句话说,我想“缩放”它。
    • @Mark 你可能会缩放周围的容器。
    • 请注意,如果您将 SVG 内嵌在 IE11 中,则需要在 svg 标签中设置 width 和 height 属性,同时使用 css 将 svg 标签的宽度设置为 100%,以便它可以正确缩放。
    • Marian ...感谢您的注意...我会将其添加到我的答案中,但也要意识到这个答案已经超过四年了。
    【解决方案2】:

    当您的图片缺少 svg 元素上的 viewBox 属性时,就会发生这种情况。

    您的应设置为: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">
    

    【讨论】:

    • 有一篇关于它的好文章 here,它涵盖了这里提到的两种技术,但 Josiah 的那个应该可以工作
    • 我认为这是一个非此即彼的答案,但实际上你需要 viewBox 和 CSS width: 100% 才能工作。
    • 指定heightwidth 就行了! (除了在viewBox 中提到)
    【解决方案3】:

    这是我必须编写的用于解决相同问题的节点脚本(对于具有多个 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 中查看@this flag 以获得您的答案,您需要设置 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>
      

      【讨论】:

        【解决方案5】:

        在使用带有 boostrap img-fluid 的内联 SVG 时遇到了很多麻烦。 SVG 总是以错误的高度渲染。我使用下面的代码来修复它。在 IE10 和 IE11 中测试。

            @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
                svg.img-fluid {
                    position: absolute;
                }
            }
        

        【讨论】:

          猜你喜欢
          • 2013-11-26
          • 2014-12-03
          • 2018-03-24
          • 1970-01-01
          • 2022-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-29
          相关资源
          最近更新 更多