[原创] jQuery源码分析-13 CSS操作-CSS-样式表-jQuery.fn.css()

作者:nuysoft/高云 QQ:47214707 Email:[email protected]
声明:本文为原创文章,如需转载,请注明来源并保留原文链接。

jQuery源码分析系列(持续更新)

 

样式表

 

概述

如何使用

使用详解

    特性对应的实现原理

源码分析

    .css( name, value )

    jQuery.style( elem, name, value, extra )

    jQuery.css( elem, name, extra )

    curCSS( elem, name )

 

概述

 

CSS操作部分的源码分析基于版本1.7.1,以后的jQuery源码分析系列将采用最新的版本。

jQuery.fn.css()主要解决了三个问题:

浏览器兼容:IE、W3C

兼容HTML样式属性和DOM样式属性:连词符、驼峰

使设置元素的样式属性变得快速简单:动态参数检测、设置和读取用统一的接口

 

如何使用

 

jQuery.fn.css()有4种用法,第一种是读取样式属性值,其余三种是设置样式属性值

.css( propertyName ) 获取第一个元素的样式属性值,propertyName是CSS属性名

.css( propertyName, value ) 在匹配的元素集上设置一个CSS属性,value是要设置的属性值

.css( propertyName, function(index, value) ) 将函数返回值做为属性值设置

    function(index, value) 返回要设置的属性值,函数的上下文this指向当前元素,接收两个参数:index是当前元素在集合中的下标位置;value是旧值,即当前值(意味着设置之前要先取出当前值)

.css( map ) 设置多个样式

    map 含有键值对的map,键是属性名,值是字面直接量或函数

 

使用详解

 

读取和设置样式表遇到的难题是浏览器兼容性。例如访问样式属性时的方式就不同

// 在基于标准的浏览器中
var defaultView = elem && elem.ownerDocument.defaultView;
var computedStyle = defaultView && defaultView.getComputedStyle( elem, null );
var ret = computedStyle && computedStyle.getPropertyValue( name );
return ret;
// 相对的在IE中
var ret = elem.currentStyle && elem.currentStyle[ name ]
return ret;

另一个常见的兼容问题是,某些属性在不同的浏览器中使用不同的属性名,例如float,在IE的DOM实现中用styleFloat,而在遵守W3C标准的浏览器中是 cssFloat。

jQuery的.css()方法封装了这些差异,无论使用什么属性名都返回相同的结果。例如,一个向左浮动的元素,下边的三行代码每行都会返回字符串left:

$('div.left').css('float');
$('div.left').css('cssFloat');
$('div.left').css('styleFloat');

如果遇到由多个单词组成的属性,这些属性在CSS和DOM有着不一样的格式,jQuery也能等价的解释,例如:

.css( { 'background-color': '#ffe', 'border-left': '5px solid #ccc' } )
.css( { backgroundColor: '#ffe', borderLeft: '5px solid #ccc' } )

jQuery都能识别并返回正确的值,注意在DOM属性的引号是可选的,而CSS属性必须有引号,因为在属性名中有连字符-

当使用.css()设置样式时,jQuery改变元素的样式属性style property,例如下面两行代码是等价的:

$('#mydiv').css('color', 'green')
document.getElementById('mydiv').style.color = 'green'

为样式属性设置一个空字符串,例如$('#mydiv').css('color', ''),如果这个属性是行内样式(HTML style attribute),这个属性会被从元素的style中移除,无论是通过.css()方法操作,还是直接操作DOM样式属性style(DOM style property);但是如果是定义在外部样式表stylesheet或内部样式表