假设我有几个复合形状(<g>).我希望能够点击并拖动它们,但是我希望我碰巧在Z顺序中将其拖动到另一个的TOP上,这样如果我将它拖到其他的那个上,那么另一个一个人应该黯然失色.
Sam*_*Sam 109
SVG中的Z索引由元素在文档中出现的顺序定义.如果要将特定形状置于顶部,则必须更改元素顺序.
Eri*_*röm 33
在树中移动元素的替代方法是使用<use>更改xlink:href属性的元素,以便为您提供所需的z顺序.
这是svg-developers邮件列表上的一个旧线程,在想要动画某些形状的上下文中讨论这个主题.
更新:
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
style="width:100%; height: 100%">
<circle id="c1" cx="50" cy="50" r="40" fill="lime" />
<rect id="r1" x="4" y="20" width="200" height="50" fill="cyan" />
<circle id="c2" cx="70" cy="70" r="50" fill="fuchsia" />
<use id="use" xlink:href="#c1" />
</svg>
Run Code Online (Sandbox Code Playgroud)
在这个例子中,<use>元素是最后一个元素,这使它成为最前面的元素.我们可以通过更改xlink:href属性来选择任何其他元素作为最前面的元素.在上面的例子中,我们选择了圆圈id="c1",这使它看起来像是最顶层的元素.
看小提琴.
CoR*_*CoR 21
这是老问题,但......
在FireFox(7+)和Chrome(14+)上,您可以将svg_element拉到顶部.这并没有给你完全z轴控制的自由,但它总比没有好;)
只需再次添加该元素即可.
var svg = doc.createElemNS('svg');
var circle = doc.createElemNS('circle');
var line = doc.createElemNS('line');
svg.appendChild(circle); // appends it
svg.appendChild(line); // appends it over circle
svg.appendChild(circle); // redraws it over line now
Run Code Online (Sandbox Code Playgroud)
我以为它会抛出错误或其他东西.
appendChild ==替换自己==重绘
小智 5
是的,顺序是指定哪个对象将在另一个对象之前的顺序。要操纵顺序,您将需要移动有关DOM的内容。SVG Wiki上有一个很好的例子,网址为https://www.w3.org/TR/SVG11/render.html#RenderingOrder
未提及的另一种解决方案是将每个svg项目/项目集放入div。您可以轻松更改div的z索引。
...按下按钮可将该元素“推”到前面。(vs重新粉刷整个集合并将1个元素推到前面,但保持原始顺序与接受的解决方案中一样)
具有相对的z索引将非常好...
如果它是来自jsfiddle的链接,stackOverflow要我放代码吗?
var orderArray=[0,1,2];
var divArray = document.querySelectorAll('.shape');
var buttonArray = document.querySelectorAll('.button');
for(var i=0;i<buttonArray.length;i++){
buttonArray[i].onclick=function(){
var localI = i;
return function(){clickHandler(orderArray.indexOf(localI));};
}();
}
function clickHandler(divIndex) {
orderArray.push(orderArray.splice(divIndex, 1)[0]);
orderDivs();
}
function orderDivs(){
for(var i=0;i<orderArray.length;i++){
divArray[orderArray[i]].style.zIndex=i;
}
}Run Code Online (Sandbox Code Playgroud)
svg {
width: 100%;
height: 100%;
stroke: black;
stroke-width:2px;
pointer-events: all;
}
div{
position:absolute;
}
div.button{
top:55%;
height:5%;
width:15%;
border-style: outset;
cursor:pointer;
text-align: center;
background:rgb(175, 175, 234);
}
div.button:hover{
border-style: inset;
background:yellow;
}
div.button.first{
left:0%;
}
div.button.second{
left:20%;
}
div.button.third{
left:40%;
}Run Code Online (Sandbox Code Playgroud)
<div class="shape">
<svg>
<circle cx="50" cy="50" r="40" fill="lime" />
</svg>
</div>
<div class="shape">
<svg>
<rect x="4" y="20" width="200" height="50" fill="cyan" />
</svg>
</div>
<div class="shape">
<svg>
<circle cx="70" cy="70" r="50" fill="fuchsia" />
</svg>
</div>
<div class='button first'>lime</div>
<div class='button second'>cyan</div>
<div class='button third'>fuchsia</div>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
80211 次 |
| 最近记录: |