您的位置:首页 > Web前端 > CSS

DOM操作样式

2016-03-20 21:11 381 查看
1.访问元素的样式

首先要知道CSS样式有三种形式(CSS内容,这儿不赘述):

行内:就是在标签里的style属性添加的样式;

内联:就是<style>…</style>标签里书写的样式;

链接:就是通过<link href=” ”/>标签链接到的样式.

任何HTML元素标签都会有一个通用的属性:style。它会返回CSSStypeDeclaration对象。下面我们看几个最常见的行内style样式的访问方式。

var box = document.getElementById('box'); //获取box

box.style; //CSSStyleDeclaration

box.style.color; //red

box.style.fontSize; //20px

box.style.cssFloat || box.style.styleFloat; //left,非IE用cssFloat,IE用styleFloat

PS:以上取值方式也可以赋值,最后一种赋值可以如下:

typeof box.style.cssFloat != 'undefined' ?

box.style.cssFloat = 'right' : box.style.styleFloat = 'right';

PS:Firefox、Safari、Opera9+、Chrome支持这些属性和方法。IE只支持cssText,而getPropertyCSSValue()方法只有Safari3+和Chrome支持,因此这些属性和方法用处不大,了解即可。

box.style.cssText; //获取CSS代码

//box.style.length; //3,IE不支持

//box.style.removeProperty('color'); //移除某个CSS属性,IE不支持

//box.style.setProperty('color','blue'); //设置某个CSS属性,IE不支持

PS:style属性仅仅只能获取行内的CSS样式,对于另外两种形式内联<style>和链接<link>方式则无法获取到。

虽然可以通过style来获取单一值的CSS样式,但对于复合值的样式信息,就需要通过计算样式(计算后的样式一般指默认样式和设置后的样式)来获取。DOM2级样式,window对象下提供了getComputedStyle()方法。接受两个参数,需要计算的样式元素,第二个伪类(:hover),如果没有伪类,就填null。

PS:IE不支持这个DOM2级的方法,但有个类似的属性可以使用currentStyle属性。

下列代码强烈建议手动敲一下,感受一下各浏览器的魅力:

  var box = document.getElementById('box');

  var style = window.getComputedStyle ?

   window.getComputedStyle(box, null) : null || box.currentStyle;

alert(style .color); //颜色在不同的浏览器显示格式不同

alert(style .border); //不同浏览器不同的结果

alert(style .fontFamily); //计算显示复合的样式值

alert(style.border);        //复合型属性就无法在各浏览器中统一获取了

alert(style.borderTopColor);          //这种形式书写方式获取

PS:border属性是一个综合属性,所以他在Chrome显示了,Firefox为空,IE为undefined。所谓综合性属性,就是XHTML课程里的简写形式,所以,DOM在获取CSS的时候,最好采用完整写法兼容性最好,比如:border-top-color之类的。

PS:getComputedStyle()方法和currentStyle属性无所谓什么CSS样式,行内,内联,链接都可以,但是仅仅能获取,不能够赋值!!!

2.操作样式表

使用style属性可以设置行内的CSS样式,而通过id(非常不建议通过修改id来变换一个元素的CSS样式)和class调用是最常用的方法。

box.id = 'pox'; //把ID改变会带来灾难性的问题

box.className = 'red'; //通过className关键字来设置样式

在添加className的时候,我们想给一个元素添加多个class是没有办法的,后面一个必将覆盖掉前面一个,所以必须来写个函数:

之前我们使用style属性,仅仅只能获取和设置行内的样式,如果是通过内联<style>或链接<link>提供的样式规则就无可奈何了,然后我们又学习了getComputedStyle和currentStyle,这只能获取却无法设置。

CSSStyleSheet类型表示通过<link>元素和<style>元素(注意这两种形式的都包括)包含的样式表。首先本身我们可以通过下面的方式获取两种元素:

document.implementation.hasFeature('StyleSheets', '2.0') //是否支持DOM2级样式表

document.getElementsByTagName('link')[0]; //HTMLLinkElement(<link> 形式)

document.getElementsByTagName('style')[0]; //HTMLStyleElement (<style> 形式)

这两个元素本身返回的是HTMLLinkElement和HTMLStyleElement类型,但CSSStyleSheet类型更加通用一些。得到这个类型非IE使用sheet属性,IE使用styleSheet:

var link = document.getElementsByTagName('link')[0];

   var sheet = link.sheet || link.styleSheet; //得到CSSStyleSheet

注意:首先需要明确,什么是样式规则?一群样式的集合表示一个规则(比如说,在.css文件中,每一个花括号就表示一个样式规则),当然这儿的样式既包括连接也包括内联样式。

PS:除了几个不用和IE不支持的我们忽略了,还有三个有IE对应的另一种方式:

  sheet.rules;      //代替cssRules的IE版本

  sheet.removeRule(0);      //代替deleteRule的IE版本

  sheet.addRule("body", "background-color:red", 0);  //代替insertRule的IE版本
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: