Skip to content
Permalink
Browse files

2.0: Reduce offset module. Close gh-1139.

  • Loading branch information...
markelog authored and dmethvin committed Jan 15, 2013
1 parent 19def21 commit cbe0c2ef90669c4c145227a2ddf41993583f5437
Showing with 30 additions and 32 deletions.
  1. +30 −32 src/offset.js
@@ -8,8 +8,8 @@ jQuery.fn.offset = function( options ) {
}

var docElem, win,
box = { top: 0, left: 0 },
elem = this[ 0 ],
box = { top: 0, left: 0 },
doc = elem && elem.ownerDocument;

if ( !doc ) {
@@ -30,33 +30,35 @@ jQuery.fn.offset = function( options ) {
}
win = getWindow( doc );
return {
top: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ),
left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
top: box.top + win.pageYOffset - docElem.clientTop,
left: box.left + win.pageXOffset - docElem.clientLeft
};
};

jQuery.offset = {

setOffset: function( elem, options, i ) {
var position = jQuery.css( elem, "position" );
var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
position = jQuery.css( elem, "position" ),
curElem = jQuery( elem ),
props = {};

// set position first, in-case top/left are set even on static elem
// Set position first, in-case top/left are set even on static elem
if ( position === "static" ) {
elem.style.position = "relative";
}

var curElem = jQuery( elem ),
curOffset = curElem.offset(),
curCSSTop = jQuery.css( elem, "top" ),
curCSSLeft = jQuery.css( elem, "left" ),
calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
props = {}, curPosition = {}, curTop, curLeft;
curOffset = curElem.offset();
curCSSTop = jQuery.css( elem, "top" );
curCSSLeft = jQuery.css( elem, "left" );
calculatePosition = ( position === "absolute" || position === "fixed" ) && ( curCSSTop + curCSSLeft ).indexOf("auto") > -1;

// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
// Need to be able to calculate position if either top or left is auto and position is either absolute or fixed
if ( calculatePosition ) {
curPosition = curElem.position();
curTop = curPosition.top;
curLeft = curPosition.left;

} else {
curTop = parseFloat( curCSSTop ) || 0;
curLeft = parseFloat( curCSSLeft ) || 0;
@@ -75,6 +77,7 @@ jQuery.offset = {

if ( "using" in options ) {
options.using.call( elem, props );

} else {
curElem.css( props );
}
@@ -90,13 +93,14 @@ jQuery.fn.extend({
}

var offsetParent, offset,
parentOffset = { top: 0, left: 0 },
elem = this[ 0 ];
elem = this[ 0 ],
parentOffset = { top: 0, left: 0 };

// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
// Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
if ( jQuery.css( elem, "position" ) === "fixed" ) {
// we assume that getBoundingClientRect is available when computed position is fixed
// We assume that getBoundingClientRect is available when computed position is fixed
offset = elem.getBoundingClientRect();

} else {
// Get *real* offsetParent
offsetParent = this.offsetParent();
@@ -108,25 +112,25 @@ jQuery.fn.extend({
}

// Add offsetParent borders
parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
}

// Subtract parent offsets and 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
return {
top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
};
},

offsetParent: function() {
return this.map(function() {
var offsetParent = this.offsetParent || document.documentElement;

while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
offsetParent = offsetParent.offsetParent;
}

return offsetParent || document.documentElement;
});
}
@@ -135,22 +139,20 @@ jQuery.fn.extend({

// Create scrollLeft and scrollTop methods
jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
var top = /Y/.test( prop );
var top = "pageYOffset" === prop;

jQuery.fn[ method ] = function( val ) {
return jQuery.access( this, function( elem, method, val ) {
var win = getWindow( elem );

if ( val === undefined ) {
return win ? (prop in win) ? win[ prop ] :
win.document.documentElement[ method ] :
elem[ method ];
return win ? win[ prop ] : elem[ method ];
}

if ( win ) {
win.scrollTo(
!top ? val : jQuery( win ).scrollLeft(),
top ? val : jQuery( win ).scrollTop()
!top ? val : window.pageXOffset,
top ? val : window.pageYOffset
);

} else {
@@ -161,9 +163,5 @@ jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( me
});

function getWindow( elem ) {
return jQuery.isWindow( elem ) ?
elem :
elem.nodeType === 9 ?
elem.defaultView || elem.parentWindow :
false;
return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
}

0 comments on commit cbe0c2e

Please sign in to comment.
You can’t perform that action at this time.