diff options
author | Mike Sherov <mike.sherov@gmail.com> | 2012-04-06 08:39:59 -0400 |
---|---|---|
committer | Dave Methvin <dave.methvin@gmail.com> | 2012-04-06 08:39:59 -0400 |
commit | 5376a809c0d2bee4b7872847c2821e458dfdcc3b (patch) | |
tree | 68d946672ff75b80d88c70dea711e4a805e7036b /src | |
parent | 77536f5cb2ab042ac8be40ba59f36d8f3bd7e4d1 (diff) | |
download | jquery-5376a809c0d2bee4b7872847c2821e458dfdcc3b.tar.gz jquery-5376a809c0d2bee4b7872847c2821e458dfdcc3b.zip |
Fix #10413, #10679. Fix box-sizing:border-box and add css vendor prefix support.
Diffstat (limited to 'src')
-rw-r--r-- | src/css.js | 109 | ||||
-rw-r--r-- | src/support.js | 4 |
2 files changed, 76 insertions, 37 deletions
diff --git a/src/css.js b/src/css.js index c1775b7ab..afbf96afb 100644 --- a/src/css.js +++ b/src/css.js @@ -13,12 +13,35 @@ var ralpha = /alpha\([^)]*\)/i, // order is important! cssExpand = [ "Top", "Right", "Bottom", "Left" ], + cssPrefixes = [ "O", "Webkit", "Moz", "ms" ], curCSS, - getComputedStyle, currentStyle; +// return a css property mapped to a potentially vendor prefixed property +function vendorPropName( style, name ) { + + // shortcut for names that are not vendor prefixed + if ( name in style ) { + return name; + } + + // check for vendor prefixed names + var capName = name.charAt(0).toUpperCase() + name.slice(1), + origName = name, + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in style ) { + return name; + } + } + + return origName; +} + jQuery.fn.css = function( name, value ) { return jQuery.access( this, function( elem, name, value ) { return value !== undefined ? @@ -72,10 +95,15 @@ jQuery.extend({ } // Make sure that we're working with the right name - var ret, type, origName = jQuery.camelCase( name ), - style = elem.style, hooks = jQuery.cssHooks[ origName ]; + var ret, type, hooks, + origName = jQuery.camelCase( name ), + style = elem.style; - name = jQuery.cssProps[ origName ] || origName; + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); + + // gets hook for the prefixed version + // followed by the unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; // Check if we're setting a value if ( value !== undefined ) { @@ -119,12 +147,15 @@ jQuery.extend({ }, css: function( elem, name, extra ) { - var ret, hooks; + var ret, hooks, + origName = jQuery.camelCase( name ); // Make sure that we're working with the right name - name = jQuery.camelCase( name ); - hooks = jQuery.cssHooks[ name ]; - name = jQuery.cssProps[ name ] || name; + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); + + // gets hook for the prefixed version + // followed by the unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; // cssFloat needs a special treatment if ( name === "cssFloat" ) { @@ -244,9 +275,29 @@ function getWidthOrHeight( elem, name, extra ) { // Start with offset property var val = name === "width" ? elem.offsetWidth : elem.offsetHeight, i = name === "width" ? 1 : 0, - len = 4; + len = 4, + usedOffset = true; + + if ( val <= 0 ) { + usedOffset = false; + + // Fall back to computed then uncomputed css if necessary + val = curCSS( elem, name ); + if ( val < 0 || val == null ) { + val = elem.style[ name ]; + } + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test(val) ) { + return val; + } + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + } - if ( val > 0 ) { + //if we're using border-box, the css width/height value behaves like the offsetWidth/Height property! + if ( usedOffset || ( jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box" ) ) { if ( extra !== "border" ) { for ( ; i < len; i += 2 ) { if ( !extra ) { @@ -259,33 +310,17 @@ function getWidthOrHeight( elem, name, extra ) { } } } - - return val + "px"; - } - - // Fall back to computed then uncomputed css if necessary - val = curCSS( elem, name ); - if ( val < 0 || val == null ) { - val = elem.style[ name ]; - } - - // Computed unit is not pixels. Stop here and return. - if ( rnumnonpx.test(val) ) { - return val; - } - - // Normalize "", auto, and prepare for extra - val = parseFloat( val ) || 0; - - // Add padding, border, margin - if ( extra ) { - for ( ; i < len; i += 2 ) { - val += parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0; - if ( extra !== "padding" ) { - val += parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0; - } - if ( extra === "margin" ) { - val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ]) ) || 0; + } else { + // Add padding, border, margin + if ( extra ) { + for ( ; i < len; i += 2 ) { + val += parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0; + if ( extra !== "padding" ) { + val += parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0; + } + if ( extra === "margin" ) { + val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0; + } } } } diff --git a/src/support.js b/src/support.js index 5a0d1b731..ccf9d4315 100644 --- a/src/support.js +++ b/src/support.js @@ -180,6 +180,7 @@ jQuery.support = (function() { jQuery(function() { var container, offsetSupport, marginDiv, conMarginTop = 1, + boxSizingPrefixes = [ "", "-moz-", "-webkit-", "" ], body = document.getElementsByTagName("body")[0]; if ( !body ) { @@ -250,6 +251,9 @@ jQuery.support = (function() { support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); } + div.style.cssText = boxSizingPrefixes.join("box-sizing:border-box;") + "width:4px;padding:1px;border:1px;display:block"; + support.boxSizing = ( div.offsetWidth === 4 ); + offsetSupport = { doesNotIncludeMarginInBodyOffset: ( body.offsetTop !== conMarginTop ) }; |