我正在使用 D3 javascript 库进行可视化。我想为可视化的某些元素创建工具提示,并且我的客户希望它们看起来像“纸片/便利贴”。最初,我使用一些不错的 CSS 技巧为工具提示创建了普通的 DIV,以创建所需的外观。(受本教程启发)
我想使用将工具提示封装到 SVG foreignObject 元素中,这样它就更适合可视化并且我可以轻松地操作它们。(例如缩放/平移)所以我的问题是:如何获得位于 foreignObject 元素内的 DIV 的正确大小,以便我可以准确设置 foreignObject 元素的大小?特别是在使用边距/填充/阴影时....
我通过使用.getBoundingClientRect()弄清楚了,但我不知道这是否是最好的方法。
这是一个代码示例:
var body = d3.select("body");
var svg = body.append("svg");
var tooltipContainer = svg.append("svg:g");
var html = tooltipContainer.append("foreignObject")
var div = html.append("xhtml:div")
.attr('class', 'paper-tooltip')
.html("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec eu enim quam. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec eu enim quam. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec eu enim quam. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec eu enim quam. ");
var bcr = div[0][0].getBoundingClientRect();
html.attr('x', 50)
.attr('y', 50)
.attr('width', bcr.width)
.attr('height', bcr.height);
svg.call(d3.behavior.zoom().on('zoom', redrawOnZoom));
function redrawOnZoom(){
tooltipContainer.attr('transform', 'translate(' + d3.event.translate + ')' + ' scale(' + d3.event.scale + ')');
};
这是一个有效的 jsFiddle 示例:http: //jsfiddle.net/jhe8Y/1/
编辑:
我意识到,对于不同的阴影框设置,.getBoundingClientRect()将不起作用。我还意识到,在我的第一个解决方案中,.getBoundingClientRect()返回的尺寸太大,尤其是在正确的尺寸上。
所以我尝试了另一种方法,使用 jQuerys .outerWidth(true)/.outerHeight(true) 并手动计算阴影大小。这似乎工作正常,但做这样的事情感觉非常糟糕。
有没有其他方法可以获取 DIV 及其所有组件的确切大小?
更新的 jsFiddle 在这里:http: //jsfiddle.net/jhe8Y/3/