目的是利用runtimeStyle的优先级保证修改style后能按原来的样式显示;
3,设置style的left为要转换的值,并巧妙地利用pixelLeft获取这个值的px单位形式:
style.left = ret || 0;
ret = style.pixelLeft + "px";
4,最后恢复原来的left值:
style.left = left;
elem.runtimeStyle.left = rsLeft;
这样就能在不改变渲染样式的情况下转换成像素值了。
ps:jQuery中有说明这个方法也是Dean Edwards提出的,神啊。
最后还有一个setStyle用来设置样式,主要用来批量设置样式和解决一些兼容问题。
可以用以下两种方式的调用:
$$D.setStyle(元素或元素集合, { 样式属性名: 属性值, ... })
$$D.setStyle(元素或元素集合, 样式属性名, 属性值)
第一个参数是要设置样式的元素或元素集合,如果是单个元素会自动转成单元素集合:
if (!elems.length) { elems = [ elems ]; }
第二个参数是一个键值对集合,键是样式属性名,值是对应的属性值。
如果只设置一个样式,可以设第二个参数是样式属性名,第三个参数是属性值,由程序新建一个键值对集合:
if (typeof style == "string") { var s = style; style = {}; style[s] = value; }
再用forEach历遍元素集合,绑定的函数里给元素设置用for in列出的所有样式。
ps:单个元素设置单个样式应该直接设置,除非是有兼容问题。
剩下的就是解决兼容问题了。
首先是透明度,ie是用滤镜的,如果直接设置filter会把其他滤镜都替换没了。
参考jQuery的方法,先获取原来的filter,替换掉透明滤镜的部分,再加上要设置好的透明滤镜:
elem.style.filter = (elem.currentStyle.filter || "").replace( /alpha\([^)]*\)/, "" ) +
"alpha(opacity=" + value * 100 + ")";
挺巧妙的方法,记得值要乘以100对应w3c的"opacity"。
至于"float"就比较简单,ie用"styleFloat"其他用"cssFloat"就行了。
【Event】
命名空间是:$$E
这个是兼容性的老问题了,这里包含三个方法:addEvent,removeEvent,fixEvent。
addEvent和removeEvent分别是添加和移除事件,以前我是用ie的attachEvent跟w3c的addEventListener做兼容。
但看到Dean Edwards的方法后,就改用他的了,除了兼容性更好外还能解决一些bug(详细看这里的cloneNode的bug部分)。
代码中的addEvent/removeEvent根据需要在Dean代码的基础上做了些修改,不过原理还是一样的。
而fixEvent是用来修正event对象的兼容性的,主要是添加一些w3c的属性和方法,上面bindAsEventListener就用到了它。
这里我只做了ie的兼容,其他都是直接使用event,这样就做不到细致的兼容,不过够用就行了。
jQuery的fix就做的比较完善,值得研究。
【String】
命名空间是:$$S
我比较少做String的高级应用,所以暂时也没什么方法需要放进来。
里面有一个camelize方法,用来把横杠形式的字符串(例如"border-top")转换成驼峰形式(例如"borderTop")。
原理是利用replace第二个参数是function时的技巧:
return s.replace(/-([a-z])/ig, function(all, letter) { return letter.toUpperCase(); });
这个可以用在样式属性名的转换,在getStyle/setStyle中就使用了它。
调用方式