DOM1级主要定义的还是HTML的地层结构,DOM2和DOM3级则在这个结构的基础上引入了更多的交互能力。为此,DOM2和DOM3级分为许多模块,分别描述了DOM的某个非常具体的子集。
要确定浏览器是否支持DOM2级定义的CSS能力,可以使用下列代码:
var supportsDOM2CSS = document.implementation.hasFeature("CSS","2.0");
var supportsDOM2CSS2 = document.implementation.hasFeature("CSS2","2.0");
任何支持style特性的HTML元素在js中都有一个对应的style属性。这个style对象是CSSStyleDeclaration的实例,包含着通过元素的style特性指定的所有样式信息,但不包含与外部样式表或嵌入样式表经层叠而来的样式。
在style特性中指定的任何CSS属性都将表现为这个style对象的相应属性。
对于使用短划线的CSS属性(如font-family),必须将其转换成驼峰大小写形式。
多数情况下,都可以通过简单的转换属性名的格式来实现转换。但有一个不能直接转换的CSS属性:float。由于float是Javascript的保留字,因此不能用作属性名。规范规定样式对象上相应的属性名应该是cssFloat。
只要取得一个有效的DOM元素的引用,就可以随时使用Javascript为其设置样式。
var myDiv = document.getElementById("myDiv");
//设置背景颜色
myDiv.style.backgroundColor = "red";
//改变大小
myDiv.style.width = "100px";
myDiv.style.height = "200px";
//指定边框
myDiv.style.border = "1px solid black";
在以这种方式改变样式时,元素的外观会自动更新。
在标准模式下,所有度量值都必须指定一个度量单位,不然会被忽略。
通过style对象同样可以取得在style特性中指定的样式。
如果没有为元素设置style特性,那么style对象中可能会包含一些默认的值,但这些值并不能准确地反映该元素的样式信息。
DOM2级样式还为style对象定义了一些属性和方法。
myDiv.style.cssText = "width:25px;height:100px;background-color:green";
设置cssText是为元素应用多项变化最快捷的方式,因为可以一次性的应用所有变化。
使用length和item(),可以对元素中的CSS属性进行迭代。也可以使用方括号语法来代替item()来取得特定位置的CSS属性:
for(var i=0,len = myDiv.style.length;ii++){
alert(myDiv.style[i]); //或者myDiv.style.item(i);
}
无论使用方括号还是item(),都可以取得CSS属性名(“background-color”而不是“backgroundColor”)。
可以利用属性名取出属性值
var prop,value,i,len;
for(var i=0,len = myDiv.style.length;i//或者myDiv.style.item(i);
value = myDiv.style.getPropertyValue(prop);
alert(prop+":"+value);
}
getPropertyValue方法取得的始终都是CSS属性值的字符串表示。如果需要更多信息,可以使用下面的getPropertyCSSValue方法。
返回一个包含两个属性的CSSValue对象,这两个属性分别是:cssText和cssValueType。其中cssText属性的值与getPropertyValue()返回的值相同。而cssValueType则是一个数值常量,表示值的类型:0表示继承的值,1表示基本的值,2表示值列表,3表示自定义的值。
但在实际开发中,getPropertyCSSValue的适用比getPropertyValue少得多。
虽然style对象能够提供支持style特性的任何元素的样式信息,但它不包含那些从其他样式表层叠而来并影响到当前元素的样式信息。因此DOM2级央视提供了下面的这个方法:
但是在所有浏览器中,所有计算的样式都是只读的。不能修改计算后样式对象中的css属性。
此外,计算后的样式也包含属于浏览器内部样式表的样式信息,因此任何具有默认值的CSS属性值都会表现在计算后的样式中。
CSSStyleSheet类型表示的是样式表,包括通过< link>元素包含的样式表和在< style>元素中定义的样式表。
使用下面的代码可以确定浏览器是否支持DOM2级样式表:
var supportsDOM2StyleSheet = document.implementation.hasFeature("StyleSheets","2.0");
CSSStyleSheet继承自StyleSheet,后者可以作为一个基础接口来定义非CSS样式表。从StyleSheet接口继承来的属性如下:
type:表示样式表类型的字符串。对CSS样式表而言,是“type/css”
除了disabled属性之外,其他属性都是只读的。在支持以上所有这些属性的基础上,CSSStyleSheet类型还支持下列属性和方法:
应用于文档的所有样式表是通过document.styleSheets集合来表示的。通过这个集合的length属性可以获知文档中样式表的数量,通过方括号语法或item()则可以访问每一个样式表。
CSSRule对象表示样式表中的每一条规则。包含以下属性:
其中最常用的三个属性是cssText、selectorText和style。
cssText属性与style.cssText属性类似,但前者包含选择符文本和围绕样式信息的花括号,后者只包含样式信息。
此外,cssText是只读的,style.cssText可以被重写。
偏移量,包括元素在屏幕上占用的所有可见的空间。
元素的可见大小由其高度、宽度确定,包括所有内边距、滚动条和边框大小(不包括外边框)。
通过下列4个属性可以取得元素的偏移量。
其中,offsetLeft和offsetTop属性与包含元素有关,包含元素的引用保存在offsetParent属性中。
要想知道某个元素在页面上的偏移量,将这个元素的offsetLeft和offsetTop与其offsetParent的相同属性相加,如此循环至根元素,就可以得到一个基本准确的值。
所有这些偏移量属性都只是只读的,而且每次访问它们都需要重新计算。因此,应该尽量避免重复访问这些属性;如果需要重复使用其中某些属性的值,可以将它们保存在局部变量中,以提高性能。
指的是元素内容及其内边距所占据的空间大小。
从字面上看,客户区大小就是元素内部的空间大小,因此滚动条占用的空间不计算在内。
最常用到这些属性的情况,就是确定浏览器视口大小。可以使用document.documentElement或document.body的clientWidth和clientHeight。
与偏移量类似,客户区大小也是只读的,也是每次访问都要重新计算的。
指的是包含滚动内容的大小。
以下是4个与滚动大小相关的属性:
scrollWidth与scrollHeight主要用于确定元素内容的实际大小。如,带有滚动条的页面总高度就是document.documentElement.scrollHeight;
对于不包含滚动条的页面而言,scrollWidth和scrollHeight,与clientWidth和clientHeight之间的关系并不十分清晰,浏览器之间存在差异。
在确定文档的总高度时,必须取得scrollWidth/clientWidth和scrollHeight/clientHeight中的最大值,才能保证在跨浏览器的环境下得到精确的结果。
var docHeight = Math.max(document.documentElement.scrollHeight,document.documentElement.clientHeight);
var docWidth = Math.max(document.documentElement.scrollWidth,document.documentElement.clientWidth);
而通过scrollLeft和scrollTop既可以确定元素当前滚动的状态,也可以设置元素的滚动位置。
这两个属性都可以设置,因此将元素的scrollLeft和scrollTop设置为0,就可以重置元素的滚动位置。
下面这个函数会检测元素是否位于顶部,如果不是就让其滚回顶部。
function() scrollToTop(element){
if(element.scrollTop!=0){
element.scrollTop = 0;
}
}
这个方法会返回一个矩形对象,包含4个属性,left,top,right,bottom。
这些属性给出了元素在页面中相对于视口的位置,但浏览器的实现稍有不同。