Skip to content

Instantly share code, notes, and snippets.

@termi
Created November 7, 2012 12:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save termi/4031130 to your computer and use it in GitHub Desktop.
Save termi/4031130 to your computer and use it in GitHub Desktop.
offset[Left/Top]
var getScrollX
, getScrollX
, _document_documentElement = document.documentElement
;
document.compatMode === "CSS1Compat" ?
((_getScrollX = function(){return _document_documentElement.scrollLeft}), (_getScrollY = function(){return _document_documentElement.scrollTop}))
:
((_getScrollX = function(){return document.body.scrollTop}), (_getScrollY = function(){return document.body.scrollLeft}))
;
/**
* http://javascript.ru/ui/offset#popytka-2:-getboundingclientrect
* @param {Node} elem
* @param {boolean=} X_else_Y
* @return {number}
*/
function unsafeGetOffsetRect(elem, X_else_Y) {
if("element" in elem && "defaults" in elem && "document" in elem) {//IE < 8 with htc -> this instanceof DispHTCDefaultDispatch
elem = elem["element"];
}
var box = elem.getBoundingClientRect()//It might be an error here
, _body
, _documentElement
, _doc
;
if((_doc = elem.ownerDocument) !== document) {
_body = _doc && _doc.body;
_documentElement = _doc && _doc.documentElement;
if(!_body || !_documentElement) {
return X_else_Y ? box.left : box.top;
}
}
else {
_body = document.body;
_documentElement = _document_documentElement;
}
return X_else_Y ?
(box.left + _getScrollX() - (_documentElement.clientLeft || _body.clientLeft || 0))
:
(box.top + _getScrollY() - (_documentElement.clientTop || _body.clientTop || 0))
;
}
/**
* http://javascript.ru/ui/offset#popytka-1-summiruem-offset-y
* @param {Node} elem
* @param {boolean=} X_else_Y
* @return {number}
*/
function getOffsetSum(elem, X_else_Y) {
var result = 0,
prop = X_else_Y ? "offsetLeft" : "offsetTop";
while(elem) {
result = result + parseInt(elem[prop], 10);
elem = elem.offsetParent;
}
return result;
}
/**
* @param {Node} elem
* @param {boolean=} X_else_Y
* @return {number}
*/
function safeGetOffsetRect(elem, X_else_Y) {
var result;
try {
result = unsafeGetOffsetRect(elem, X_else_Y);
}
catch(e) {
result = getOffsetSum(elem, X_else_Y);
}
return result;
//Broken impimintation up here
//Here right impl from jQuery
//TODO::
/*
jQuery.fn.extend({
position: function() {
if ( !this[0] ) {
return null;
}
var elem = this[0],
// Get *real* offsetParent
offsetParent = this.offsetParent(),
// Get correct offsets
offset = this.offset(),
parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
// Subtract element margins
// note: when an element has margin: auto the offsetLeft and marginLeft
// are the same in Safari causing offset.left to incorrectly be 0
offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
// Add offsetParent borders
parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
// Subtract the two offsets
return {
top: offset.top - parentOffset.top,
left: offset.left - parentOffset.left
};
},
offsetParent: function() {
return this.map(function() {
var offsetParent = this.offsetParent || document.body;
while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
offsetParent = offsetParent.offsetParent;
}
return offsetParent;
});
}
});
*/
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment