以下代码片段展示了我的问题:
SVG应该是一个红色的正方形(里面画了一个蓝色的正方形),在保持其宽高比的同时,随着父级div标签的缩小而缩小。上述示例在Firefox、Chrome(桌面版和Android版)、Safari和Edge中都可以正常工作。它呈现出一个80x80像素的红色正方形:
有趣的是,SVG中多边形等的纵横比始终保持完美,检查蓝色正方形,而多边形通常绘制在被拉伸的SVG的垂直中心。这是“SVG-container”/SVG标记引起的问题,并消耗了比它应该更多的空间。
如何跨浏览器解决这个问题?
我建立了一个小的JSFiddle来演示这个问题。
<style>
div {
background-color: #00FF00;
width: 80px;
}
svg {
background-color: #FF0000;
vertical-align: top;
width: 100%;
height: auto; // PROBLEM
}
rect { fill: #0000FF; }
</style>
<div>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 100 100"
shape-rendering="geometricPrecision"
text-rendering="geometricPrecision"
image-rendering="optimizeQuality"
fill-rule="evenodd"
clip-rule="evenodd"
preserveAspectRatio="xMidYMid meet"
width="100"
height="100"
>
<rect width="90" height="90" x="5" y="5" />
</svg>
</div>
SVG应该是一个红色的正方形(里面画了一个蓝色的正方形),在保持其宽高比的同时,随着父级div标签的缩小而缩小。上述示例在Firefox、Chrome(桌面版和Android版)、Safari和Edge中都可以正常工作。它呈现出一个80x80像素的红色正方形:
只有Internet Explorer 10和11会将SVG垂直拉伸到其预期高度的两倍左右,因此为80x160px:
如果我在样式表中删除/注释“height: auto”语句,则SVG将缩放为80x100px。然而,这会破坏Chrome,在这种情况下,Chrome也会将SVG缩放为80x100px。Firefox和Edge似乎能够处理删除此语句的情况。有趣的是,SVG中多边形等的纵横比始终保持完美,检查蓝色正方形,而多边形通常绘制在被拉伸的SVG的垂直中心。这是“SVG-container”/SVG标记引起的问题,并消耗了比它应该更多的空间。
如何跨浏览器解决这个问题?
我建立了一个小的JSFiddle来演示这个问题。
有一个相关的问题,标题为“SVGs not scaling properly in IE - has extra space”。主要区别在于我实际上在svg标签中直接提供了宽度和高度,这是我需要做的为了兼容Android浏览器。IE仍然会出现问题。Paul LeBeau描述的画布方法似乎遵循不同的假设。
这个问题是以下旧问题的变体,但不完全相同:
- Cross browser SVG preserveAspectRatio
- SVG in img element proportions not respected in ie9
- SVG scaling in Internet Explorer
下面的gist很有趣,但也没有帮助:
- 修复IE9、IE10和IE11中img标签中的SVG不按比例缩放的问题(实际上是关于在img标签中使用SVG,并且删除SVG标签中的宽度和高度参数对我没有用)
这里有一种称为“填充hack”的方法,可以在这里找到详细介绍: