我在页面上有三个SVG图像。一个是"图像编辑器"您可以在其中输入一些文字,图标,拖动和缩放等等。
另外两个SVG通过USE元素使用顶级SVG中的内容,并显示最终结果的预览。
当我在编辑器中编辑某些内容时,两个预览会自动更新。完善。但我不想在底部的两个预览SVG中显示边界框,变换工具,指南等。
有没有办法对这些SVG的(阴影)DOM进行样式(CSS)或操纵(JS)以显示这些额外的元素?
答案 0 :(得分:1)
更改编辑器代码,以便绘图元素进入一个组,并且句柄元素进入另一个组。然后在您的克隆SVG中,您的<use>
元素引用第一组。
svg {
border: solid 1px black;
}
&#13;
<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>
&#13;
答案 1 :(得分:1)
就像@paulLeBeau一样,我建议把它放在一组元素之外
这里的javascript代码会将句柄放在group元素的所有角上。 (本例中为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);
});
&#13;
.main {
border: 1px solid black;
}
#edit-svg {
width: 500px;
}
.preview svg {
border: 1px solid black;
}
&#13;
<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>
&#13;