jQuery.cssHooks

jQuery.cssHooks返回类型:Object

描述:钩子直接进入jQuery以覆盖特定的CSS属性如何被检索或设置,规范化CSS属性命名,或者创建自定义属性。

  • 增补版本:1.4.3jQuery.cssHooks

$.cssHooks对象为取得特定CSS值和设置特定CSS值提供了定义函数的一种方式。它还可以用来为规范化CSS3功能创建新的cssHooks,譬如盒阴影以及渐变。

举个例子,基于Wekkit的浏览器一些版本需要-webkit-border-radius来设置某个元素上的border-radius,与此同时Firefox版本需要-moz-border-radius。css勾子可以规范化这些供应商前缀属性,使.css()接受单个标准属性名称(border-radius,或者利用DOM属性语法,borderRadius)。

除了为如何处理特定的样式属性提供更加细致的控制之外,$.cssHooks扩展了可用于.animate()方法的属性集合。

定义一个新的css勾子十分简单。下面的骨架模板可以作为创建您自己的css勾子的指南。

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", "O", "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勾子

若要定义一个完整的CSS勾子,请组合第一个示例中提供的骨架模板的实充版本作支持测试:

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", "O", "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(连线)样式设置border-radius:

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

如果浏览器缺少对CSS属性的任何形式的支持,供应商前缀或没有,此样式不会应用于元素。然而,如果浏览器支持一个专有的替代方案,可以把它应用于cssHook来替代。

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给传入到.css()方法的值添加一个“px”单位。可以通过给jQuery.cssNumber对象添加属性来阻止此行为。

1
$.cssNumber.someCSSProp = true;

用css勾子变动CSS

通过对jQuery.fx.step对象添加一个属性,CSS勾子可以放进jQuery的动画机制:

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

现在,此方法对简单数值的动画作用得很好。可能需要更多的自定义代码,取决于此CSS属性、它返回的值类型,以及动画的复杂性。