【问题标题】:Why nest an <svg> element inside another <svg> element?为什么要将 <svg> 元素嵌套在另一个 <svg> 元素中?
【发布时间】:2013-06-03 05:04:46
【问题描述】:

为什么像这样的演示:http://jsbin.com/ejorus/2/edit,有一个 &lt;svg&gt; 元素嵌套在另一个 &lt;svg&gt; 元素中?

<svg class="graph">
    <svg viewBox="0 0 1000 1000" preserveAspectRatio="none">
        <g transform="translate(30,0)">
            <!-- ... -->
        </g>
    </svg>
</svg>

JS Bin 是这篇博文中the demo 的修改版本:http://meloncholy.com/blog/making-responsive-svg-graphs/

【问题讨论】:

    标签: svg


    【解决方案1】:

    嵌套 SVG 元素有助于将 SVG 形状组合在一起,并且 将它们定位为一个集合。嵌套在 svg 元素内的所有形状 将是positioned (x, y) relative toposition (x, y) 封闭 svg 元素。通过移动 x 和 y 坐标 封闭 svg 元素,你也可以移动所有嵌套的形状。

    这是一个示例,其中两个矩形嵌套在两个 svg 中 元素。除了颜色之外,这两个矩形具有相同的 x, y, heightwidth 的定义。封闭的svg 元素具有不同的 x 值。由于x-position 的 矩形相对于其封闭的 svg 元素进行解释 x-position,两个矩形显示在不同位置 x 位置。

    - 雅各布·詹科夫

    <svg xmlns="http://www.w3.org/2000/svg"
      xmlns:xlink="http://www.w3.org/1999/xlink">
      <svg x="10">
        <rect x="10" y="10" height="100" width="100"
            style="stroke:#ff0000; fill: #0000ff"/>
      </svg>
      <svg x="200">
        <rect x="10" y="10" height="100" width="100"
            style="stroke:#009900; fill: #00cc00"/>
      </svg>
    </svg>
    

    Credits

    【讨论】:

    • @chrmod 您是否在答案的最底部看到了一个显示 Credits 的链接?
    • 这是否允许,多个 SVG?如果您可以使用一对svg 作为一个框架,这将使定位变得容易得多。
    • @Mr.Alien 为什么我们不能使用&lt;g&gt;?我认为它的主要用例正是您所描述的。顺便说一句,您认为&lt;g&gt;&lt;svg&gt; 的黑白分组元素有何不同?
    • @GauravRamanan 我刚刚回答了为什么要在 svg 中嵌套 svg 的问题 :)
    • 我的意思是同样的逻辑不适用于 吗?
    【解决方案2】:

    你是对的(正如你在Mr. Alien's answer 中所说的那样)两个 SVG 元素具有相同的相对位置,并且确实在没有外部 SVG 的情况下图表显示良好。

    我添加它的原因是因为 JavaScript(我需要阻止标签被压扁)使用 SVG 元素的 transform matrix(由应用的 viewBox 属性引起)来取消缩放文本。

    不幸的是,返回的矩阵没有考虑应用于 SVG 元素本身的变换,因此我需要获取相对于使用 initial coordinate system 的外部元素的变换矩阵。希望有帮助。

    【讨论】:

    • +1 这很有帮助。谢谢!我正在尝试为我的 Web 应用程序提出一个响应式 SVG 图形解决方案。在your article 中,您提到了D3.js。你会推荐它吗?我有一个关于我尝试使用 Raphaël 的主题的相关问题:stackoverflow.com/questions/16848688/… 任何建议将不胜感激!
    • D3 很棒 - 它确实强大且灵活,尽管它的学习曲线确实很陡峭。我肯定会give it a go。也就是说,如果您想要一些相当普遍的东西,您可能会更快地从其他图形库中获得结果。我没用过拉斐尔,所以不能评论。您可能还想快速查看this web stats 我制作的东西(不幸的是没有响应,但使用了 D3)。有一个demo here
    【解决方案3】:

    您可以定义一个新的viewportviewbox。使用此选项,您可以像使用 css 一样使用 relative positions。更多信息可以在线查看article

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <title>Nested SVG</title>
        <style>
            html,
            body {
                margin: 0;
                padding: 0;
                width: 100%;
                height: 100%;
                overflow: hidden;
            }
        </style>
    </head>
    
    <body>
        <svg width="100%" height="100%">
            <rect x="25%" y="25%" width="50%" height="50%" style="fill: dodgerblue;" />
            <svg x="25%" y="25%" width="50%" height="50%">
                <rect x="25%" y="25%" width="50%" height="50%" style="fill: tomato;" />
            </svg>
        </svg>
    </body>
    
    </html>

    【讨论】:

      【解决方案4】:

      我将出于完全不同的原因这样做:网站实施效率。

      我有几个 SVG 文件,我在通过 AJAX 下载它们后将它们插入到我的网页中。我想将它们合并到一个文件中,因为这样更便于下载。我可以使用文本文件执行此操作,然后将 SVG 文本插入到网页元素的 innerHTML 属性中,但是 .svg 文件比 .txt 文件提供了两个额外的优势:

      1) 标准的 .svgz 格式允许您将预压缩文件存储在 Web 服务器上,无需 mod_deflate。 SVG 文件的压缩效率很高,我看到 70-85% 的压缩率。

      2) 网络浏览器在我的 javascript 代码之外解析 SVG,希望效率更高。要将 svg 元素插入 HTML,我使用父元素的 insertBeforeappendChild 方法而不是 innerHTML

      【讨论】:

        猜你喜欢
        • 2014-12-17
        • 1970-01-01
        • 1970-01-01
        • 2014-01-04
        • 1970-01-01
        • 1970-01-01
        • 2019-06-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多