var getXY = function() {
// IE인지 확인
if (document.documentElement.getBoundingClientRect) {
// 참고 1
return function(el) {
var box = el.getBoundingClientRect();
var rootNode = el.ownerDocument; 🎜> Y.Dom.getDocumentScrollTop(rootNode)];
parentNode = el.offsetParent ; > // 결정 Safari에서 노드가 절대인지 여부,
// 상위 요소가 body인지 여부
// 참고 2.
var accountforBody = > Y.Dom.getStyle(el, 'position') == 'absolute ' &&
el.offsetParent == el.ownerDocument.body);
// 부모 요소 자체가 아닌 경우
if (parentNode != el) {
~ .offsettop; 🎜> y.DOM.GetStyle (Parentnode, 'Position')
== 'Absolute') {
AccountForbody = True;
}
Parentnod e = Parentnode.OffsetParent
}
}
// 还是针对 Safari의
if (accountForBody) { //safari 가 이 경우 두 배가 됩니다.
pos[0] -= el. ownerDocument.body.offsetLeft;
pos[1] -= el.ownerDocument.body.offsetTop;
}
parentNode = el.parentNode;
// 스크롤된 상위 항목에 대한 계정
( parentNode.tagName &&
!patterns.ROOT_TAG.test(parentNode.tagName ) )
{
// 오페라 인라인 해결 /table scrollLeft/Top 버그
// 注3.
if (Y.Dom.getStyle(parentNode, 'display')
.search(/^inline|table-row.*$/i)) { pos[0] -= parentNode.scrollLeft ;
pos[1] -= parentNode.scrollTop;
}
parentNode = parentNode.parentNode;
}
반품 pos;
};
}
}() // 참고: 로드 시간 분기를 위해 실행 중입니다. 많은 IE의 getBoundingClientRect 방법이 있습니다.
注. Safari의 BUG, 详细情况参见这里。
注. 参见老外的原话(出处):
"- 상위 항목이 인라인 또는 테이블이 아닌 한 상위 스크롤을 제거하세요.
Opera 인라인/테이블 스크롤왼쪽/상단 버그를 해결하려면"
Opera 9.5에서 수정되었습니다. (또한 Opera 9.5는 getBoundingClientRect
및 getClientRects를 지원합니다.) 더 많은 DOM 적兼容性,可以参看 PPK 적总结(怎么又是他)。