Skip to content

Instantly share code, notes, and snippets.

@WesternRanger
Forked from q946401639/cssText.md
Last active August 29, 2015 14:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save WesternRanger/3f4925f1dd78be48ff08 to your computer and use it in GitHub Desktop.
Save WesternRanger/3f4925f1dd78be48ff08 to your computer and use it in GitHub Desktop.

用cssText批量修改样式踩的坑

-----欢迎指正错误,深表感谢

一般情况下我们用js设置元素对象的样式会使用这样的形式:

var element= document.getElementByIdx_x(“id”);
element.style.width=”20px”;
element.style.height=”20px”;
element.style.border=”solid 1px red”;

样式一多,代码就很多;而且通过JS来覆写对象的样式是比较典型的一种销毁原样式并重建的过程,这种销毁和重建,都会增加浏览器的开销。

js中有一个cssText的方法:

语法为:obj.style.cssText=”样式”;

上面的代码我们可以修改成:

element.style.cssText=”width:20px;height:20px;border:solid 1px red;”;

这样就可以尽量避免页面reflow,提高页面性能。

但是,这样会有一个问题,会把原有的cssText清掉,比如原来的style中有’display:none;’,那么执行完上面的JS后,display就被删掉了。

为了解决这个问题,可以采用cssText累加的方法:

Element.style.cssText += ’width:100px;height:100px;top:100px;left:100px;’

但是,cssText(假如不为空)在IE中最后一个分号会被删掉,比较BT….

因此,上面cssText累加的方法在IE中是无效的。

最后,可以在前面添加一个分号来解决这个问题:

Element.style.cssText += ’;width:100px;height:100px;top:100px;left:100px;’

举个例子:

<div style="color:red;">TEST</div>
<script>
	var div = document.getElementsByTagName('div');
	alert(div[0].style.cssText);
</script>

各浏览器输出如下
IE6/7/8 :COLOR:red
IE9/Firefox/Chrome/Safari/Opera :color:red;
可见IE6/7/8下少了个分号,并且属性名是大写的

再有:例如

<div style="border:1px solid gray;">TEST</div>
<script>
	var div = document.getElementsByTagName('div');
	alert(div[0].style.cssText);
</script>

IE6/7/8:BORDER-BOTTOM:gray 1px solid;BORDER-LEFT:gray 1px solid;BORDER-TOP:gray 1px solid;BORDER-RIGHT:gray 1px solid
IE9等:border:1px solid gray;
可见IE6/7/8下复合属性全部展开了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment