精确获取元素样式值
这个系列的文章会介绍如何精确取值,开篇准备了一些闲言碎语。
首先介绍两个工具方法:
/**
* 把连字符形式转成驼峰形式,如margin-left => marginLeft
* @param {String} name
* @return {String}
*/
function camelize(name) {
return name.replace(/-([a-z])/g, function($0, $1) {
return $1.toUpperCase();
});
}
/**
* 把驼峰形式转成连字符形式,如marginLeft => margin-left
* @param {String} name
* @return {String}
*/
function capitalize(name) {
return name.replace(/[A-Z]/g, function($0) {
return '-' + $0.toLowerCase();
});
}
为了精确获取样式值,一般会用到 computedStyle。这东西会返回绝对值,什么是绝对值呢?
比如你设置 width: 50%,这里的 50% 是相对值,此外还有 em 等也是相对值,所谓的绝对值指的是 px,这也是我们日常开发中用的最多的单位。
不论你显式设置的是 2em 还是 50%,computedStyle 都会返回对应的像素值。但是IE不支持这个功能,而是变相的实现了 currentStyle,为了保证 currentStyle 和 computedStyle 保持一致,我们需要这样处理一下:
var getComputedStyle,
numnonpxExpr = /^[-+]?(?:\d*\.)?(\d+)(?!px)[^\d\s]+$/i;
// 这么写是怕有人覆盖window.getComputedStyle,这样 IE8- 也有了getComputedStyle。。。
if (document.defaultView && document.defaultView.getComputedStyle) {
getComputedStyle = function(elem, name) {
name = capitalize(name);
var defaultView = elem.ownerDocument.defaultView,
computedStyle = defaultView.getComputedStyle(elem, null);
return computedStyle[name];
};
} else {
getComputedStyle = function(elem, name) {
var ret = elem.currentStyle[name];
// 处理数值且单位非px的情况
if (numnonpxExpr.test(ret)) {
var style = elem.style,
left = style.left,
rsLeft = elem.runtimeStyle.left;
elem.runtimeStyle.left = elem.currentStyle.left;
style.left = ret;
ret = style.pixelLeft + 'px';
style.left = left;
elem.runtimeStyle.left = rsLeft;
} else {
// 待续
}
return ret;
};
}
IE的处理首先需要解决非px数值,这个技巧用于将em、pc、pt、cm、in、ex等单位转换为px,但不包括%。
待续部分后面会说
先明确一点,我们到底想得到什么,答案是数值对吧,至少大部分是数值。但问题是,在IE中,比如width,如果不显式设值,得到的结果是"auto" ,除此之外还有"inherit"这样的值在某个黑暗的角落等着你,是不是有种崩溃的感觉,具体可以参考 司徒正美的 《CSS的inherit与auto》,我不想说太多,因为需要动态获取样式的name不太多,没必要为不存在的需求在这里枚举。
那么有哪些样式需要动态获取呢?
1. 盒模型属性:width/height padding border margin
2. 位置:top/right/bottom/left
3. 透明度
4. 浮动
5. 动画可能用到的 z-index display 等
其中值可能为 auto 的有:width / height / margin / top / right / bottom / left / z-index ( 远不止这些,比如 overflow 也可能是auto,所以我们要区别对待 )
值不可能为 inherit 的有:margin / border / padding / width / height / top / right / bottom / left / float / display
下面分篇详述

浙公网安备 33010602011771号