jQuery.cssHooks
objectThe jQuery.cssHooks
object in jQuery is used to pre-process for normalizing CSS property naming before you setting and getting particular CSS value.
For example:
when we write css code,we have to define all properties for different browsers.
.testClass{ -webkit-transform: translateY(20px); -moz-transform: translateY(20px); -ms-transform: translateY(20px); -o-transform: translateY(20px); transform: translateY(20px); }
when we want to add them though jQuery.css()
method.
We have to do like this:
$.css({'-webkit-transform':'translateY(20px)','-moz-transform':'translateY(20px)','-ms-transform':'translateY(20px)','-o-transform':'translateY(20px)','transform':'translateY(20px)'})
A css hook can let .css()
method accept the standard property nametransform
,normalize theses vendor-prefixed CSS property naming.
$.css('transform':'translateY(20px)');
jQuery.cssHooks
Template(function( $ ) { // First, check to see if cssHooks are supported if ( !$.cssHooks ) { // If not, output an error message throw( new Error( "jQuery 1.4.3 or above is required for this plugin to work" ) ); } // Wrap in a document ready call, because jQuery writes // cssHooks at this time and will blow away your functions // if they exist. $(function () { $.cssHooks[ "someCSSProp" ] = { get: function( elem, computed, extra ) { // Handle getting the CSS property }, set: function( elem, value ) { // Handle setting the CSS value } }; }); })( jQuery );
jQuery.cssHooks
ExampleTo make it easier to understand, we will show you a special example:
lautturi
lautturi
property actually.$.cssHooks.lautturi = { set: function( elem, value) { elem.className = value; } }; ... ... $(function () { $( "#test" ).css( "lautturi", "classLautturi" ); });
$.cssHooks
to normalize a vendor-specific CSS property(function( $ ) { // First, check to see if cssHooks are supported if ( !$.cssHooks ) { // If not, output an error message throw( new Error( "jQuery 1.4.3+ is needed for this plugin to work" ) ); } function styleSupport( prop ) { var vendorProp, supportedProp, // Capitalize first character of the prop to test vendor prefix capProp = prop.charAt( 0 ).toUpperCase() + prop.slice( 1 ), prefixes = [ "Moz", "Webkit", "ms" , "o"], div = document.createElement( "div" ); if ( prop in div.style ) { // Browser supports standard CSS property name supportedProp = prop; } else { // Otherwise test support for vendor-prefixed property names for ( var i = 0; i < prefixes.length; i++ ) { vendorProp = prefixes[ i ] + capProp; if ( vendorProp in div.style ) { supportedProp = vendorProp; break; } } } div = null; $.support[ prop ] = supportedProp; return supportedProp; } $(function () { var transform = styleSupport( "transform" ); // Set cssHooks only for browsers that support a vendor-prefixed border radius if ( transform && transform !== "transform" ) { $.cssHooks.transform = { get: function( elem, computed, extra ) { return $.css( elem, transform ); }, set: function( elem, value) { elem.style[ transform ] = value; } }; } }); })( jQuery ); $(function () { $( "#test" ).css( "transform", "translateY(20px)" ); });
jQuery.cssHooks
Practical occasionInside jQuery, as you can see, it use cssHooks
to deal with box-sizing: border-box;
or box-sizing: content-box;
Refer to jQuery .css() method Notice
for more information.
// jQuery 3.4.1 line 6767 jQuery.each( [ "height", "width" ], function( i, dimension ) { jQuery.cssHooks[ dimension ] = { get: function( elem, computed, extra ) { if ( computed ) { // Certain elements can have dimension info if we invisibly show them // but it must have a current display style that would benefit return rdisplayswap.test( jQuery.css( elem, "display" ) ) && // Support: Safari 8+ // Table columns in Safari have non-zero offsetWidth & zero // getBoundingClientRect().width unless display is changed. // Support: IE <=11 only // Running getBoundingClientRect on a disconnected node // in IE throws an error. ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? swap( elem, cssShow, function() { return getWidthOrHeight( elem, dimension, extra ); } ) : getWidthOrHeight( elem, dimension, extra ); } }, set: function( elem, value, extra ) { var matches, styles = getStyles( elem ), // Only read styles.position if the test has a chance to fail // to avoid forcing a reflow. scrollboxSizeBuggy = !support.scrollboxSize() && styles.position === "absolute", // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) boxSizingNeeded = scrollboxSizeBuggy || extra, isBorderBox = boxSizingNeeded && jQuery.css( elem, "boxSizing", false, styles ) === "border-box", subtract = extra ? boxModelAdjustment( elem, dimension, extra, isBorderBox, styles ) : 0; // Account for unreliable border-box dimensions by comparing offset* to computed and // faking a content-box to get border and padding (gh-3699) if ( isBorderBox && scrollboxSizeBuggy ) { subtract -= Math.ceil( elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - parseFloat( styles[ dimension ] ) - boxModelAdjustment( elem, dimension, "border", false, styles ) - 0.5 ); } // Convert to pixels if value adjustment is needed if ( subtract && ( matches = rcssNum.exec( value ) ) && ( matches[ 3 ] || "px" ) !== "px" ) { elem.style[ dimension ] = value; value = jQuery.css( elem, dimension ); } return setPositiveNumber( elem, value, subtract ); } }; } );