如何使<svg>元素扩展或收缩到其父容器?

use*_*860 108 css html5 svg responsive-design

目标是使<svg>元素扩展到其父容器的大小,在这种情况下为a <div>,无论容器有多大或多小.

代码:

<style>
    svg, #container{
        height: 100%;
        width: 100%;
    }
</style>

<div id="container">
    <svg xmlns="http://www.w3.org/2000/svg" version="1.1" >
         <rect x="0" y="0" width="100" height="100" />
    </svg>
</div>
Run Code Online (Sandbox Code Playgroud)

这个问题最常见的解决方案似乎是viewBox<svg>元素上设置属性.

viewBox="0 0 widthOfContainer heightOfContainer"
Run Code Online (Sandbox Code Playgroud)

但是,在元素中的<svg>元素具有预定义的宽度和/或高度的情况下,这似乎不起作用.例如,<rect>上面代码中的元素明确设置了其宽度和高度.

所以显而易见的解决方案是在这些元素上使用%widths和%high.但这甚至必须要做吗?特别是,因为<img src=test.svg >工作正常并且扩展/收缩而没有明确设置<rect>高度和宽度的任何问题.

如果元素<rect>和像它一样的其他元素必须以百分比定义它们的宽度和高度,那么在Inkscape中有一种方法可以设置它,以便<svg>文档中的所有元素都使用百分比宽度,高度等.而不是固定尺寸?

rob*_*rtc 53

viewBox不是容器的高度,这是你的绘图的大小.将您的viewBox宽度定义为100个单位,然后将您定义rect为10个单位.之后,无论您缩放SVG的大小,rect都将是图像宽度的10%.

  • 但问题是:如何扩展SVG? (29认同)
  • @AdrianLang当您在SVG对象上设置大小时,会自动进行缩放,就像在问题中的代码中已经完成的那样.[这是示例的固定版本](http://jsfiddle.net/robertc/8KVtU/). (5认同)
  • 默认情况下,您的svg将尽可能大,以便它完全可见,但保留它的纵横比(因此方形viewBox不会完全填充矩形父级).如果您确实想强制它完全覆盖父容器,请将[preserveAspectRatio ="none"](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio)添加到SVG元件. (3认同)
  • [我做了一些细微的调整](http://jsfiddle.net/Thyti/8KVtU/452/),以使其在不保留纵横比的情况下在水平和垂直方向上强制调整大小,并使其在IE中起作用,而小提琴@robertc提交的不是。希望它能对将来的人有所帮助! (2认同)

Rez*_*ngi 24

假设我有一个SVG,如下所示: PIC1

而且我想把它放在一个div中并让它响应地填充div.我这样做的方式如下:

首先,我在像inkscape这样的应用程序中打开SVG文件.在文件 - >文档属性中,我将文档的宽度设置为800px,高度设置为600px(您可以选择其他大小).然后我将SVG放入此文档中.

PIC2

然后我将此文件保存为新的SVG文件并从此文件中获取路径数据.现在在HTML中,实现魔术的代码如下:

<div id="containerId">    
    <svg
    id="svgId" 
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
    version="1.1"
    x="0"
    y="0"
    width="100%"
    height="100%"
    viewBox="0 0 800 600"
    preserveAspectRatio="none">
       <path d="m0 0v600h800v-600h-75.07031l-431 597.9707-292.445315-223.99609 269.548825-373.97461h-271.0332z" fill="#f00"/>
    </svg>
</div>
Run Code Online (Sandbox Code Playgroud)

请注意,SVG的宽度和高度都设置为100%,因为我们希望它垂直和水平填充容器,但viewBox的宽度和高度与inkscape中文档的宽度和高度相同,即800px X 600px的.您需要做的下一件事是将preserveAspectRatio设置为"none".如果您需要有关于此属性的更多信息,这里有一个很好的链接.这就是它的全部内容.

还有一件事是这个代码适用于几乎所有主流浏览器,甚至是旧版本,但在某些版本的android和ios上你需要使用一些javascrip/jQuery代码来保持它的一致性.我在文档就绪和调整大小函数中使用以下内容:

$('#svgId').css({
    'width': $('#containerId').width() + 'px',
    'height': $('#containerId').height() + 'px'
});
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!

  • 为preserveAspectRatio注释+1.在追踪高低之后让SVG实际拉伸(不缩放)为div,这是正确的答案. (5认同)

小智 6

最近为我工作的是从标记和所有子标记中删除全部height=""width=""属性<svg>。然后,您可以使用父容器的高度或宽度的百分比进行缩放。

  • 你能举一个可行的例子吗?我什么也做不了。 (3认同)