您好,欢迎访问一九零五行业门户网

获取元素CSS值之getComputedStyle方法熟悉_html/css_WEB-ITnose

一、继续转载
二、getcomputedstyle是? getcomputedstyle是一个可以获取当前元素所有最终使用的css属性值。返回的是一个css样式声明对象([object cssstyledeclaration]),只读。
getcomputedstyle()gives the final used values of all the css properties of an element.
语法如下:
var style = window.getcomputedstyle(元素, 伪类);
例如:
var dom = document.getelementbyid(test), style = window.getcomputedstyle(dom , :after);
就两个参数,大家都懂中文的,没什么好说的。只是额外提示下:gecko 2.0 (firefox 4 / thunderbird 3.3 / seamonkey 2.1) 之前,第二个参数“伪类”是必需的(如果不是伪类,设置为null),不过现在嘛,不是必需参数了。
三、getcomputedstyle与style的区别 我们使用element.style也可以获取元素的css样式声明对象,但是其与getcomputedstyle方法还有有一些差异的。
只读与可写
正如上面提到的getcomputedstyle方法是只读的,只能获取样式,不能设置;而element.style能读能写,能屈能伸。 获取的对象范围
getcomputedstyle方法获取的是最终应用在元素上的所有css属性对象(即使没有css代码,也会把默认的祖宗八代都显示出来);而element.style只能获取元素style属性中的css样式。因此对于一个光秃秃的元素,getcomputedstyle方法返回对象中length属性值(如果有)就是190+(据我测试ff:192, ie9:195, chrome:253, 不同环境结果可能有差异), 而element.style就是0。 四、getcomputedstyle与defaultview 如果我们查看jquery源代码,会发现,其css()方法实现不是使用的window.getcomputedstyle而是document.defaultview.getcomputedstyle,唷?这是怎么一回事?
实际上,使用defaultview基本上是没有必要的,getcomputedstyle本身就存在window对象之中。根据dennishall的说法,使用defaultview可能一是人们不太乐意在window上专门写个东西,二是让api在java中也可用(这我不懂,忘指点~~)。
不过有个特殊情况,在firefox3.6上不使用defaultview方法就搞不定的,就是访问框架(frame)的样式.
五、getcomputedstyle兼容性 对于桌面设备:
chrome firefox (gecko) internet explorer opera safari
基本支持 9
伪类元素支持
对于手机设备:
android firefox mobile (gecko) ie mobile opera mobile safari mobile
基本支持 wp7 mango
伪元素支持 ? ? ? ?
上面打问号的表示没有测试,是否兼容不知。如果您方便测试,欢迎将测试结果告知,这里将及时更新,并附上您的姓名,以谢您做的贡献。
我们先把注意力放在桌面设备上,可以看到,getcomputedstyle方法ie6~8是不支持的,得,背了半天的媳妇,发现是孙悟空变的郁闷了。不急,ie自有自己的一套东西。
六、getcomputedstyle与currentstyle currentstyle是ie浏览器自娱自乐的一个属性,其与element.style可以说是近亲,至少在使用形式上类似,element.currentstyle,差别在于element.currentstyle返回的是元素当前应用的最终css属性值(包括外链css文件,页面中嵌入的属性等)。
因此,从作用上将,getcomputedstyle方法与currentstyle属性走的很近,形式上则style与currentstyle走的近。不过,currentstyle属性貌似不支持伪类样式获取,这是与getcomputedstyle方法的差异,也是jquerycss()方法无法体现的一点。
//zxx: 如果你只知jquery css()方法,你是不会知道伪类样式也是可以获取的,虽然部分浏览器不支持。
例如,我们要获取一个元素的高度,可以类似下面的代码:
alert((element.currentstyle? element.currentstyle : window.getcomputedstyle(element, null)).height);
您可以狠狠地点击这里:使用getcomputedstyle和currentstyle 获取元素高度demo
结果firefox下显示24px(经过计算了), 而ie浏览器下则是css中的2em属性值:
getcomputedstyle方法与currentstyle属性其他具体差异还有很多,我以一个普通按钮做元素,遍历了其中靠谱的属性名和属性值,您可以狠狠地点击这里:getcomputedstyle和currentstyle属性展示demo
仔细对比查看,我们可以看到不少差异,例如浮动属性,firefox浏览器下是这个(cssfloat):
ie7浏览器下则是stylefloat:
而ie9浏览器下则是cssfloat和stylefloat都有。
等其他n多差异。
七、getpropertyvalue方法 getpropertyvalue方法可以获取css样式申明对象上的属性值(直接属性名称),例如:
window.getcomputedstyle(element, null).getpropertyvalue(float);
如果我们不使用getpropertyvalue方法,直接使用键值访问,其实也是可以的。但是,比如这里的的float,如果使用键值访问,则不能直接使用getcomputedstyle(element, null).float,而应该是cssfloat与stylefloat,自然需要浏览器判断了,比较折腾!
使用getpropertyvalue方法不必可以驼峰书写形式(不支持驼峰写法),例如:style.getpropertyvalue(border-top-left-radius);
兼容性
getpropertyvalue方法ie9+以及其他现代浏览器都支持,见下表:
chrome firefox (gecko) internet explorer opera safari
基本支持 9
ok,一涉及到兼容性问题(ie6-8肿么办),感觉头开始微微作痛了~~,不急,ie自由一套自己的套路,就是getattribute方法。
八、getpropertyvalue和getattribute 在老的ie浏览器(包括最新的),getattribute方法提供了与getpropertyvalue方法类似的功能,可以访问css样式对象的属性。用法与getpropertyvalue类似:
style.getattribute(float);
注意到没,使用getattribute方法也不需要cssfloat与stylefloat的怪异写法与兼容性处理。不过,还是有一点差异的,就是属性名需要驼峰写法,如下:
style.getattribute(backgroundcolor);
如果不考虑ie6浏览器,貌似也是可以这么写:
style.getattribute(background-color);
实例才是王道,您可以狠狠地点击这里:getpropertyvalue和getattribute获取背景色demo
结果firefox下一如既往的rgb颜色返回(chrome也是返回rgb颜色):
对于ie9浏览器,虽然应用的是currentstyle, 但是从结果上来讲,currentstyle返回的对象是完全支持getpropertyvalue方法的。
九、getpropertyvalue和getpropertycssvalue 从长相上看getpropertycssvalue与getpropertyvalue是近亲,但实际上,getpropertycssvalue要顽劣的多。
getpropertycssvalue方法返回一个css最初值(cssprimitivevalue)对象(width, height, left, …)或css值列表(cssvaluelist)对象(backgroundcolor, fontsize, …),这取决于style属性值的类型。在某些特别的style属性下,其返回的是自定义对象。该自定义对象继承于cssvalue对象(就是上面所说的getcomputedstyle以及currentstyle返回对象)。
getpropertycssvalue方法兼容性不好,ie9浏览器不支持,opera浏览器也不支持(实际支持,只是老是抛出异常)。而且,虽然firefox中,style对象支持getpropertycssvalue方法,但总是返回null. 因此,目前来讲,getpropertycssvalue方法可以先不闻不问。
十、补充~结语 有了jquery等优秀库,我们有熟悉底层的getcomputedstyle方法的必要吗?
实际上,本文一直没有深入展开getcomputedstyle方法一个很重要的,类似css()方法没有的功能获取伪类元素样式。但从这一点上将,熟悉getcomputedstyle方法有必要。
下一篇文章,我就将介绍如何实现getcomputedstyle方法在伪类元素上的特异功能,实现css3 media queries下一些js交互,及实际应用。
well, 开篇已经?哩吧嗦不少内容了,这里就不再讲废话了。行文匆忙,文中难免有表述不准确之处,欢迎指正。欢迎补充,感谢阅读,希望本文的内容能够对您的学习有所帮助。
其它类似信息

推荐信息