You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在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

火山引擎 最新活动