获取DOM元素的屏幕坐标(Get screen coordinates of DOM element

2019-08-18 05:14发布

我能以某种方式得到精确的屏幕坐标(相对于屏幕的顶部左上角)一个DOM对象。 通过NPAPI \ FireBreath或JavaScript。 (需要这个插件,我正在与FireBreath写)

Answer 1:

您将光标移动到页面的某个地方,并作出click事件。(找到窗口,然后GetWindowRect,caculate一个sutable位置),那么你可以捕捉事件,记录clientX和clientY。 通过这种方式,你建立两个不同的坐标系之间的桥梁。



Answer 2:

PS:我知道,我很久以前就这个问题,但我想总结一下我在结束了。

element.offsetLeft\Top不起作用真正的意思是有问题的途径。
从HTML,你可以得到COORDS,相对于页面的空间,而不是用户本身屏幕左上角。

而从插件,通过GetWindowRect() WINAPI功能,你可以得到相对于用户屏幕的浏览器窗口的左上角的坐标,以及由GetClientRect()你可以得到客户端矩形的左上角的COORDS。

但是,这是不一样的点作为页面的左上角,总有网页的空间角落,和客户端RECT,或矩形窗口之间的东西。 它包括顶部的浏览器栏和其他的东西。

你可以做什么? 看来,有没有简单的100%可控的方式:

你可以尽量考虑那些浏览器酒吧和计算之间的空间Client rect和页面的矩形,但这些浏览器用户禁止不恒定的用户,可以有更多的人,另一个,你会得到你所有的坐标系搞砸了。 然后,你能以某种方式注册安装酒吧和补充到浏览器的数量,并根据空间计算量,即会被他们消耗掉,但酒吧和增加不一样的,而你又得到了太多的因素需要考虑。

有一点更简单的方法,你可以从上面走,而是从底部-打通一些计算与HTML的矩形的底部点和坐标的element.offset -您的坐标系统绑定到窗口的左下角点。
您在底部没有得到用户的浏览器吧,因此,可以是一个小页面和窗口的角落之间的空间更加自信,但一些浏览器与下载信息等拿到弹出的酒吧有,在这里,我们把一切都再次搞砸了。

另一种选择是使用模态窗口的-即在模式窗口通过打开页面window.open()从你的JavaScript,你可以控制浏览器控件和酒吧的数量在这些窗口中,你可以摆脱所有这些userbars,并做出明确只有地址栏和页面窗口。 现在,你有更多的控制,并且几乎可以肯定的,那角落之间的空间将是为所有用户一样的...差不多。
有两件事情需要提及:

1)有些浏览器(如谷歌Chrome,我记得)得到了那些自定义浏览器添加(萤火虫为例)出现近地址栏中显示为小图标,而他们仍然出现在模式窗口的地址栏附近。
你可以问什么区别 - 不同的是,是,由于某种原因,浏览器窗口的顶部变为约5个像素胖,如果有,即使这些图标中的一个(你可以再次尝试注册,是否有任何这些。安装在用户的浏览器,或不)
如果,无论如何,那些5PX不适合你的关键 - 它可以是长的路要走..如果你确定与未来的事情。

2)明显的 - 与模态窗口好玩可以舒服的最终用户,因为这一切削减一些浏览器控件和力学浏览器用户习惯。



Answer 3:

我知道你没有提到的jQuery,但您可以使用http://api.jquery.com/offset/作为一个例子。 它结合了offsetLeft/top所有的家长和占滚动,给你一个准确的X,Y(相对于体)嵌套节点。

请注意,如果你正在处理事件,事件对象总是告诉你在哪里事件发生使用http://api.jquery.com/event.pageX/和http://api.jquery.com/event.pageY/

再次,提jQuery是灵感仅当您不想使用它。

这里是jQuery的是怎么做的

$.fn.offset = function (options) {
    var elem = this[0],
        doc = elem && elem.ownerDocument;

    if (!doc) {
        return null;
    }

    if (elem === doc.body) {
        return jQuery.offset.bodyOffset(elem);
    }

    return getOffset(elem, doc, doc.documentElement);
}

function getOffset(elem, doc, docElem, box) {
    try {
        box = elem.getBoundingClientRect();
    } catch(e) {}

    // Make sure we're not dealing with a disconnected DOM node
    if (!box || !jQuery.contains(docElem, elem)) {
        return box ? {
            top: box.top,
            left: box.left
        } : {
            top: 0,
            left: 0
        };
    }

    var body = doc.body,
        win = getWindow(doc),
        clientTop = docElem.clientTop || body.clientTop || 0,
        clientLeft = docElem.clientLeft || body.clientLeft || 0,
        scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop,
        scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
        top = box.top + scrollTop - clientTop,
        left = box.left + scrollLeft - clientLeft;

    return {
        top: top,
        left: left
    };
}


文章来源: Get screen coordinates of DOM element