2015-10-07 35 views
2

我在頁面上有三個SVG圖像。一個是「圖像編輯器」,您可以在其中輸入一些文本,圖標,拖動和縮放等等。如何樣式/操作SVG的內容USE元素

另外兩個SVG通過USE元素使用頂級SVG中的內容,並顯示最終結果。

Screenshot of the editor

當我編輯在編輯器中的東西,兩個預覽自動更新。完善。但我不想在底部的兩個預覽SVG中顯示邊界框,轉換工具,指南等。

有沒有一種方法來樣式(CSS)或操縱(JS)這些SVG的(影子)DOM不顯示這些額外的元素?

+1

你可以克隆原和操縱克隆或重組原讓''不點的東西,包括調整大小手柄。 –

+0

我想嘗試通過使用實例來找到更乾淨的解決方案。這樣我就不必跟蹤克隆。這是一個潛在的失敗點。 – Dreamdealer

回答

1

更改編輯器代碼,以便繪圖元素進入一個組,並且把手元素進入另一個組。然後在您的克隆中,SVG將您的<use>元素引用到第一組。

svg { 
 
    border: solid 1px black; 
 
}
<svg width="500" height="300" viewBox="0 0 500 300"> 
 
    
 
    <g id="drawing"> 
 
    <ellipse cx="250" cy="150" rx="200" ry="100" fill="orange"/> 
 
    </g> 
 
    
 
    <g id="handles"> 
 
    <rect x="50" y="50" width="400" height="200" fill="none" stroke="blue" stroke-dasharray="10"/> 
 
    </g> 
 
    
 
</svg> 
 

 

 
<br/> 
 

 

 
<svg width="250" height="150" viewBox="0 0 500 300"> 
 
    <use xlink:href="#drawing"/> 
 
</svg>

+0

很好的建議,但不幸的是我使用編輯器中的每個元素也包含句柄的組。所有代碼都基於這個原則。如果我想實現這個解決方案,我需要重寫幾乎所有東西: – Dreamdealer

+2

然後你被卡住了,使用引用的內容是原始的直接和不可修改的克隆,你不能覆蓋它的樣式 –

+0

@ PaulLeBeau的問題不值得一個uvote? – Persijn

1

就像@paulLeBeau答案我建議把它的一組元素之外。
這裏的javascript代碼將把句柄放在組元素的所有角落。 (在本例中爲edit-group)。
如果你有一個你已經畫好的組,你可以簡單地把這個組放到這個代碼中,它應該創建句柄。

function setAttributes(elem, attrs) { 
 
    for (var key in attrs) { 
 
    elem.setAttribute(key, attrs[key]); 
 
    } 
 
} 
 

 
document.addEventListener("DOMContentLoaded", function(event) { 
 
    var svgns = "http://www.w3.org/2000/svg" 
 
    var svgdoc = document.getElementById("edit-svg"); 
 

 
    var editgroup = svgdoc.getElementById("edit-group"); 
 
    var grouprect = editgroup.getBBox(); 
 

 
    var handle = document.createElementNS(svgns, "rect"); 
 
    setAttributes(handle, { 
 
    "transform": "translate(-1.5 -1.5)", 
 
    "fill": "none", 
 
    "stroke": "black", 
 
    "stroke-width": "0.5", 
 
    "width": "3", 
 
    "height": "3", 
 
    "x": grouprect.x, 
 
    "y": grouprect.y 
 
    }); 
 
    svgdoc.appendChild(handle); 
 
    
 
    var handle2 = document.createElementNS(svgns, "rect"); 
 
    setAttributes(handle2, { 
 
    "transform": "translate(-1.5 -1.5)", 
 
    "fill": "none", 
 
    "stroke": "black", 
 
    "stroke-width": "0.5", 
 
    "width": "3", 
 
    "height": "3", 
 
    "x": grouprect.x + grouprect.width, 
 
    "y": grouprect.y 
 
    }); 
 
    svgdoc.appendChild(handle2); 
 
    
 
    var handle3 = document.createElementNS(svgns, "rect"); 
 
    setAttributes(handle3, { 
 
    "transform": "translate(-1.5 -1.5)", 
 
    "fill": "none", 
 
    "stroke": "black", 
 
    "stroke-width": "0.5", 
 
    "width": "3", 
 
    "height": "3", 
 
    "x": grouprect.x, 
 
    "y": grouprect.y + grouprect.height 
 
    }); 
 
    svgdoc.appendChild(handle3); 
 
    
 
    var handle4 = document.createElementNS(svgns, "rect"); 
 
    setAttributes(handle4, { 
 
    "transform": "translate(-1.5 -1.5)", 
 
    "fill": "none", 
 
    "stroke": "black", 
 
    "stroke-width": "0.5", 
 
    "width": "3", 
 
    "height": "3", 
 
    "x": grouprect.x + grouprect.width, 
 
    "y": grouprect.y + grouprect.height, 
 
    }); 
 
    svgdoc.appendChild(handle4); 
 
    
 
    var dotted = document.createElementNS(svgns, "rect"); 
 
    setAttributes(dotted, { 
 
    "fill": "none", 
 
    "stroke": "black", 
 
    "stroke-width": "0.5", 
 
    "stroke-dasharray": "5", 
 
    "width": grouprect.width, 
 
    "height": grouprect.height, 
 
    "x": grouprect.x, 
 
    "y": grouprect.y 
 
    }); 
 
    svgdoc.appendChild(dotted); 
 

 
});
.main { 
 
    border: 1px solid black; 
 
} 
 
#edit-svg { 
 
    width: 500px; 
 
} 
 
.preview svg { 
 
    border: 1px solid black; 
 
}
<div class="main"> 
 
    <svg id="edit-svg" viewbox="0 0 110 50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 
 
    <g id="edit-group"> 
 
     <text x=5 y=40 font-size="10" stroke="firebrick">Ask us almost anything</text> 
 
    </g> 
 
    </svg> 
 
</div> 
 
<div class="preview"> 
 
    <h2>Preview</h2> 
 
    <svg width="500px" viewBox="0 0 110 50"> 
 
    <use x="0" y="0" xlink:href="#edit-group" /> 
 
    </svg> 
 
</div>