如何在D3.js中实现元素上下层级排列?附代码场景
在D3.js中调整元素层级(将元素置于另一个元素下方)
嘿,针对你现在的场景——想把SVG标记图像放到圆形元素的下方,我给你整理了几种D3.js里常用的层级调整方法,都很实用:
方法1:创建元素时直接指定插入位置(推荐)
你原来用append()添加图像,append()会把元素加到父容器的最后,也就是层级最顶端。如果想让图像一开始就处于圆形下方,可以用insert()方法,指定把图像插入到圆形元素的前面:
var circle = svg.append("circle") .attr("r",5) .attr("cx",100) .attr("cy",200) .style("stroke","#FF0000"); var circleBox = circle.node().getBBox(); var widthMarker=100; // 用insert代替append,第二个参数是参考元素circle,会把img插到circle前面 var img = svg.insert("svg:image", circle) .attr("xlink:href", "marker.svg") .attr("width", widthMarker) .attr("height", widthMarker) .attr("x", circleBox.x + circleBox.width/2 - widthMarker/2) .attr("y", circleBox.y + circleBox.height/2 - widthMarker/2);
这样创建出来的图像就会默认在圆形的下方,圆形自然显示在上面。
方法2:对已创建的元素调整层级
如果两个元素都已经创建好了,D3从v4版本开始提供了raise()和lower()两个便捷方法:
raise():把元素提升到父容器的最上层lower():把元素降到父容器的最下层
针对你的场景,两种写法都能实现需求:
// 把圆形提升到最上层(覆盖在图像上面) circle.raise(); // 或者把图像降到最下层(让圆形在上面) img.lower();
方法3:原生DOM操作兜底
如果你习惯原生DOM操作,也可以直接调用DOM节点的insertBefore()方法:
// 获取svg和两个元素的DOM节点 var svgNode = svg.node(); var circleNode = circle.node(); var imgNode = img.node(); // 把图像节点插入到圆形节点的前面 svgNode.insertBefore(imgNode, circleNode);
小提示
如果你的D3版本是v5及以上,xlink:href可以简化为href,不过用xlink:href也兼容旧版本,没问题。
内容的提问来源于stack exchange,提问作者yavg




