发文不易,若转载传播,请亲注明出处,谢谢!

一.操作样式

CSS作为(X)HTML的辅助,可以增强页面的显示效果。但不是每个浏览器都能支持最新的CSS能力。CSS的能力和DOM级别密切相关,所以我们有必要检测当前浏览器支持CSS能力的级别。

DOM1级实现了最基本的文档处理,DOM2和DOM3在这个基础上增加了更多的交互能力,这里我们主要探讨CSS,DOM2增加了CSS编程访问方式和改变CSS样式信息。

DOM一致性检测

功能

版本号

说明

Core

1.0、2.0、3.0

基本的DOM,用于表现文档节点树

XML

1.0、2.0、3.0

Core的XML扩展,添加了对CDATA等支持

HTML

1.0、2.0

XML的HTML扩展,添加了对HTML特有元素支持

Views

2.0

基于某些样式完成文档的格式化

StyleSheets

2.0

将样式表关联到文档

CSS

2.0

对层叠样式表1级的支持

CSS2

2.0

对层叠样式表2级的支持

Events

2.0

常规的DOM事件

UIEvents

2.0

用户界面事件

MouseEvents

2.0

由鼠标引发的事件(如:click)

MutationEvents

2.0

DOM树变化时引发的事件

HTMLEvents

2.0

HTML4.01事件

Range

2.0

用于操作DOM树中某个范围的对象和方法

Traversal

2.0

遍历DOM树的方法

LS

3.0

文件与DOM树之间的同步加载和保存

LS-Async

3.0

文件与DOM树之间的异步加载和保存

Valuidation

3.0

在确保有效的前提下修改DOM树的方法

//检测浏览器是否支持DOM1级CSS能力或DOM2级CSS能力

alert('DOM1级CSS能力:' + document.implementation.hasFeature('CSS', '2.0'));

alert('DOM2级CSS能力:' + document.implementation.hasFeature('CSS2', '2.0'));

PS:这种检测方案在IE浏览器上不精确,IE6中,hasFeature()方法只为HTML和版本1.0返回true,其他所有功能均返回false。但IE浏览器还是支持最常用的CSS2模块。

1.访问元素的样式

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

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

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

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

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

CSS属性及JavaScript调用

CSS属性

JavaScript调用

color

style.color

font-size

style.fontSize

float

非IE:style.cssFloat

float

IE:style.styleFloat

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';

DOM2级样式规范为style定义了一些属性和方法

属性或方法

说明

cssText

访问或设置style中的CSS代码

length

CSS属性的数量

parentRule

CSS信息的CSSRule对象

getPropertyCSSValue(name)

返回包含给定属性值的CSSValue对象

getPropertyPriority(name)

如果设置了!important,则返回,否则返回空字符串

item(index)

返回指定位置CSS属性名称

removeProperty(name)

从样式中删除指定属性

setProperty(name,v,p)

给属性设置为相应的值,并加上优先权

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是没有办法的,后面一个必将覆盖掉前面一个,所以必须来写个函数:

 //判断是否存在这个class

 function hasClass(element, className) { 

        return element.className.match(new RegExp('(\\s|^)'+className+'(\\s|$)'));

 }

 //如果不存在的话,添加一个class

 function addClass(element, className) {

        if (!hasClass(element, className))   {      

               element.className += " "+className; 

        }

 }

 //如果存在的话, 删除一个class

 function removeClass(element, className) {  

        if (hasClass(element, className)) {        

               element.className = element.className.replace(

33               new RegExp('(\\s|^)'+className+'(\\s|$)'),' ');  

        }

 }
  

之前我们使用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

属性或方法

说明

disabled

获取和设置样式表是否被禁用

href

如果是通过<link>包含的,则样式表为URL,否则为null

media

样式表支持的所有媒体类型的集合

ownerNode

指向拥有当前样式表节点的指针

parentStyleSheet

@import导入的情况下,得到父CSS对象

title

ownerNode中title属性的值

type

样式表类型字符串

ownerRule

@import导入的情况下,指向表示导入的规则,IE不支持

cssRules

样式表包含样式规则的集合,IE不支持

deleteRule(index)

删除cssRules集合中指定位置的规则,IE不支持

insertRule(rule, index)

向cssRules集合中指定位置插入rule字符串,IE不支持

  sheet.disabled;                                                  //false,可设置为true

  sheet.href;                                                       //css的URL

  sheet.media;                                                     //MediaList,集合

  sheet.media[0];                                                //第一个media的值

  sheet.title;                                                        //得到title属性的值(如:<link title=”a”/>)

  sheet.cssRules;                                                           //CSSRuleList,样式表规则集合

  sheet.deleteRule(0);                                                   //删除第一个样式规则

  sheet.insertRule("body {background-color:red}", 0);  //在第一个位置添加一个样式规则

 

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

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

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

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

  sheet.addRule("body", "background-color:red", 0);  //代替insertRule的IE版本

做一个小小的概括性代码:

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

        var sheet = link.sheet || link.styleSheet;

        //下面两行代码通过FireBug的css实时编辑查看效果

        sheet.deleteRule(0);                                               //删除第一个样式规则

        sheet.insertRule("body {background-color:red}", 0);//在第一个位置添加一个样式规则

        sheet.cssRules;    //CSSRuleList,样式规则集合

        //IE

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

        //sheet.addRule("body", "background-color:red", 0);//代替insertRule的IE版本

除了刚才的方法可以得到CSSStyleSheet类型,还有一种方法是通过document的styleSheets属性(与上面的相比这个属性更常用)来获取。

  document.styleSheets;                             //StyleSheetList,集合

  var sheet = document.styleSheets[0];     //CSSStyleSheet第一个样式表对象(<link>or<style>)

为了添加CSS规则,并且兼容所有浏览器,我们必须写一个函数:

 var sheet = document.styleSheets[0];

 insertRule(sheet, "body", "background-color:red;", 0);

 function insertRule(sheet, selectorText, cssText, position) {

 //如果是非IE

        if (sheet.insertRule) {

               sheet.insertRule(selectorText + "{" + cssText + "}", position);

 //如果是IE

        } else if (sheet.addRule) {

               sheet.addRule(selectorText, cssText, position);

        }

 }

为了删除CSS规则,并且兼容所有浏览器,我们必须写一个函数:

 var sheet = document.styleSheets[0];

 deleteRule(sheet, 0);

 function deleteRule(sheet, index) {

     //如果是非IE

     if (sheet.deleteRule) {

         sheet.deleteRule(index);

     //如果是IE

     } else if (sheet.removeRule) {

         sheet.removeRule(index);

     }

 }        

通过CSSRules属性(非IE)和rules属性(IE),我们可以获得样式表的规则集合列表。这样我们就可以对每个样式进行具体的操作了。

var sheet = document.styleSheets[0];                  //CSSStyleSheet

var rules = sheet.cssRules || sheet.rules;               //CSSRuleList,样式表的规则集合列表

var rule = rules[0];                                           //CSSStyleRule,样式表第一个规则

CSSStyleRule可以使用的属性

属性

说明

cssText

获取当前整条规则对应的文本,IE不支持

parentRule

@import导入的,返回规则或null,IE不支持

parentStyleSheet

当前规则的样式表,IE不支持

selectorText

获取当前规则的选择符文本

style

返回CSSStyleDeclaration 对象,可以获取和设置样式

type

表示规则的常量值,对于样式规则,值为1,IE不支持

rule.cssText;                                                     //当前规则的样式文本

rule.selectorText;                                              //#box,样式的选择符

rule.style.color;                                                //red,得到具体样式值

PS:Chrome浏览器在本地运行时会出现问题,rules会变成null,只要把它放到服务器上允许即可正常。

总结:三种操作CSS的方法,第一种style行内,可读可写;第二种行内、内联和链接,使用getComputedStyle或currentStyle,可读不可写;第三种cssRules或rules,内联和链接可读可写.

简单来一个综合性小例子:

html代码片段:

 <link rel="stylesheet" title='AA' type="text/css" href="DOM.css" />

 <style type="text/css">

    #box{

          background:green;

        }

 </style>

 <script type="text/javascript" src="DOM.js"></script>

 </head>

 <body>

 <div id="box">测试Div</div>

 </body>

 </html>

CSS代码:

 #box {

        font-size:20px;

        color:red;

        background:#ccc;

 }

 #pox {

        color:green;

        border:1px solid black;

 }

JS代码:

 window.onload = function () {

        //下面这个获取的是链接样式<link/>

        var sheet = document.styleSheets[0];                  //CSSStyleSheet

        var rules1 = sheet.cssRules || sheet.rules;           //CSSRuleList,样式表的规则集合列表

        var rule1 = rules1[0];                                //CSSStyleRule,链接样式表第一个规则

        alert(rule1.cssText);

        alert(rule1.selectorText);

        alert(rule1.style.color);    //red,得到具体的单条样式值

        rule1.style.color = 'blue';

        //下面这个获取的是行内样式<style></style>

        var sheet = document.styleSheets[1];                  //CSSStyleSheet

        var rules2 = sheet.cssRules || sheet.rules;           //CSSRuleList,样式表的规则集合列表

        var rule2 = rules2[0];                                //CSSStyleRule,行内样式表第一个规则

        alert(rule2.cssText);

        alert(rule2.selectorText);

        alert(rule2.style.color);

 };

 持之以恒,戒浮戒躁!

DOM系列---DOM操作样式的更多相关文章

  1. DOM系列---DOM操作表格

    DOM在操作生成HTML上,还是比较简明的.不过,由于浏览器总是存在兼容和陷阱,导致最终的操作就不是那么简单方便了.本篇章主要了解一下DOM操作表格. 一.操作表格 <table>标签是H ...

  2. DOM系列---DOM获取尺寸和位置

    内容提纲: 1.获取元素CSS大小 2.获取元素实际大小 3.获取元素周边大小 本篇我们主要讨论一下页面中的某一个元素它的各种大小和各种位置的计算方式. 一.获取元素CSS大小 1.通过style获取 ...

  3. DOM操作样式表及其兼容性

    DOM操作样式表的时候,存在很多浏览器兼容上的问题,测试的时候用的是Firefox 28.0.IE11.IE8.Chrome.测试的时候发现,不兼容问题基本上都是IE8和非IE浏览器之家的问题,很多I ...

  4. JavaScript编程:使用DOM操作样式表

    6.使用DOM操作样式表: 操纵元素的Style样式属性:         background-color:style.backgroundColor         color:style.col ...

  5. 第一百一十六节,JavaScript,DOM操作样式

    JavaScript,DOM操作样式 一.操作样式 CSS作为(X)HTML的辅助,可以增强页面的显示效果.但不是每个浏览器都能支持最新的CSS能力.CSS的能力和DOM级别密切相关,所以我们有必要检 ...

  6. jQuery对标签、类样式、值、文档、DOM对象的操作

    jquery的标签属性操作 使用attr()方法对html标签属性进行操作,attr如果参数是一个参数,表示获取html标签的属性值,如果是两个参数则是设置标签属性名以及对象的属性值 .prop()适 ...

  7. javascript总结40:DOM中操作样式的两种方式

    1 DOM中操作样式的两种方式 1 通过元素的style属性 注意: 通过style属性设置样式时,css中要写单位的属性,在js代码中也要加单位 //html <div id="bo ...

  8. JQuery DOM操作(属性操作/样式操作/文档过滤)

    jQuery——入门(三)JQuery DOM操作(属性操作/样式操作/文档过滤) 一.DOM属性操作 1.属性 (1).attr() 方法 语法:$(selector).attr(name|prop ...

  9. 操作属性、操作样式 - DOM编程

    1. 操作属性 1.1 HTML 属性与 DOM 属性的对应 <div> <label for="username">User Name: </lab ...

随机推荐

  1. hdu 2196 Computer 树形dp模板题

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  2. 分层图+最短路算法 BZOJ 2763: [JLOI2011]飞行路线

    2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MB Description Alice和Bob现在要乘飞机旅行,他们选择了一家相 ...

  3. AD批量创建用户

    实验环境:Windows Server 2008R 2 由于测试需要,需要创建数百个用户,手动创建当然不可取,此时需要批量创建,操作记录如下 1 首先将要批量创建的人员信息导入到一个csv文件中,表中 ...

  4. JAVA中常用的二进制位操作

    一,计算某个正数的二进制表示法中 1 的个数 //求解正数的二进制表示法中的 1 的位数 private static int countBit(int num){ int count = 0; fo ...

  5. Codeforces Round 261 Div.2 E Pashmak and Graph --DAG上的DP

    题意:n个点,m条边,每条边有一个权值,找一条边数最多的边权严格递增的路径,输出路径长度. 解法:先将边权从小到大排序,然后从大到小遍历,dp[u]表示从u出发能够构成的严格递增路径的最大长度. dp ...

  6. 第11章 Windows线程池(1)_传统的Windows线程池

    第11章 Windows线程池 11.1 传统的Windows线程池及API (1)线程池中的几种底层线程 ①可变数量的长任务线程:WT_EXECUTELONGFUNCTION ②Timer线程:调用 ...

  7. oracle wm_concat(column)函数的使用

    oracle wm_concat(column)函数使我们经常会使用到的,下面就教您如何使用oraclewm_concat(column)函数实现字段合并,如果您对oracle wm_concat(c ...

  8. [ORACLE错误]ORA-00054:resource busy and acquire with nowait specified解决方法

    当某个数据库用户在数据库中插入.更新.删除一个表的数据,或者增加一个表的主键时或者表的索引时,常常会出现ora-00054:resource busy and acquire with nowait ...

  9. java9-1.类,抽象类,接口的综合小练习

    /* 教练和运动员案例(学生分析然后讲解) 乒乓球运动员和篮球运动员. 乒乓球教练和篮球教练. 为了出国交流,跟乒乓球相关的人员都需要学习英语. 请用所学知识: 分析,这个案例中有哪些抽象类,哪些接口 ...

  10. 分布式监控系统Zabbix-3.0.3-完整安装记录(4)-解决zabbix监控图中出现中文乱码问题

    之前部署了Zabbix-3.0.3监控系统,在安装数据库时已经将zabbix库设置了utf-8字符. 首先确定zabbix开启了中文支持功能:登录到zabbix服务器的数据目录下(前面部署的zabbi ...