jQuery.cssHooks


jQuery.cssHooks返回: Object

描述: 直接挂钩到 jQuery 以覆盖特定 CSS 属性的检索或设置方式,规范 CSS 属性命名,或创建自定义属性。

  • 添加版本: 1.4.3jQuery.cssHooks

$.cssHooks 对象提供了一种为获取和设置特定 CSS 值定义函数的方法。它还可以用于创建新的 cssHooks,以规范化 CSS3 功能,如 box shadows 和 gradients。

例如,某些版本的基于 Webkit 的浏览器需要 -webkit-border-radius 来设置元素的 border-radius,而早期版本的 Firefox 需要 -moz-border-radius。css hook 可以规范化这些带厂商前缀的属性,使 .css() 接受一个单一的标准属性名 (border-radius,或者使用 DOM 属性语法 borderRadius)。

除了对特定样式属性的处理方式进行细粒度控制外,$.cssHooks 还扩展了 .animate() 方法可用的属性集。

定义一个新的 css hook 非常直接。下面的骨架模板可以作为创建自己的 css hook 的指南。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(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 );

功能测试

在规范化特定厂商的 CSS 属性之前,首先确定浏览器是否支持标准属性或带厂商前缀的变体。例如,要检查对 border-radius 属性的支持,请查看任何变体是否是临时元素的 style 对象的一个成员。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
(function( $ ) {
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" ],
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;
}
}
}
// Avoid memory leak in IE
div = null;
// Add property to $.support so it can be accessed elsewhere
$.support[ prop ] = supportedProp;
return supportedProp;
}
// Call the function, e.g. testing for "border-radius" support:
styleSupport( "borderRadius" );
})( jQuery );

定义一个完整的 css hook

要定义一个完整的 css hook,请将支持性测试与第一个示例中提供的骨架模板的填充版本结合起来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
(function( $ ) {
if ( !$.cssHooks ) {
throw( new Error( "jQuery 1.4.3+ is needed for this plugin to work" ) );
}
function styleSupport( prop ) {
var vendorProp, supportedProp,
capProp = prop.charAt( 0 ).toUpperCase() + prop.slice( 1 ),
prefixes = [ "Moz", "Webkit", "ms" ],
div = document.createElement( "div" );
if ( prop in div.style ) {
supportedProp = prop;
} else {
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;
}
var borderRadius = styleSupport( "borderRadius" );
// Set cssHooks only for browsers that support a vendor-prefixed border radius
if ( borderRadius && borderRadius !== "borderRadius" ) {
$.cssHooks.borderRadius = {
get: function( elem, computed, extra ) {
return $.css( elem, borderRadius );
},
set: function( elem, value) {
elem.style[ borderRadius ] = value;
}
};
}
})( jQuery );

然后,您可以在支持的浏览器中使用 DOM (驼峰式) 样式或 CSS (连字符式) 样式来设置边框半径。

1
2
$( "#element" ).css( "borderRadius", "10px" );
$( "#another" ).css( "border-radius", "20px" );

如果浏览器不支持任何形式的 CSS 属性(无论是否带厂商前缀),则样式不会应用于该元素。但是,如果浏览器支持专有替代方案,则可以将其应用于 cssHooks。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
(function( $ ) {
// Feature test for support of a CSS property
// and a proprietary alternative
// ...
if ( $.support.someCSSProp && $.support.someCSSProp !== "someCSSProp" ) {
// Set cssHooks for browsers that
// support only a vendor-prefixed someCSSProp
$.cssHooks.someCSSProp = {
get: function( elem, computed, extra ) {
return $.css( elem, $.support.someCSSProp );
},
set: function( elem, value) {
elem.style[ $.support.someCSSProp ] = value;
}
};
} else if ( supportsProprietaryAlternative ) {
$.cssHooks.someCSSProp = {
get: function( elem, computed, extra ) {
// Handle crazy conversion from the proprietary alternative
},
set: function( elem, value ) {
// Handle crazy conversion to the proprietary alternative
}
}
}
})( jQuery );

特殊单位

默认情况下,jQuery 会将“px”单位添加到传递给 .css() 方法的值中。通过将属性添加到 jQuery.cssNumber 对象可以阻止此行为。

1
$.cssNumber.someCSSProp = true;

使用 cssHooks 进行动画

css hook 还可以通过将属性添加到 jQuery.fx.step 对象来挂钩到 jQuery 的动画机制。

1
2
3
$.fx.step.someCSSProp = function( fx ) {
$.cssHooks.someCSSProp.set( fx.elem, fx.now + fx.unit );
};

请注意,这最适用于简单的数值动画。根据 CSS 属性、它返回的值的类型以及动画的复杂性,可能需要更复杂的代码。