以下SVG在Windows和Linux上的Firefox和Chrome中都能很好地呈现。但是,在IE11中,渲染图形的整体尺寸很小 - 大约170像素宽 - 并且完全不响应浏览器窗口大小的变化,就像在其他浏览器中那样(并且应该):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
</head>
<body>
<svg width="65%" viewBox="0 0 700 620" style="margin-left:auto; margin-right:auto;display:block;">
<svg width="700" height="20" style="margin-left:auto; margin-right:auto;display:block;">
<rect width="100%" height="100%" style="fill:rgb(128,128,255);stroke-width:1px;stroke:rgb(0,0,0);" />
</svg>
<svg width="700" height="600" y="20" viewBox="0 0 700 600" style="margin-left:auto; margin-right:auto;display:block;">
<rect width="100%" height="100%" style="fill:rgb(255,200,255);stroke-width:1px;stroke:rgb(0,0,0);" />
<rect width="100" height="100" x="0" y="0" style="fill:rgb(255,255,200);stroke-width:1px;stroke:rgb(0,0,0);" />
</svg>
</svg>
</body>
</html>
(抱歉内联样式;只是试验,这样更快)
我对SVG有些新意,我在这里没有看到任何特别的错误。这只是IE特定的另一个失败,还是我错过了什么?
注意:已添加jsfiddle link
答案 0 :(得分:10)
因此,事实证明,这是看似无休止的Internet Explorer无法遵守简单,广泛的标准的另一个游行。我可以把它简化为一个简单的例子:
<!DOCTYPE html>
<body>
<svg width="65%" viewBox="0 0 700 600">
<rect width="100%" height="100%" style="fill:rgb(255,100,255);stroke-width:1px;stroke:rgb(0,0,0);" />
</svg>
</body>
在任何真正的浏览器中,这将正确绘制一个粉红色矩形,其宽度为浏览器窗口宽度的65%,宽高比为700w x 600h;更改窗口大小将改变矩形大小。
在Internet Explorer中,这简单地失败了,并绘制了一个小矩形 - 尽管具有适当的宽高比 - 大约170像素宽。谁知道它的尺寸在哪里?无论它来自何处,它都是固定的,并且不受浏览器大小调整的影响。这是关于SVG文档的失败,Firefox,Chrome以及地球上可能的所有其他浏览器都设法兑现。
与往常一样,解决方法是在遇到IE时定义降级的固定大小的SVG标记,例如
<svg width="700mm" height="600mm"...>
并失去了非常想要的调整大小功能。而且,我想,只要我困扰着辨别哪个浏览器正在发挥作用 - 这是我在2014年永远不应该做的事情 - 我也可以在页面上删除一个令人讨厌的注释,告诉用户避开微软并得到一个真正的浏览器。
答案 1 :(得分:8)
不是在SVG元素本身上设置%宽度,而是将SVG分别包含在两个嵌套的div标签中,其中css类分别为“svg-flex”和“svg-flex-inner”。使用图形所需的百分比设置外部元素的宽度,而不是直接在SVG元素上设置它。确保您的SVG元素宽度为100%。
<div class="svg-flex" style="width: 50%;">
<div class="svg-flex-inner" style="width: 50%; position: relative; padding-top: 100%;">
<svg style="width: 100%; height: 100%; position: absolute; margin-top: -100%;">
<!-- Whatever you want here -->
</svg>
</div>
</div>
您可以将这些样式添加到页面
,而不是内联css.svg-flex-inner {
position: relative;
padding-top: 100%;
}
.svg-flex svg {
position: absolute;
margin-top: -100%;
width: 100%;
height: 100%;
}
现在,您可以通过修改外部“svg-flex”元素的宽度来控制SVG的宽度。
如果你的元素不是一个完美的正方形,那么你需要使用以下公式调整padding-top和margin-top值:
(100 * height / width) %.
因此,对于16:9图形,比率为100 * 9/16 = 56.25%
padding-top: 56.25%;
...
margin-top: -56.25%
<强> Here's the fiddle 强>
答案 2 :(得分:1)
此百分比svg适用于IE 11 如果您在http://www.w3schools.com/html/tryit.asp?filename=tryhtml_basic
上进行测试<!DOCTYPE html>
<HTML style="width:100%; height: 100%">
<body style="width:100%; height: 100%">
<svg width="65%" viewBox="0 0 700 600" height ="100%">
<rect width="100%" height="100%" style="fill:rgb(255,100,255);stroke-width:1px;stroke:rgb(0,0,0);" />
</svg>
</body>
</HTML>
我也应该在旧版本上进行测试,最奇怪的变化是将<html>
和<body>
设置为"width:100%; height: 100%"
答案 3 :(得分:0)
您还可以将外部svg放入对象标记中,并且可以正确调整其大小。
答案 4 :(得分:-1)
根据我的经验,IE11不会缩放内联SVG图形,如果增加填充包含元素的宽度也会增加包含元素的高度,即使包含元素不是固定高度。
在我目前的使用案例中(大量使用flexbox)我通过设置
解决了这个问题align-items: stretch;
而不是
align-items: center;
在我的包含元素上。
我的标记看起来像这样:
<section class="container">
<div class="cell">{LOTS OF TEXT</div>
<figure class="cell">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 200">
...
</svg>
<figure>
</section>
我的CSS(实际上是Less)看起来像这样:
.container {
width: 70%;
max-width: 1600px;
display: flex;
align-items: stretch;
> figure {
margin: 0 20px 0 0;
> svg {
width: 100%;
}
}
> .cell {
display: flex;
justify-content: center;
flex-direction: column;
flex: 1 0 0px;
}
}
当然,根据您的实现,您可能需要另一种解决方案来扩展包含元素。
IE如何决定包含元素的“固定”高度,我不知道。
答案 5 :(得分:-3)
使用HTML5并将svg放入DIV中,如下所示。所有浏览者都可以
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
</head>
<body>
<div style="width:700px;height:620px">
<svg width="65%" viewBox="0 0 700 620" style="margin-left:auto; margin-right:auto;display:block;">
<svg width="700" height="20" style="margin-left:auto; margin-right:auto;display:block;">
<rect width="100%" height="100%" style="fill:rgb(128,128,255);stroke-width:1px;stroke:rgb(0,0,0);" />
</svg>
<svg width="700" height="600" y="20" viewBox="0 0 700 600" style="margin-left:auto; margin-right:auto;display:block;">
<rect width="100%" height="100%" style="fill:rgb(255,200,255);stroke-width:1px;stroke:rgb(0,0,0);" />
<rect width="100" height="100" x="0" y="0" style="fill:rgb(255,255,200);stroke-width:1px;stroke:rgb(0,0,0);" />
</svg>
</svg>
</div>
</body>
</html>
答案 6 :(得分:-3)
理论上,SVG的内容不应该知道它之外的内容。这尤其意味着它不应该知道其父元素的宽度。 SVG旨在作为绘图画布,您应将所有位置和尺寸指定为像素。
我发现this article有用了