兼容性:IE≥9
难度:中等
有时候网页要适配多种分辨率,我们自然想到用百分比来控制大小。但是百分比不是万能的。例如,你想让一屏幕显示十行表格,但是你并不知道屏幕有多高,因此需要用 JavaScript 的 window.innerHeight 获取屏幕高度。但是如何修改 CSS 呢?
第一种方法:直接设置某元素的属性
document.getElementById('xxx').style.height = window.innerHeight / 10 + 'px';元素的 style 属性是一个 CSS 集合,里面的内容可以直接调。对于 margin-left 这样的复合词,要用 marginLeft 代替。注意要用小驼峰写法(第一个单词小写,其余的单词首字母大写,中间无连字符)。
此方法唯一的不足之处在于,每次只能修改一个元素的样式。
第二种方法:修改元素拥有的 class 的样式
表示之前不会。经过各种搜索之后,在 这个网站 上找到了解决方案。大体内容是这样如下。
在 document 这个大的对象里,有个叫 styleSheets 的数组,是引入的 CSS 文件列表,例如 document.styleSheets[0] 是引入的第一个文件。用 Chrome 的终端看一下效果:

其中 disabled 表示该样式表是否启用,href 是样式表路径……其实我们关心的是 rules 的值。

很清楚了吧,这就是一条条 CSS 的规则。其中对象的 style 跟上一个方法的 style 是一个东西,可以直接调用了。例如我要把这个 .popup 的 display 设成 block,可以这么写:
document.styleSheets[0].rules[2].style.display = 'block';有点麻烦呢。更麻烦的是,在 IE 中对 rules 的解释还不一样(一般比 Chrome 多出几条,不知道为什么),还有在 Firefox 中压根就没有 rules 这个东西,取而代之的是 cssRules!浏览器们,能不能统一一下标准啊……
不过还好,可以写一段 JavaScript 来简化工作(代码经我简化过,与网站上的代码功能完全相同):
function getStyle(sname) {
var rules;
for (var i = 0; i < document.styleSheets.length; i++) {
if (!(rules = document.styleSheets[i].cssRules))
rules = document.styleSheets[i].rules;
for (var j = 0; j < rules.length; j++)
if (rules[j].selectorText == sname)
return rules[j].style;
}
}解释一下用法好了。sname 是我们需要找的 CSS 选择器(例如 .icon_add),返回的结果是最终的那个 style,所以用起来很简单,例如:getStyle('.icon_add').display = 'block'。当然副作用还是有的,毕竟是直接调用我们的 CSS 文件,所以当我们的选择器比较特殊的时候(例如 html, body, #content > div),我们必须完整地敲出这个选择器(只敲 body 是没法匹配的哦)。
下面的内容是解释代码含义的,没兴趣的可以跳过了。
首先,外层循环是在枚举 styleSheets 数组的元素,里面那个 if 是为了兼容 Firefox 的(我没有犯将 == 打成 = 的错误,那里就是 =)——如果没有 cssRules 的话,就用 rules 吧。
内层循环就是枚举 rules 啦,用 selectorText 跟你的 sname 进行比较,如果相同的话就返回该条规则的 style,用起来很方便的。