天天看点

javascript获得DOM元素X,Y坐标的函数

javascript获得DOM元素X,Y坐标的函数

以下是YUI用的函数:

Js代码 

  1. isSafari = (document.childNodes && !document.all && !navigator.taintEnabled);  
  2.     var getXY = function(el) {  
  3.         if (document.documentElement.getBoundingClientRect) { // IE  
  4.             var box = el.getBoundingClientRect();  
  5.             var rootNode = el.ownerDocument;  
  6.             return [box.left + getDocumentScrollLeft(rootNode), box.top +  
  7.                     getDocumentScrollTop(rootNode)];  
  8.         } else {  
  9.             var pos = [el.offsetLeft, el.offsetTop];  
  10.             var parentNode = el.offsetParent;  
  11.             // safari: subtract body offsets if el is abs (or any offsetParent), unless body is offsetParent  
  12.             var accountForBody = (isSafari &&  
  13.                     el.style['position'] == 'absolute' &&  
  14.                     el.offsetParent == el.ownerDocument.body);  
  15.             if (parentNode != el) {  
  16.                 while (parentNode) {  
  17.                     pos[0] += parentNode.offsetLeft;  
  18.                     pos[1] += parentNode.offsetTop;  
  19.                     if (!accountForBody && isSafari &&   
  20.                             parentNode.style['position'] == 'absolute' ) {   
  21.                         accountForBody = true;  
  22.                     }  
  23.                     parentNode = parentNode.offsetParent;  
  24.                 }  
  25.             }  
  26.             if (accountForBody) { //safari doubles in this case  
  27.                 pos[0] -= el.ownerDocument.body.offsetLeft;  
  28.                 pos[1] -= el.ownerDocument.body.offsetTop;  
  29.             }   
  30.             parentNode = el.parentNode;  
  31.             // account for any scrolled ancestors  
  32.             while ( parentNode.tagName && !/^body|html$/i.test(parentNode.tagName) )   
  33.             {  
  34.                // work around opera inline/table scrollLeft/Top bug  
  35.                if (parentNode.style['display'].search(/^inline|table-row.*$/i)) {   
  36.                     pos[0] -= parentNode.scrollLeft;  
  37.                     pos[1] -= parentNode.scrollTop;  
  38.                 }  
  39.                 parentNode = parentNode.parentNode;   
  40.             }  
  41.             return pos;  
  42.         }  
  43.     }  
  44.     getDocumentScrollLeft = function(doc) {  
  45.         doc = doc || document;  
  46.         return Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft);  
  47.     },   
  48.     getDocumentScrollTop = function(doc) {  
  49.         doc = doc || document;  
  50.         return Math.max(doc.documentElement.scrollTop, doc.body.scrollTop);  
  51.     }  

 下面是精简版:

Js代码 

  1. function getX(obj){  
  2.         return obj.offsetLeft + (obj.offsetParent ? getX(obj.offsetParent) : obj.x ? obj.x : 0);  
  3.     }          
  4.     function getY(obj){  
  5.         return (obj.offsetParent ? obj.offsetTop + getY(obj.offsetParent) : obj.y ? obj.y : 0);  
  6.     }  

 不过只支持IE和FF

继续阅读