获取元素CSS值之getComputedStyle方法熟悉

1、碎碎念~前言

     咱们都用过jQuery的CSS()方法,其底层运做就应用了getComputedStyle以及getPropertyValue方法。
    对于那些只想混口饭吃的人来说,晓得CSS()如何使用就足够了。对于但愿在JS道路上越走越远的来人说,简单了解一些JS库底层实现对本身的学习颇有帮助。可能谈不上信手拈来的使用,至少对创造一些创意新颖的新技术拓宽了思路。

jQuery为什么受欢迎,其中缘由之一就是方法名称比较短。比如打架同样,块头大的潜意识认为厉害,就不禁得心生畏惧,远而避之;小个子(或村妇,小孩)嘛,天然觉得是软豆腐,愿意接受做为对手。 php

 功夫剧照 周星驰被村妇K 张鑫旭-鑫空间-鑫生活 功夫剧照 周星驰找小孩单挑 结果…… 张鑫旭-鑫空间-鑫生活

    所以,当看到相似getComputedStyle这么长的方法名的时候,咱们身体里那个懒惰小人忽然就醒了:哎哟哟,这东西,就跟放心食品同样,几年才见一回。看上去又蛮复杂,想到晚上还要跟妹子聊天。这东西,就让它从旁边过吧,反正不会掉块肉的。
    网上不是有这么个段子嘛:可怕的是,比你聪明的人比你更勤奋。那么,这里的“勤奋”的差别体如今什么地方呢?就拿这个getComputedStyle举例:懒惰青年是看一下,立马像看见凤姐同样视线离开;普通青年是看一下,发现本身不了解,百一下或谷一下,熟悉了解之;勤奋青年是不只了解,还抽出时间实践之(如作个简单demo测试),熟悉方法的特异性,验证一些观点正确性。
    您能够按照你如今的心理状态看看你是哪类青年:若是此时,您已经对本文的内容没有兴趣了(固然,您的工做与JS关系亲密),您是……(你懂的);若是您看完本文内容,发现,仍是有很多收获,心中回味下,而后ctrl+w去其余地方觅食,再也不回来,那您是普通青年;若是您看完本文,而后对所说的一些内容做了额外的测试,例如IE9浏览器是否支持测试等,并经过评论形式指出可能的错误,不得不说您是勤奋青年,假以时日,必有一番技术做为。从我文章的些评论来看,有很多同行就是这样的勤奋人儿。
    の, 很久没写文章,话又多了,打住,进入正题。
css


2、getComputedStyle是?

     getComputedStyle 是一个能够获取当前元素全部最终使用的CSS属性值。返回的是一个CSS样式声明对象([object CSSStyleDeclaration]),只读。
getComputedStyle() gives the final used values of all the CSS properties of an element.

    语法以下: html

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),不过如今嘛,不是必需参数了。


3、getComputedStyle与style的区别

    咱们使用element.style也能够获取元素的CSS样式声明对象,可是其与getComputedStyle方法还有有一些差别的。
jquery

  1. 只读与可写
    正如上面提到的getComputedStyle方法是只读的,只能获取样式,不能设置;而element.style能读能写,能屈能伸。
  2. 获取的对象范围
    getComputedStyle方法获取的是最终应用在元素上的全部CSS属性对象(即便没有CSS代码,也会把默认的祖宗八代都显示出来);而element.style只能获取元素style属性中的CSS样式。所以对于一个光秃秃的元素<p>,getComputedStyle方法返回对象中length属性值(若是有)就是190+(据我测试FF:192, IE9:195, Chrome:253, 不一样环境结果可能有差别), 而element.style就是0。


4、getComputedStyle与defaultView

    若是咱们查看jQuery源代码,会发现,其css()方法实现不是使用的window.getComputedStyle而是document.defaultView.getComputedStyle,唷?这是怎么一回事?

    jQuery源码使用document.defaultView.getComputedStyle截图证实
git

    实际上,使用defaultView基本上是没有必要的,getComputedStyle自己就存在window对象之中。根据DennisHall的说法,使用defaultView可能一是人们不太乐意在window上专门写个东西,二是让API在Java中也可用(这我不懂,忘指点~~)。
不过有个特殊状况,在FireFox3.6上不使用defaultView方法就搞不定的,就是访问框架(frame)的样式.


github

5、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自有本身的一套东西。



6、getComputedStyle与currentStyle

    currentStyle是IE浏览器自娱自乐的一个属性,其与element.style能够说是近亲,至少在使用形式上相似,element.currentStyle,差异在于element.currentStyle返回的是元素当前应用的最终CSS属性值(包括外链CSS文件,页面中嵌入的<style>属性等)。
    所以,从做用上将,getComputedStyle方法与currentStyle属性走的很近,形式上则style与currentStyle走的近。不过,currentStyle属性貌似不支持伪类样式获取,这是与getComputedStyle方法的差别,也是jQuery css()方法没法体现的一点。
//zxx: 若是你只知jQuery css()方法,你是不会知道伪类样式也是能够获取的,虽然部分浏览器不支持。
例如,咱们要获取一个元素的高度,能够相似下面的代码:
alert((element.currentStyle? element.currentStyle : window.getComputedStyle(element, null)).height);
    您能够狠狠地点击这里:使用getComputedStyle和currentStyle 获取元素高度demo

   结果FireFox下显示24px(通过计算了), 而IE浏览器下则是CSS中的2em属性值: 框架

Firefox下显示的计算后的24px值 张鑫旭-鑫空间-鑫生活 IE9下显示的CSS中的2em值 张鑫旭-鑫空间-鑫生活

    getComputedStyle方法与currentStyle属性其余具体差别还有不少,我以一个普通按钮作元素,遍历了其中靠谱的属性名和属性值,您能够狠狠地点击这里:getComputedStyle和currentStyle属性展现demo

    仔细对比查看,咱们能够看到很多差别,例如浮动属性,FireFox浏览器下是这个(cssFloat): dom

    FireFox下的浮动属性名

    IE7浏览器下则是styleFloat : 学习

    IE7浏览器下的styleFloat属性 张鑫旭-鑫空间-鑫生活

    而IE9浏览器下则是cssFloat和styleFloat都有。

    等其余N多差别。


7、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方法。


8、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颜色):
     FireFox浏览器下一如既往的RGB颜色返回 张鑫旭-鑫空间-鑫生活


    对于IE9浏览器,虽然应用的是currentStyle, 可是从结果上来说,currentStyle返回的对象是彻底支持getPropertyValue方法的。

    



9、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方法能够先漠不关心。




10、补充~结语

    有了jQuery等优秀库,咱们有熟悉底层的getComputedStyle方法的必要吗?
    实际上,本文一直没有深刻展开getComputedStyle方法一个很重要的,相似css()方法没有的功能——获取伪类元素样式。但从这一点上将,熟悉getComputedStyle方法有必要。
    下一篇文章,我就将介绍如何实现getComputedStyle方法在伪类元素上的特异功能,实现CSS3 media queries下一些JS交互,及实际应用。
    well, 开篇已经啰哩吧嗦很多内容了,这里就再也不讲废话了。行文匆忙,文中不免有表述不许确之处,欢迎指正。欢迎补充,感谢阅读,但愿本文的内容可以对您的学习有所帮助。

    原创文章,转载请注明来自张鑫旭-鑫空间-鑫生活[ http://www.zhangxinxu.com]    (本篇完)
相关文章
相关标签/搜索