Get screen coordinates of DOM element

前端 未结 3 1643
春和景丽
春和景丽 2020-12-31 09:41

Can I somehow get precise screen coordinates (relative to top left corner of the screen) of a DOM object. Through NPAPI\\FireBreath or JavaScript. (Need this for plugin, tha

相关标签:
3条回答
  • 2020-12-31 09:59

    P.S.: I know I made this question long ago, but I want to summarize what I got at the end.

    element.offsetLeft\Top doesn't work truly the way it meant to be in question.
    From the HTML you can get coords, relative to top-left corner of page's space, not the user screen itself.

    And from plugin, by GetWindowRect() winAPI function you can get coordinates of top-left corner of the browser window, relative to user screen, and by GetClientRect() you can get coords of the top left corner of Client rectangle.

    BUT, it isn't the same point as top-left of page, there is always something between corner of page's space, and client rect, or window rect. It includes top browser bars and other stuff.

    What you can do? It seems that there is no easy 100% controllable way:

    You can try to consider those browser bars and calculate the space between Client rect and page's rectangle, but those browser bars not constant from user to user, one can have more of them, that another, and you will get all your coordinate system screwed up. Then, you can somehow register the amount of installed bars and additions to browser, and according to that calculate amount of space, that will be consumed by them, but bars and additions not the same, and again you got way too much variables to consider.

    There is a bit easier way, you can go not from top, but from the bottom - get the coord's of bottom point of rect and through some calculations with HTML's element.offset - bind your coordinate system to bottom-left point of the window.
    You got no user browser bars at the bottom, and therefore can be a little more confident in space between page and window corner, but some browsers got pop-up bars there with download information e.t.c, and here we got everything screwed up again.

    Another option is to use modal window's - i.e. open the page in modal window through window.open() from your JavaScript, you can control amount of browser controls and bars in those windows, you can get rid of all those userbars and make a clear window only with address bar and the page. Now you got much more control, and can almost be sure, that this space between corners will be the same for all your users... almost.
    There is two things need to be mentioned:

    1)Some browsers (for example google chrome, as I remember) got those custom browser additions (Firebug for example) to appear as small icons near address bar, and they are still appearing near the address bar of the modal window.
    What the difference you can ask - the difference is, that, for some reason, top of the browser window will became around 5 pixels fatter, if there's even one of those icons.(again you can try to register, are there any of those installed on user browser, or not)
    And if, anyway, those 5px not crucial for you - it can be a way to go.. if you're ok with the next thing.

    2)Obvious one - that fun with modal windows can be uncomfortable for end-user, cos it cuts some browser controls and mechanics that browser users get used to.

    0 讨论(0)
  • 2020-12-31 10:20

    you move cursor to somewhere of the page ,and make a click event.(find the window,then GetWindowRect ,caculate a sutable position) then you can catch the event,record clientX and clientY. By this ,you build a bridge between two different coordinate system.

    0 讨论(0)
  • 2020-12-31 10:22

    I know you didn't mention jQuery, but you can use http://api.jquery.com/offset/ as an example. It combines the offsetLeft/top of all the parents and accounts for scrolling, giving you an accurate x,y (in relation to the body) for nested nodes.

    Note that if you're handling events, the event object always tells you where the event happened using http://api.jquery.com/event.pageX/ and http://api.jquery.com/event.pageY/

    Again, mentioning jQuery is for inspiration only if you don't want to use it.

    Here's how jQuery does it

    $.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
        };
    }
    
    0 讨论(0)
提交回复
热议问题