Javascript Firefox svg渲染:如何获得真实的g位置?

Javascript Firefox svg渲染:如何获得真实的g位置?,javascript,css,svg,cross-browser,Javascript,Css,Svg,Cross Browser,我有一个通过对象加载svg的页面 然后,我调用一个函数,使用内部g元素的宽度、高度、左侧和顶部加载div var cartina = document.getElementById(whatMap); var cartinaContext; cartina.addEventListener("load",function(){ cartinaContext = cartina.contentDocument; va

我有一个通过对象加载svg的页面

然后,我调用一个函数,使用内部g元素的宽度、高度、左侧和顶部加载div

var cartina = document.getElementById(whatMap);
        var cartinaContext;         
        cartina.addEventListener("load",function(){
        cartinaContext = cartina.contentDocument;
        var el   = $("#mappaBase", cartinaContext)[0]; 
        var rect = el.getBoundingClientRect(); 
        var whatContainer = "#containerIcone"+whatMap;
        $(whatContainer).css("position", "absolute");
        $(whatContainer).width(rect.width);
        $(whatContainer).height(rect.height);
        $(whatContainer).css("left", rect.left);
        $(whatContainer).css("top", rect.top);
}
我正在使用getBoundingClientRect()。我正在svg上应用div#containerIcone。 在铬合金中,它运行平稳。Firefox的问题是:当我加载页面时,宽度和高度都被正确加载,但左侧和顶部却没有。如果我用Firefox检查svg,似乎g元素被放置在固定位置,而呈现的g元素有另一个位置(响应窗口尺寸和其他元素位置)。尽管如此,g固定元素对各种大小的窗口反应良好。div置于g元件固定检查位置上方

使用Chrome检查同一个元素会发现每次在g渲染元素所在的位置都会绘制g元素检查框


如何在Firefox中实现这一点?

我找到了一个解决方案,它可以跨浏览器工作。 我没有使用嵌套g元素的.top和.left进行定位,而是获得嵌套元素的宽度和高度

var el   = $(nestedElement); 
var rect = el.getBoundingClientRect(); 
然后我得到父svg元素的宽度和高度

var cartina = document.getElementById(whatMap);
        var cartinaContext;         
        cartina.addEventListener("load",function(){
        cartinaContext = cartina.contentDocument;
        var el   = $("#mappaBase", cartinaContext)[0]; 
        var rect = el.getBoundingClientRect(); 
        var whatContainer = "#containerIcone"+whatMap;
        $(whatContainer).css("position", "absolute");
        $(whatContainer).width(rect.width);
        $(whatContainer).height(rect.height);
        $(whatContainer).css("left", rect.left);
        $(whatContainer).css("top", rect.top);
}
var rectSvg = mysvg.getBoundingClientRect();
然后我从svg中减去el宽度和高度,并将结果除以2。最终的结果是svg内部的空白区域(顶部和左侧),用于将渲染元素el置于svg元素的中心(由浏览器用于控制纵横比)。然后,我将这些结果应用为包含图标的div的css顶部和左侧-它将精确定位在gel元素上

var leftSpace = (rectSvg.width - rect.width)/2;
var topSpace = (rectSvg.height - rect.height)/2;
$(myPositionedDiv).css("left", leftSpace);
$(myPositionedDiv).css("top", topSpace);

然而,通过这种方式,尽管呈现,Firefox仍然正确地定位了元素,左和右都得到了正确的计算。

最好提供一个完整的测试用例,并将标记作为堆栈片段(如果不是JSFIDLE的话)。