Side navigation
Ticket #3082: dimension_patch.js
File dimension_patch.js, 3.3 KB (added by mike.helgeson, February 13, 2009 09:01PM UTC)
updated for 1.3.x
/*
http://groups.google.com/group/jquery-dev/browse_thread/thread/87c362bf775acebe/
http://groups.google.com/group/jquery-dev/browse_thread/thread/a4becc9a5cc34fea/
http://dev.helgeson.info/dimension/
http://dev.jquery.com/ticket/3082
*/
(function( $ ){
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$.css = function( elem, name, force ) {
// name == ( height or width )
return $.size.lookup[ name ] ?
// get elem height/width
$.size( elem, $.size.lookup[ name ] ) :
// get any other elem property
$.curCSS( elem, name, force );
};
$.size = function( $elems, Prop, arg ){
// jquery collection or a single node ?
var elem = $elems[0] || $elems,
// shorthand local variables
docEl = document.documentElement, body = document.body;
// NO ELEMENTS
if ( !elem ) return null;
// GET WINDOW SIZE
if ( elem == window )
// Use document.documentElement or document.body depending on Quirks vs Standards mode
return document.compatMode == "CSS1Compat" && docEl[ "client" + Prop ] || body[ "client" + Prop ];
// GET DOCUMENT SIZE
if ( elem == document )
// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
return Math.max( docEl[ "client" + Prop ],
body[ "scroll" + Prop ], docEl[ "scroll" + Prop ],
body[ "offset" + Prop ], docEl[ "offset" + Prop ]
);
// GET SIZE OF A SINGLE ELEMENT
if ( arg==undefined||arg=='padding'||arg=='border'||arg=='margin' ){
// hold the calculated size value
var val,
// get numeric attr value of the local elem
getAttr = function( attr ){
return parseFloat( $.curCSS( elem, attr, true) ) || 0;
},
// calculate the size value
getSize = function(){
// size <-thru-> border
val = elem[ 'offset' + Prop ];
// +/- additional properties
if ( arg != 'border' )
$.each( Prop=='Width' ? ["Left","Right"] : ["Top","Bottom"], function(i,Dir){
// plus margin
if ( arg == 'margin' ) val += getAttr( arg+Dir );
// minus borderWidth, arg == ( undefined or padding )
else val -= getAttr( "border"+Dir+"Width" );
// minus padding
if ( arg == undefined ) val -= getAttr( "padding"+Dir );
});
};
// elem has layout, calculate value
if ( $.curCSS( elem, "display" )!='none' ) getSize();
// swap element layout, then calculate value
else $.swap( elem, {
position: "absolute", visibility: "hidden", display: "block"
}, getSize );
// adjust the size value
return Math.max( 0, Math.round( val ) );
}
// SET SIZE ON JQUERY COLLECTION OF ELEMENTS
// Set the width or height on each element (default to pixels if value is unitless)
return $elems.css( Prop.toLowerCase(), typeof(arg)=="string" ? arg : arg + "px" );
};
// height/width macro, also store obj for lookup in css fn
$.size.lookup = $.each({
'height': 'Height', 'width': 'Width'
}, function( prop, Prop ){
// height & width
$.fn[ prop ] = function( arg ){
return $.size( this, Prop, arg );
};
// innerHeight & innerWidth
$.fn[ 'inner' + Prop ] = function(){
return this[ prop ]( 'padding' );
};
// outerHeight & outerWidth
$.fn[ 'outer' + Prop ] = function( margin ){
return this[ prop ]( margin ? 'margin' : 'border' );
};
});
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
})( jQuery );
Download in other formats:
Original Format
File dimension_patch.js, 3.3 KB (added by mike.helgeson, February 13, 2009 09:01PM UTC)
updated for 1.3.x
/*
http://groups.google.com/group/jquery-dev/browse_thread/thread/87c362bf775acebe/
http://groups.google.com/group/jquery-dev/browse_thread/thread/a4becc9a5cc34fea/
http://dev.helgeson.info/dimension/
http://dev.jquery.com/ticket/3082
*/
(function( $ ){
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$.css = function( elem, name, force ) {
// name == ( height or width )
return $.size.lookup[ name ] ?
// get elem height/width
$.size( elem, $.size.lookup[ name ] ) :
// get any other elem property
$.curCSS( elem, name, force );
};
$.size = function( $elems, Prop, arg ){
// jquery collection or a single node ?
var elem = $elems[0] || $elems,
// shorthand local variables
docEl = document.documentElement, body = document.body;
// NO ELEMENTS
if ( !elem ) return null;
// GET WINDOW SIZE
if ( elem == window )
// Use document.documentElement or document.body depending on Quirks vs Standards mode
return document.compatMode == "CSS1Compat" && docEl[ "client" + Prop ] || body[ "client" + Prop ];
// GET DOCUMENT SIZE
if ( elem == document )
// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
return Math.max( docEl[ "client" + Prop ],
body[ "scroll" + Prop ], docEl[ "scroll" + Prop ],
body[ "offset" + Prop ], docEl[ "offset" + Prop ]
);
// GET SIZE OF A SINGLE ELEMENT
if ( arg==undefined||arg=='padding'||arg=='border'||arg=='margin' ){
// hold the calculated size value
var val,
// get numeric attr value of the local elem
getAttr = function( attr ){
return parseFloat( $.curCSS( elem, attr, true) ) || 0;
},
// calculate the size value
getSize = function(){
// size <-thru-> border
val = elem[ 'offset' + Prop ];
// +/- additional properties
if ( arg != 'border' )
$.each( Prop=='Width' ? ["Left","Right"] : ["Top","Bottom"], function(i,Dir){
// plus margin
if ( arg == 'margin' ) val += getAttr( arg+Dir );
// minus borderWidth, arg == ( undefined or padding )
else val -= getAttr( "border"+Dir+"Width" );
// minus padding
if ( arg == undefined ) val -= getAttr( "padding"+Dir );
});
};
// elem has layout, calculate value
if ( $.curCSS( elem, "display" )!='none' ) getSize();
// swap element layout, then calculate value
else $.swap( elem, {
position: "absolute", visibility: "hidden", display: "block"
}, getSize );
// adjust the size value
return Math.max( 0, Math.round( val ) );
}
// SET SIZE ON JQUERY COLLECTION OF ELEMENTS
// Set the width or height on each element (default to pixels if value is unitless)
return $elems.css( Prop.toLowerCase(), typeof(arg)=="string" ? arg : arg + "px" );
};
// height/width macro, also store obj for lookup in css fn
$.size.lookup = $.each({
'height': 'Height', 'width': 'Width'
}, function( prop, Prop ){
// height & width
$.fn[ prop ] = function( arg ){
return $.size( this, Prop, arg );
};
// innerHeight & innerWidth
$.fn[ 'inner' + Prop ] = function(){
return this[ prop ]( 'padding' );
};
// outerHeight & outerWidth
$.fn[ 'outer' + Prop ] = function( margin ){
return this[ prop ]( margin ? 'margin' : 'border' );
};
});
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
})( jQuery );