首页 > 代码库 > JavaScript获取CSS样式的问题(1)
JavaScript获取CSS样式的问题(1)
刚刚来到博客园!先分享一点初级的知识吧!
在学习javascript中,很多人对获取DOM元素的CSS样式感到很困惑,因为,对于行级样式,我们可以通过很简单的访问style属性就可以了得到,而对于<style>……</style>标签中定义的CSS样式和通过<link>载入的外部样式表,我们就无法用style属性访问得到,而且使用getAttribute()方法也无法获取到。以前在网上搜索了很久,其解决方案都不尽完美,回头通过自己查阅各种书籍,算是找到了比较完美的解决方法。
我们可以通过访问通过计算的CSS样式对象来获取CSS样式!但是这里存在一个IE和非IE浏览器的兼容性问题(Opera和IE的行为在这里是一致的,但是Opera也支持非IE方法)。
在IE和Opera中,currentStyle对象中存储着DOM元素通过计算后的CSS样式。
通过计算后的样式是指元素最终在浏览器中呈现出来的样式。
例如:有一个<p id="myp">……</p>标签,我们在外部样式表中有这样的定义:
*{ margin:0px; padding:0px;}
…… ……
#myp{ margin:15px;}
…… ……
p{ padding:5px;}
那么,我们通过javascript获取计算后的CSS样式应该是这样的(IE、Opera):
var P=window.document.getElementById("myp");
alert(P.currentStyle["margin"]); // 15px
alert(P.currentStyle["padding"]); // 5px
我们可以看出,在计算后的样式即是所有与之有作用的样式效果的叠加值,首先是一个全局定义将所有元素的内外边距全部清除,然后又通过ID选择器设置了P的外边距,然后又有一个对所有p标签的内边距定义,然而我们获得的CSS样式是这些定义的叠加值。
在IE(也包括Opera的大部分版本),我们可以通过DOMObject.currentStyle["cssName"]来获取CSS样式。
在非IE中,情况就复杂一些了,这些遵循W3C标准的主流浏览器中,要通过document.defaultView.getComputedStyle(DOMObject,null)["cssName"]来获取CSS样式。
getComputedStyle()方法接收2个参数,第一个是要查询CSS样式的对象,第二个是伪元素(不是伪类,传入":hover"是不行的,但我们实际上通常不需要获取伪元素的样式,所以为null),这个方法会返回该查询对象的计算样式对象,然后访问对象中的CSS属性就可以得到CSS样式了。
以上面的例子为例吧:
var P=window.document.getElementById("myp");
alert(window.document.defaultView.getComputedStyle(P,null)["margin"]); // 15px
alert(window.document.defaultView.getComputedStyle(P,null)["padding"]); //5px
如果我们要兼容这两种方法,我们首先要创建一个对象:
var cssObj={};
添加一个能力检测。
var cssObj={
_ifDefaultView:window.document.defaultView&&window.document.defaultView.getComputedStyle?true:false,
};
然后添加我们的getCSS方法。
var cssObj={
_ifDefaultView:window.document.defaultView&&window.document.defaultView.getComputedStyle?true:false,
getCSS:(function(window){
var document=window.document;
if(cssObj._ifDefaultView){
return function(DOMObj,cssName){
return document.defaultView.getComputedStyle(DOMObj,null)["cssName"];
};
}else{
return function(DOMObj,cssName){
return DONObj.currentStyle["cssName"];
};
};
})(window)
};
到此,我们只要调用cssObj.getCSS()方法就可以获得CSS样式了,但是,这依然不够完美!甚至还没有办法在实际开发中使用!
由于篇幅关系,我重新再接着写一篇吧!