element.style
属性只会返回在该元素中以内联方式(通过编程或在元素的样式属性中定义)定义的 CSS 属性,你应该获取 计算样式。
这并不容易做到跨浏览器的兼容性,因为 IE 有它自己的方式,通过 element.currentStyle
属性实现,而其他浏览器则是通过 DOM Level 2 标准 方法实现的,使用document.defaultView.getComputedStyle
进行调用。
这两种方法存在差异,例如,IE 的 element.currentStyle
属性期望你使用驼峰式(camelCase)访问由两个或更多单词组成的 CCS 属性名称(例如 maxHeight
, fontSize
, backgroundColor
等),标准的获取方式则希望属性名称使用破折号分隔的单词(例如max-height
, font-size
, background-color
等)。
此外,IE 的 element.currentStyle
将以它们被指定的单位返回所有大小(例如12pt、50%、5em),而标准方式将始终计算出实际的像素大小。
我之前编写了一个跨浏览器函数,可以以跨浏览器的方式获取计算样式:
function getStyle(el, styleProp) {
var value, defaultView = (el.ownerDocument || document).defaultView;
if (defaultView && defaultView.getComputedStyle) {
styleProp = styleProp.replace(/([A-Z])/g, "-$1").toLowerCase();
return defaultView.getComputedStyle(el, null).getPropertyValue(styleProp);
} else if (el.currentStyle) {
styleProp = styleProp.replace(/\-(\w)/g, function(str, letter) {
return letter.toUpperCase();
});
value = el.currentStyle[styleProp];
if (/^\d+(em|pt|%|ex)?$/i.test(value)) {
return (function(value) {
var oldLeft = el.style.left, oldRsLeft = el.runtimeStyle.left;
el.runtimeStyle.left = el.currentStyle.left;
el.style.left = value || 0;
value = el.style.pixelLeft + "px";
el.style.left = oldLeft;
el.runtimeStyle.left = oldRsLeft;
return value;
})(value);
}
return value;
}
}
上述函数并非适用于所有情况,例如对于颜色,标准方法将以rgb(...)的形式返回颜色,在IE中它们将按照定义的方式返回。
我目前正在撰写一篇相关文章,您可以在这里跟踪我对此函数所做的更改。