Get width of d3.js SVG text element after it's created
18,492
Solution 1
I would make the length part of the original data:
var nodesText = svg.selectAll("text")
.data(dataset)
.enter()
.append("text")
.text(function(d) {
return d.name;
})
.attr("x", function(d, i) {
return i * (w / dataset.length);
})
.attr("y", function(d) {
return 45;
})
.each(function(d) {
d.width = this.getBBox().width;
});
and then later
var nodes = svg.selectAll("rect")
.data(dataset)
.enter()
.append("rect")
.attr("width", function(d) { return d.width; });
Solution 2
You can use getBoundingClientRect()
Example:
.style('top', function (d) {
var currElemHeight = this.getBoundingClientRect().height;
}
edit: seems like its more appropriate for HTML elements. for SVG elements you can use getBBbox() instead.
Related videos on Youtube
Author by
sanjaypoyzer
Updated on September 15, 2022Comments
-
sanjaypoyzer over 1 year
I'm trying to get the widths of a bunch of
text
elements I have created with d3.jsThis is how I'm creating them:
var nodesText = svg.selectAll("text") .data(dataset) .enter() .append("text") .text(function(d) { return d.name; }) .attr("x", function(d, i) { return i * (w / dataset.length); }) .attr("y", function(d) { return 45; });
I'm then using the width to create
rectangles
the same size as thetext
's boxesvar nodes = svg.selectAll("rect") .data(dataset) .enter() .append("rect") .attr("x", function(d, i) { return i * (w / dataset.length); }) .attr("y", function(d) { return 25; }) .attr("width", function(d, i) { //To Do: find width of each text element, after it has been generated var textWidth = svg.selectAll("text") .each(function () { return d3.select(this.getComputedTextLength()); }); console.log(textWidth); return textWidth; }) .attr("height", function(d) { return 30; })
I tried using the Bbox method from here but I don't really understand it. I think selecting the actual element is where I'm going wrong really.
-
subsci almost 9 years
-
Lars Kotthoff almost 9 yearsThe total width you set for the text.