diff options
author | Brandon Aaron <brandon.aaron@gmail.com> | 2009-03-22 23:25:03 +0000 |
---|---|---|
committer | Brandon Aaron <brandon.aaron@gmail.com> | 2009-03-22 23:25:03 +0000 |
commit | d7d908b05a442745c1a90728805b74db0a7921cf (patch) | |
tree | 8e6931ca3d45af940efd6e3fa506ed1f819cb84e /src/css.js | |
parent | 9476530fa1e39ce1324e98f4dbb79576895372e5 (diff) | |
download | jquery-d7d908b05a442745c1a90728805b74db0a7921cf.tar.gz jquery-d7d908b05a442745c1a90728805b74db0a7921cf.zip |
decoupling styles retrieval from the attr method
Diffstat (limited to 'src/css.js')
-rw-r--r-- | src/css.js | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/src/css.js b/src/css.js new file mode 100644 index 000000000..9551bc949 --- /dev/null +++ b/src/css.js @@ -0,0 +1,205 @@ +// exclude the following css properties to add px +var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, + // cache defaultView + defaultView = document.defaultView || {}, + // normalize float css property + styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat"; + +jQuery.fn.css = function( name, value ) { + var options = name, isFunction = jQuery.isFunction( value ); + + // ignore negative width and height values + if ( (name == 'width' || name == 'height') && parseFloat(value) < 0 ) + value = undefined; + + if ( typeof name === "string" ) { + // Are we setting the style? + if ( value === undefined ) { + return this.length ? + jQuery.css( this[0], name ) : + null; + + // Convert name, value params to options hash format + } else { + options = {}; + options[ name ] = value; + } + } + + // For each element... + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + // Set all the styles + for ( var prop in options ) { + value = options[prop]; + + if ( isFunction ) { + value = value.call( elem, i ); + } + + if ( typeof value === "number" && !exclude.test(prop) ) { + value = value + "px"; + } + + jQuery.style( elem, prop, value ); + } + } + + return this; +}; + +jQuery.extend({ + style: function( elem, name, value ) { + // don't set styles on text and comment nodes + if (!elem || elem.nodeType == 3 || elem.nodeType == 8) + return undefined; + + var style = elem.style || elem, set = value !== undefined; + + // IE uses filters for opacity + if ( !jQuery.support.opacity && name == "opacity" ) { + if ( set ) { + // IE has trouble with opacity if it does not have layout + // Force it by setting the zoom level + style.zoom = 1; + + // Set the alpha filter to set the opacity + style.filter = (style.filter || "").replace( /alpha\([^)]*\)/, "" ) + + (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")"); + } + + return style.filter && style.filter.indexOf("opacity=") >= 0 ? + (parseFloat( style.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '': + ""; + } + + // Make sure we're using the right name for getting the float value + if ( /float/i.test( name ) ) + name = styleFloat; + + name = name.replace(/-([a-z])/ig, function(all, letter){ + return letter.toUpperCase(); + }); + + if ( set ) + style[ name ] = value; + + return style[ name ]; + }, + + css: function( elem, name, force, extra ) { + if ( name == "width" || name == "height" ) { + var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; + + function getWH() { + val = name == "width" ? elem.offsetWidth : elem.offsetHeight; + + if ( extra === "border" ) + return; + + jQuery.each( which, function() { + if ( !extra ) + val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; + if ( extra === "margin" ) + val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0; + else + val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; + }); + } + + if ( elem.offsetWidth !== 0 ) + getWH(); + else + jQuery.swap( elem, props, getWH ); + + return Math.max(0, Math.round(val)); + } + + return jQuery.curCSS( elem, name, force ); + }, + + curCSS: function( elem, name, force ) { + var ret, style = elem.style; + + // IE uses filters for opacity + if ( !jQuery.support.opacity && name == "opacity" ) { + ret = style.filter && style.filter.indexOf("opacity=") >= 0 ? + (parseFloat( style.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '': + ""; + + return ret === "" ? + "1" : + ret; + } + + // Make sure we're using the right name for getting the float value + if ( /float/i.test( name ) ) + name = styleFloat; + + if ( !force && style && style[ name ] ) { + ret = style[ name ]; + + } else if ( defaultView.getComputedStyle ) { + + // Only "float" is needed here + if ( /float/i.test( name ) ) + name = "float"; + + name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); + + var computedStyle = defaultView.getComputedStyle( elem, null ); + + if ( computedStyle ) + ret = computedStyle.getPropertyValue( name ); + + // We should always get a number back from opacity + if ( name == "opacity" && ret == "" ) + ret = "1"; + + } else if ( elem.currentStyle ) { + var camelCase = name.replace(/\-(\w)/g, function(all, letter){ + return letter.toUpperCase(); + }); + + ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { + // Remember the original values + var left = style.left, rsLeft = elem.runtimeStyle.left; + + // Put in the new values to get a computed value out + elem.runtimeStyle.left = elem.currentStyle.left; + style.left = ret || 0; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + elem.runtimeStyle.left = rsLeft; + } + } + + return ret; + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var old = {}; + // Remember the old values, and insert the new ones + for ( var name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + callback.call( elem ); + + // Revert the old values + for ( var name in options ) + elem.style[ name ] = old[ name ]; + } +});
\ No newline at end of file |