D3.js中<use>元素使用异常:元素超出容器,请求排查问题
解决D3.js中
嘿,我看到你遇到了
首先看你给出的代码片段,有两个关键问题导致了元素超出容器或者无法正常渲染:
1. 数据绑定流程错误(核心问题)
在D3中使用数据驱动生成元素时,必须先通过selectAll()声明你要创建/操作的目标元素(哪怕元素还不存在),然后再绑定数据。你的代码里跳过了selectAll("use")这一步,直接给<g>元素绑定了数据,这会导致enter()的逻辑完全偏离预期,生成的元素位置自然会错乱。
2. x属性的回调函数未完成
你写了attr("x", function(d)...但没有完成函数体,没有返回值的话,<use>元素的x坐标会是默认值(或者undefined),这也会导致元素位置异常。
另外,补充一个兼容性小细节:部分旧版浏览器或D3版本可能需要使用xlink:href而非href来引用defs中的元素,不过现代环境下href已经足够。
修正后的完整代码
var body = d3.select("body"); var svg = body.append("svg") .attr("width", 500) .attr("height", 800); // 在defs中定义可复用的矩形(不需要设置x/y,由<use>来控制位置) svg.append("defs") .append("rect") .attr("id", "square") .attr("width", 50) .attr("height", 50) .attr("fill", "steelblue"); // 加个填充色方便查看效果 // 生成x坐标数组:10, 60, 110, ..., 360 var row = d3.range(10, 361, 50); console.log(row); // 正确的数据绑定流程:selectAll -> data -> enter -> append svg.append("g") .attr("id", "row1") .selectAll("use") // 关键:先声明要创建的<use>元素 .data(row) .enter() .append("use") .attr("href", "#square") // 如果遇到兼容性问题,换成"xlink:href" .attr("y", 10) .attr("x", function(d) { return d; // 返回数组中的值作为x坐标 });
验证效果
修正后,每个正方形的x坐标会依次是10、60、110...360,每个正方形宽度50,最后一个正方形的右边缘是360+50=410,完全在500宽度的SVG容器内,不会超出范围。
内容的提问来源于stack exchange,提问作者Arius
相关产品推荐
相关产品推荐

