JavaScript 获取元素的坐标详解(3)

  这里需要注意一个兼容性的问题,在 Chrome 中可以用 document.body.scrollTop 和 window.pageYOffset,IE 7/8 只能通过 document.documentElement.scrollTop 获取, FireFox 和 IE9+ 可以用 document.documentElement.scrollTop 和 window.pageYOffset 获取,Safari 需要 window.pageYOffset 获取。所以这里我们需要做一下浏览器兼容:

  scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;

  注意这里的顺序,在 IE7/8 中 window.pageYOffset 是 undefined ,document.body.scrollTop 在任何浏览器中都有,只是不支持的值为 0,如果表达式返回 undefined ,会影响后面的计算操作。而 || 运算符是一个短路取真运算符,所以我们要所有浏览器都有的 document.body.scrollTop 方法放在最后,关于 || 运算符的问题,可以参考 《探寻 JavaScript 逻辑运算符(与、或)的真谛》

  我们在刚才的工具上添加一个方法:

1 var Position = {};
2 (function () {
3    Position.getAbsolute = function (reference, target) {
4        var result = {
5            left: -target.clientLeft,
6            top: -target.clientTop
7         }
8        var node = target;
9        while(node != reference && node != document){
10            result.left = result.left + node.offsetLeft + node.clientLeft;
11            result.top = result.top + node.offsetTop + node.clientTop;
12            node = node.parentNode;
13         }
14        if(isNaN(reference.scrollLeft)){
15            result.right = document.documentElement.scrollWidth - result.left;
16            result.bottom = document.documentElement.scrollHeight - result.top;
17        }else {
18            result.right = reference.scrollWidth - result.left;
19            result.bottom = reference.scrollHeight - result.top;
20         }
21        return result;
22     }
23    Position.getViewport = function (target) {
24        var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
25        var scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft;
26        var absolutePosi = this.getAbsolute(document, target);
27        var Viewport = {
28            left: absolutePosi.left - scrollLeft,
29            top: absolutePosi.top - scrollTop,
30         }
31        return Viewport;
32     }
33 })();

  通过 Position.getViewport 方法可以获取元素相对于浏览器窗口的定位:

1 Postion.getViewport(targetNode); //{left: left, top: top}

  五、判断可视区域

  在上面的几个方法中,我们可以获取元素的文档流定位和视窗定位,不过这还是不能判断一个元素是否在可视区域内,因为视窗定位可以是非常大的数字,这样元素就在视窗的后面。这里我们需要使用浏览器视窗高度 window.innerHeight 属性,在 IE8 以下需要用 document.documentElement.clientHeight 来获取。

  windowHeight = window.innerHeight || document.documentElement.clientHeight;

  现在,我们用窗口的高度,减去相对于浏览器窗口的定位,即可获取相对于浏览器窗口右下角的定位;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7725245ec6fa33d3720f7762721443bb.html