aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Gibson <richard.gibson@gmail.com>2012-05-24 21:52:35 -0400
committerDave Methvin <dave.methvin@gmail.com>2012-05-24 21:54:04 -0400
commitbc7231e3230b8f2c59b3370e7cae6b8a30d53c1e (patch)
tree560968befb66dad801249db5f27128e7a1cadf1c
parentd5e5ce5bd006ae94e9d85949b4f7141642cebf81 (diff)
downloadjquery-bc7231e3230b8f2c59b3370e7cae6b8a30d53c1e.tar.gz
jquery-bc7231e3230b8f2c59b3370e7cae6b8a30d53c1e.zip
Apply a GibsonTransform(-55) to the #10877 fix. Closes gh-788.
-rw-r--r--src/css.js107
-rw-r--r--src/dimensions.js106
2 files changed, 103 insertions, 110 deletions
diff --git a/src/css.js b/src/css.js
index 9154dab76..214b4a77b 100644
--- a/src/css.js
+++ b/src/css.js
@@ -112,7 +112,7 @@ jQuery.extend({
// convert relative number strings (+= or -=) to relative numbers. #7345
if ( type === "string" && (ret = rrelNum.exec( value )) ) {
- value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
+ value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
// Fixes bug #9237
type = "number";
}
@@ -147,8 +147,8 @@ jQuery.extend({
}
},
- css: function( elem, name, extra ) {
- var ret, hooks,
+ css: function( elem, name, numeric, extra ) {
+ var val, num, hooks,
origName = jQuery.camelCase( name );
// Make sure that we're working with the right name
@@ -164,13 +164,21 @@ jQuery.extend({
}
// If a hook was provided get the computed value from there
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
- return ret;
+ if ( hooks && "get" in hooks ) {
+ val = hooks.get( elem, true, extra );
+ }
// Otherwise, if a way to get the computed value exists, use that
- } else {
- return curCSS( elem, name );
+ if ( val === undefined ) {
+ val = curCSS( elem, name );
}
+
+ // Return, converting to number if forced or a qualifier was provided and val looks numeric
+ if ( numeric || extra ) {
+ num = parseFloat( val );
+ return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
+ }
+ return val;
},
// A method for quickly swapping in/out CSS properties to get correct calculations
@@ -272,43 +280,45 @@ if ( document.defaultView && document.defaultView.getComputedStyle ) {
function setPositiveNumber( elem, value, subtract ) {
var matches = rnumsplit.exec( value );
return matches ?
- Math.max( 0, +matches[ 1 ] - ( subtract || 0 ) ) + ( matches [ 2 ] || "px" )
- : value;
+ Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+ value;
}
-function augmentWidthOrHeight( name, elem, extra, isBorderBox ) {
- var val = 0,
- i = name === "width" ? 1 : 0;
-
- // if the measurement we need is already represented by the measurement
- // there's no need to augment further
- if ( extra !== (isBorderBox ? "border" : "content") ) {
- for ( ; i < 4; i += 2 ) {
- // both box models exclude margin, so add it if we want it
- if ( extra === "margin" ) {
- // we use jQuery.css instead of curCSS here
- // because of the reliableMarginRight CSS hook!
- val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0;
- }
+function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
+ var i = extra === ( isBorderBox ? "border" : "content" ) ?
+ // If we already have the right measurement, avoid augmentation
+ 4 :
+ // Otherwise initialize for horizontal or vertical properties
+ name === "width" ? 1 : 0,
+
+ val = 0;
+
+ for ( ; i < 4; i += 2 ) {
+ // both box models exclude margin, so add it if we want it
+ if ( extra === "margin" ) {
+ // we use jQuery.css instead of curCSS here
+ // because of the reliableMarginRight CSS hook!
+ val += jQuery.css( elem, extra + cssExpand[ i ], true );
+ }
- if ( isBorderBox ) {
- // border-box includes padding, so remove it if we want content
- if ( extra === "content" ) {
- val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
- }
+ // From this point on we use curCSS for maximum performance (relevant in animations)
+ if ( isBorderBox ) {
+ // border-box includes padding, so remove it if we want content
+ if ( extra === "content" ) {
+ val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+ }
- // at this point, extra isnt border nor margin, so remove border
- if ( extra !== "margin" ) {
- val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
- }
- } else {
- // at this point, extra isnt content, so add padding
- val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+ // at this point, extra isnt border nor margin, so remove border
+ if ( extra !== "margin" ) {
+ val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+ }
+ } else {
+ // at this point, extra isnt content, so add padding
+ val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
- // at this point, extra isnt content nor padding, so add border
- if ( extra !== "padding" ) {
- val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
- }
+ // at this point, extra isnt content nor padding, so add border
+ if ( extra !== "padding" ) {
+ val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
}
}
}
@@ -343,14 +353,15 @@ function getWidthOrHeight( elem, name, extra ) {
val = parseFloat( val ) || 0;
}
- // determine which box-sizing width we're supposed to be getting
- if ( !extra ) {
- extra = isBorderBox ? "border" : "content";
- }
-
- val += augmentWidthOrHeight( name, elem, extra, valueIsBorderBox );
-
- return val + "px";
+ // use the active box-sizing model to add/subtract irrelevant styles
+ return ( val +
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra || ( isBorderBox ? "border" : "content" ),
+ valueIsBorderBox
+ )
+ ) + "px";
}
jQuery.each([ "height", "width" ], function( i, name ) {
@@ -370,8 +381,8 @@ jQuery.each([ "height", "width" ], function( i, name ) {
set: function( elem, value, extra ) {
return setPositiveNumber( elem, value, extra ?
augmentWidthOrHeight(
- name,
elem,
+ name,
extra,
jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
) : 0
diff --git a/src/dimensions.js b/src/dimensions.js
index 79d7c22bc..bbfc62ad8 100644
--- a/src/dimensions.js
+++ b/src/dimensions.js
@@ -1,72 +1,54 @@
(function( jQuery ) {
-// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- var clientProp = "client" + name,
- scrollProp = "scroll" + name,
- offsetProp = "offset" + name;
-
- // height, width, innerHeight and innerWidth
- jQuery.each( { padding: "inner" + name, content: type }, function( extra, funcName ) {
- jQuery.fn[ funcName ] = function( value ) {
- var args = [ type, extra ];
- if ( arguments.length ) {
- args.push( value );
- }
- return getDimension.apply( this, args );
- };
- });
-
- // outerHeight and outerWidth
- jQuery.fn[ "outer" + name ] = function( margin, value ) {
- var args = [ type, ( margin === true || value === true ) ? "margin" : "border" ];
- if ( arguments.length && typeof margin !== "boolean" ) {
- args.push( margin );
- }
- return getDimension.apply( this, args );
- };
-
- function getDimension( type, extra, value ) {
- return jQuery.access( this, function( elem, type, value ) {
- var doc, orig, ret;
-
- if ( jQuery.isWindow( elem ) ) {
- // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
- // isn't a whole lot we can do. See pull request at this URL for discussion:
- // https://github.com/jquery/jquery/pull/764
- return elem.document.documentElement[ clientProp ];
- }
-
- // Get document width or height
- if ( elem.nodeType === 9 ) {
- // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
- doc = elem.documentElement;
-
- // when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height]
- // so we can't use max, as it'll choose the incorrect offset[Width/Height]
- // instead we use the correct client[Width/Height]
- // support:IE6
- if ( doc[ clientProp ] >= doc[ scrollProp ] ) {
- return doc[ clientProp ];
+ jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+ // margin is only for outerHeight, outerWidth
+ jQuery.fn[ funcName ] = function( margin, value ) {
+ var clientProp = "client" + name,
+ scrollProp = "scroll" + name,
+ offsetProp = "offset" + name,
+ chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+ extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+ return jQuery.access( this, function( elem, type, value ) {
+ var doc;
+
+ if ( jQuery.isWindow( elem ) ) {
+ // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+ // isn't a whole lot we can do. See pull request at this URL for discussion:
+ // https://github.com/jquery/jquery/pull/764
+ return elem.document.documentElement[ clientProp ];
}
- return Math.max(
- elem.body[ scrollProp ], doc[ scrollProp ],
- elem.body[ offsetProp ], doc[ offsetProp ]
- );
- }
+ // Get document width or height
+ if ( elem.nodeType === 9 ) {
+ // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+ doc = elem.documentElement;
+
+ // when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height]
+ // so we can't use max, as it'll choose the incorrect offset[Width/Height]
+ // instead we use the correct client[Width/Height]
+ // support:IE6
+ if ( doc[ clientProp ] >= doc[ scrollProp ] ) {
+ return doc[ clientProp ];
+ }
+
+ return Math.max(
+ elem.body[ scrollProp ], doc[ scrollProp ],
+ elem.body[ offsetProp ], doc[ offsetProp ]
+ );
+ }
- // Get width or height on the element
- if ( value === undefined ) {
- orig = jQuery.css( elem, type, extra );
- ret = parseFloat( orig );
- return jQuery.isNumeric( ret ) ? ret : orig;
- }
+ return value === undefined ?
+ // Get width or height on the element, requesting but not forcing parseFloat
+ jQuery.css( elem, type, value, extra ) :
- // Set the width or height on the element
- jQuery.style( elem, type, value, extra );
- }, type, value, arguments.length > 2, null );
- }
+ // Set width or height on the element
+ jQuery.style( elem, type, value, extra );
+ }, type, chainable ? margin : undefined, chainable );
+ };
+ });
});
})( jQuery );