SVG使用元素来克隆SVG

时间:2012-11-12 10:04:31

标签: svg d3.js

是否可以在单独的svg中“使用”整个其他svg?我想在同一页面上使用d3生成的地图作为图标。这是我尝试过的,但它不起作用。

 <svg id="map">
    svg stuff here
 </svg>


 <svg id="bar"> 
     svg stuff here
     <use xlink:href="#map" height="20" width="30" ...>
 </svg>

还尝试了克隆方法,但最终在另一个svg中使用了整个svg并且无法进行扩展。例如。 makeicon(“#map”,“#ici”)

function makeicon(source, destination) {
    //https://groups.google.com/forum/?fromgroups=#!topic/d3-js/-EEgqt29wmQ
    var src = d3.select(source);
    var dest = d3.select(destination);

    if (!src.empty() && !dest.empty()) {

        var newNode = d3.select(dest.node().insertBefore(src.node().cloneNode(true),
            src.node().nextSibling))
            .attr("id", "newnode")
            .attr("width", null)  // remove height and width of original svg
            .attr("height", null)

            .attr("viewBox", "0 0 20 30");   // try to make it smaller

        return newNode;

3 个答案:

答案 0 :(得分:3)

它应该可以正常工作。

这是一个在Firefox,Opera和Chrome中运行良好的简单示例: http://jsfiddle.net/gew54/

来源:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
        <style type='text/css'>
            svg {
                width: 100px;
                height: 100px;
            }
        </style>
    </head>
    <body>
        <svg id="map" viewBox="0 0 100 100">
            <circle cx="50" cy="50" r="20" fill="lime"/>
        </svg>
        <svg id="bar" viewBox="0 0 100 100">
            <use xlink:href="#map" />
        </svg>
    </body>
</html>

答案 1 :(得分:0)

目前考虑到非常有限的支持(仅 Gecko引擎),可以使用CSS 3 element()函数来完成。

MDN文档还将您的案例指定为常见用例:

  

...使用它的一个特别有用的场景是渲染一个   HTML&lt; canvas&gt;中的图片元素,然后使用它作为   背景


Live Demo

答案 2 :(得分:0)

您可以使用svgWeb使其在webkit浏览器中运行。