Html SVG在IE中未正确缩放-有额外空间

Html SVG在IE中未正确缩放-有额外空间,html,css,svg,Html,Css,Svg,我决定为我的一个项目切换到svg符号,但需要它们具有响应性。其主要思想是不要有多个http请求,因此我考虑将所有SVG合并为一个SVG,定义符号并按如下方式使用它们: <svg style="display:none;"> <defs> <symbol id="mys"> <path fill-rule="evenodd" clip-rule="evenodd" fill="#3F77BC" d="M222.1,77.7h-10.3c0.1-0.

我决定为我的一个项目切换到svg符号,但需要它们具有响应性。其主要思想是不要有多个http请求,因此我考虑将所有SVG合并为一个SVG,定义符号并按如下方式使用它们:

<svg style="display:none;">
<defs>
<symbol id="mys">
    <path fill-rule="evenodd" clip-rule="evenodd" fill="#3F77BC" d="M222.1,77.7h-10.3c0.1-0.8,0.2-1.4,0.2-2.3
        c0-8.5-6.9-15.4-15.4-15.4c-8.5,0-15.4,6.9-15.4,15.4c0,0.9,0.1,1.5,0.2,2.3h-9.3v4h-24.9v-5.2H89.4c0-0.3,0-0.6,0-0.9
        C89.4,67.1,82.5,60,74,60s-15.4,6.9-15.4,15.4c0,0.3,0,0.6,0,0.9h-6.2V60.7h4.3l5.3-5.3h22.8L74.3,44.9l-13.5-3.6l0.5-1.7
        l-16.5-4.4c-0.3,0.1-0.7,0.2-1,0.2l0,21.4h2v7.2c0,0-2,0.6-1.9,1.3c0.1,0.7,4.1,2.6,3.4,5.5c-0.6,2.9-1.6,4.8-4.4,4.5
        c-2.7-0.3-3.4-1.4-3.4-2.6c-0.1-1.2,0-3,0-3L38,67.9c0,0,2-0.5,2.6,1.1c0.6,1.5-0.2,2.7,0.6,3.5c0.8,0.8,4.1,1.4,4.1-1.1
        c0-2.5-0.5-2.4-2.1-3.6c-1.7-1.2-3.4-2.8-3.4-3.3c0-0.5-0.1-7.7-0.1-7.7h2.1l0-21.7c-1.4-0.7-2.5-2.1-2.5-3.8
        c0-2.3,1.9-4.2,4.2-4.2c2,0,3.6,1.4,4.1,3.2l15.3,4.1l0.4-1.6l55.8,15.1h28.1c0,0,0-23.5,0-26.2c0-2.7,2.1-2.6,2.1-2.6
        s32.5-0.5,35.1,0.5c2.7,1,3.3,3.7,3.3,3.7h-2l5,11.6c0,0,7.3,4.6,17.6,7.6c10.3,3,13.6,7.6,13.6,7.6l-1,17.6l1.3,2V77.7z
         M81.5,46.8l8.6,8.6h9.3l2.9-2.9L81.5,46.8z M175.5,25l-17.4-0.1v12.6h9.6l2.7,2.7h6.6L175.5,25z M183,23.7h-4c0,0,2,6.6,3,9.9
        s0.9,4.2,2.7,4.2c1.9,0,4.2,0,4.2,0L183,23.7z M74.2,63.8c6.8,0,12.3,5.5,12.3,12.3S81,88.4,74.2,88.4c-6.8,0-12.3-5.5-12.3-12.3
        S67.4,63.8,74.2,63.8z M196.6,63.8c6.8,0,12.3,5.5,12.3,12.3s-5.5,12.3-12.3,12.3s-12.3-5.5-12.3-12.3S189.8,63.8,196.6,63.8z"/>
</symbol>
</defs>
</svg>
<div style="position:relative;width:100%;background:blue;">
  <svg class="mys" viewBox="0 0 254 108" preserveAspectRatio="xMaxYMax meet" style="width:100%;">
    <use xlink:href="#mys"></use>
  <svg>
</div>

这里是一个JSFIDLE,检查IE中的不同行为(我检查了11,但读到9也有多个问题):

我这辈子都不能让它正常工作。上面的代码在Firefox和Chrome中正常工作,但在IE中失败。我阅读了有关IE问题的文章,但找不到任何有效的代码

我做错了什么

是否有其他类似的解决方案可以将SVG合并到一个文件中并将其用作响应图像


谢谢

正如您所发现的,IE有一个bug,如果您不同时提供宽度和高度,它就无法正确缩放SVG

为了让它在IE中工作,你可以使用Nicolas Gallagher发现的一个技巧(?)

该技巧使用
元素。IE可以正确缩放画布元素。因此,如果使用SVG在
中放置一个,SVG最终将达到正确的大小。您只需要为画布提供与SVG相同的纵横比

<div style="position:relative;width:100%;background:blue;">
  <canvas width="254" height="108"></canvas>
  <svg class="mys" viewBox="0 0 254 108" preserveAspectRatio="xMaxYMax meet">
    <use xlink:href="#mys"></use>
  </svg>
</div>
画布{
显示:块;
宽度:100%;
可见性:隐藏;
}
svg{
位置:绝对位置;
排名:0;
左:0;
宽度:100%;
}

正如您所发现的,IE存在一个缺陷,如果您不同时提供宽度和高度,它将无法正确缩放SVG

为了让它在IE中工作,你可以使用Nicolas Gallagher发现的一个技巧(?)

该技巧使用
元素。IE可以正确缩放画布元素。因此,如果使用SVG在
中放置一个,SVG最终将达到正确的大小。您只需要为画布提供与SVG相同的纵横比

<div style="position:relative;width:100%;background:blue;">
  <canvas width="254" height="108"></canvas>
  <svg class="mys" viewBox="0 0 254 108" preserveAspectRatio="xMaxYMax meet">
    <use xlink:href="#mys"></use>
  </svg>
</div>
画布{
显示:块;
宽度:100%;
可见性:隐藏;
}
svg{
位置:绝对位置;
排名:0;
左:0;
宽度:100%;
}

附带说明,以帮助那些努力实施此修复或发现其无法使用外部svg文件而不是页面svg标记的人

您需要确保在文本编辑器中编辑svg文件时,在打开的
标记中不缺少viewBoxpreserveAspectRatio属性。如果这些都丢失了,不管你应用了什么修复程序,svg仍然不会在IE中扩展——即使它可以在其他浏览器中扩展而不会出现问题


如果设置了这些选项,您可以定义用于将svg拉入到100%的图像元素的宽度/高度,并使用“最大宽度”或“最大高度”限制缩放,它将按预期执行。尽管如此,您仍然可能会遇到一些对齐问题。

附带说明,以帮助那些努力实施此修复或发现其无法使用外部svg文件而不是页面svg标记的人

您需要确保在文本编辑器中编辑svg文件时,在打开的
标记中不缺少viewBoxpreserveAspectRatio属性。如果这些都丢失了,不管你应用了什么修复程序,svg仍然不会在IE中扩展——即使它可以在其他浏览器中扩展而不会出现问题


如果设置了这些选项,您可以定义用于将svg拉入到100%的图像元素的宽度/高度,并使用“最大宽度”或“最大高度”限制缩放,它将按预期执行。尽管如此,您仍然可能会遇到一些对齐问题。

尼古拉斯·加拉赫的解决方案非常有效,但是,在缩小视口时,我遇到了一些响应问题。我想我会通过我使用的修复:


我用最大宽度更新了“父div”:100%

.parent div{
位置:相对位置;
显示:内联块;
高度:550px;
最大宽度:100%;
}

这并不能解决所有的缩放问题。您仍然需要使用媒体查询来更改高度,但至少svg不会破坏其容器。希望这对其他人有所帮助。

尼古拉斯·加拉赫(Nicolas Gallagher)的解决方案非常有效,但是,在缩小视口时,我遇到了一些响应问题。我想我会通过我使用的修复:


我用最大宽度更新了“父div”:100%

.parent div{
位置:相对位置;
显示:内联块;
高度:550px;
最大宽度:100%;
}

这并不能解决所有的缩放问题。您仍然需要使用媒体查询来更改高度,但至少svg不会破坏其容器。希望这对某人有所帮助。

如果您正在使用

SCSS


如果使用

SCSS


对你有用吗?不,现在已经很不成熟了。我可以在没有ie8支持的情况下生活,但不能没有Android支持。谢谢你指出这一点。对你有用吗?不,这一点已经很成熟了。我可以在没有ie8支持的情况下生活,但不能没有Android支持。谢谢你指出,答案很好。同时,我自己意识到我可以给svg绝对定位,但不能避免为父相对元素使用填充底部。这个效果好多了!:)谢谢您是否将画布元素的宽度和高度设置为与SVG相同?如果不明确设置高度和宽度,是否就无法执行此操作?我希望能够以不同的纵横比交换SVG,而无需不断重新计算宽度和高度。对我来说,还可以将CSS中的宽度设置为
1em
,这样我就可以用
字体大小来缩放SVG
.ie-svgHeight {
  position: relative;

  &-canvas {
    display: block;
    visibility: hidden;
    position: absolute;
    top: 0;
    left: 0;
    height: 100%;
  }
  &-img { height: 100%; }
}