设置元素(element)的css属性值可以用element的style属性,例如要将element的背景色设置为黑色,可以这么做:

element.style.backgroundColor = '#000';

然而,很多时候我们在修改元素的样式之前要先保留元素原来的样式属性值,或许可以这么做:

var bc = element.style.backgroundColor;

这么做有可能获取到element元素的background-color属性值,但是,在多数情况下获取到的确实 'undefined',何解??

原因很简单,就是element.style只能获取到element的内联样式,而在一个设计良好的网页文件里,样式表一般是与文档结构分离开来以外部文件存在的。所以,仅仅用element.style不能如意地获取元素CSS样式!

那么,有什么方法可以获取外部样式吗?答案是:有的,不过存在 IE 与 W3C 的兼容问题!

在 IE 中,element 除了有 style 属性之外,还有一个 currentStyle 属性。currentStyle 的用法和 style 的用法一样,然而不同的是,currentStyle 如名字所示获取到的是 element 元素当前(所有的)样式:

var cbc = element.currentStyle.backgroundColor;//一定是元素当前的样式

var bc = element.style.backgroundColor;//多数情况下为undefined,囧...

好了,在 IE 下我们已经解决了获取外部样式的问题。然而,在 Firefox 等支持W3C DOM标准的浏览器却不支持currentStyle属性,所以只能另寻他方了。不用急,DOM也提供获取元素当前样式的,只不过稍稍麻烦一点点^_^

DOM提供了一个 getComputedStyle() 方法获取给定元素的样式表。这个函数有两个参数:第一个参数为需要获取样式的元素对象;第二个参数为伪元素,如:hover, :first-letter, :before等等,如果不需要伪元素则该参数为null。getComputedStyle()函数可以从 document.defaultView 对象中访问到,即可以这样调用该函数:

var cbc = document.defaultView.getComputedStyle(element,null).backgroundColor;

以上语句的作用就是获取 element 元素当前的 background-color 属性值。

getComputeStyle()函数的调用结果就是 element 元素的样式表,理应是一个对象。该对象还有一个方法:getPropertyValue()。该方法只有一个参数,即需要获取的样式的属性名,属性名与样式表中的形式相同,即背景色的属性名为 background-color,而非 backgroundColor。

好吧,以下开始定义getStyle()函数,或许分析完以下的代码段之后,可以对以上的解说更形象的理解。和以前一样,凡在标题开头带有'[JS库]'字样的文章都是为了充实我个人的 JS 库:pan,所以如果无法理解以下代码的编写形式,请先参阅之前的'[JS库]'相关博文:

(function(){

if(!window.pan){
        window['pan']={};
    }

//pan库中其它函数的定义,略

//
    function getStyle(elem,styleName){
        if(elem.style[styleName]){//内联样式
            return elem.style[styleName];
        }
        else if(elem.currentStyle){//IE
            return elem.currentStyle[styleName];
        }
        else if(document.defaultView && document.defaultView.getComputedStyle){//DOM
            styleName = styleName.replace(/([A-Z])/g,'-$1').toLowerCase();
            var s = document.defaultView.getComputedStyle(elem,'');
            return s&&s.getPropertyValue(styleName);
        }
        else{//other,for example, Safari
            return null;
        }
    }
    window['pan']['getStyle'] = getStyle;

})();

需要说明的一点是,Safari不支持document.defaultView,所以以上函数获取元素外部样式不支持Safari浏览器。

这个函数的用法非常简单,传递两个参数:第一个参数为需要获取样式的元素对象;第二个参数为样式的属性名,属性名规则与style一致,即多个单词的属性名除了第一个单词外其它的均需首字母大写:

var cbc = pan.getStyle(element, 'backgroundColor');//获取背景色

var w = pan.getStyle(element, 'width');//获取宽度

var blw = pan.getStyle(element, 'borderLeftWidth');//获取左边框的宽度

好了,这个函数就写到这里,相信我已经将该函数的内部逻辑结构和用法都说明清楚了,呵呵,我的JS库又新添了一个函数了^_^

PS:该函数有待改进,如第一个参数可以不局限于传递元素对象。

原文地址:http://blog.sina.com.cn/s/blog_491997ee0100b13f.html

(转载)记录函数 getStyle() 获取元素 CSS 样式的更多相关文章

  1. 获取元素CSS样式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 转贴:获取元素CSS值之getComputedStyle方法熟悉

    获取元素CSS值之getComputedStyle方法熟悉 一.碎碎念~前言 我们都用过jQuery的CSS()方法,其底层运作就应用了getComputedStyle以及getPropertyVal ...

  3. 获取元素计算样式getComputedStyle()与currentStyle

    window.getComputedStyle()方法是标准化接口,返回一个对象,该对象在应用活动样式表并解析这些值可能包含的任何基本计算后报告元素的所有CSS属性的值. 私有的CSS属性值可以通过对 ...

  4. js兼容获取元素的样式

    js获取元素的样式的兼容性处理: function getStyle(obj,attr){ return obj.currentStyle?obj.currentStyle[attr]:getComp ...

  5. 利用getComputedStyle方法获取元素css的属性值

    在平时的工作中有时候会碰到需要获取元素当前样式的问题,查了一下可以用getComputedStyle这个方法来获取元素计算后的样式(有些我们在css里面没有写的,浏览器默认的样式也可以获得) getC ...

  6. js中获取元素的样式兼容性的写法

    1:设计元素的样式:el.style.color="red"||el.style["color"]="red"  获取元素的样式:el.st ...

  7. 函数return/获取元素样式/封装自己的库

    一:函数return <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type&qu ...

  8. JS 获取元素、修改元素/css样式/标签属性、简单事件、数据类型

    基本使用 写在Script 标签里 引入外部js文件:<script src=" "></script> console.log(" " ...

  9. JS获取元素CSS值

    一.getComputedStyle getComputedStyle 是一个可以获取当前元素所有最终使用的CSS属性值.返回的是一个CSS样式声明对象([object CSSStyleDeclara ...

随机推荐

  1. 实验一个最小的PYTHON服务器编程

    没事,玩玩儿~~~:) 按书上的例子来作.. #!/usr/bin/env python #Simple Server - Chapter 1 -server.py import socket hos ...

  2. Android 通过开源框架AsyncHttpClient进行get和post请求

    使用时无需将这些代码放入子线程去执行,因为其内部已经封装到一个线程中运行了! public void asyncHttpClientGet(View view) { AsyncHttpClient c ...

  3. Keil 的调试命令、在线汇编与断点设置

    上一讲中我们学习了如何建立工程.汇编.连接工程,并获得目标代码,但是做到这一 步仅仅代表你的源程序没有语法错误,至于源程序中存在着的其它错误,必须通过调试才能 发现并解决,事实上,除了极简单的程序以外 ...

  4. C语言嵌入式系统编程修炼之六:性能优化

    使用宏定义 在C语言中,宏是产生内嵌代码的唯一方法.对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法. 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的 ...

  5. 读书笔记-----Java并发编程实战(一)线程安全性

    线程安全类:在线程安全类中封装了必要的同步机制,客户端无须进一步采取同步措施 示例:一个无状态的Servlet @ThreadSafe public class StatelessFactorizer ...

  6. Apache OFBiz

    Apache OFBiz® Apache OFBiz offers a great deal of functionality, including: advanced e-commerce cata ...

  7. Android listView scroll 恢复滚动位置

    相信大家尝试过许多方法恢复滚动位置,本人也找了许多方法,唯有这个方法好用,下面把代码贴出来 声明两个变量 private int mPosition; private int lvChildTop; ...

  8. bzoj1297

    首先学习是学习矩阵乘法在邻接矩阵的应用ab两点经过k条边的路径数就等于图的邻接矩阵G的k次幂之后G[a,b]的值但这道题问的是经过长度为k的路径数考虑到每条边的长度最长只有9,所以我们把一个点拆成9个 ...

  9. phpMyAdmin 完整路径泄露漏洞3

    漏洞名称: phpMyAdmin 完整路径泄露漏洞 CNNVD编号: CNNVD-201307-652 发布时间: 2013-08-09 更新时间: 2013-08-09 危害等级: 中危   漏洞类 ...

  10. Linux Shell编程(13)——数字常量

    除非一个数字有特别的前缀或符号,否则shell脚本把它当成十进制的数.一个前缀为0的数字是八进制数.一个前缀为0x的数字是十六进制数.一个数用内嵌的#来求值则看成BASE#NUMBER(有范围和符号限 ...