定义: CSS对象模型是一组允许用JavaScript操纵CSS的API,他很像DOM,但针对的是CSS而不是HTML。它允许用户动态地读取和修改CSS样式
CSS的值是没有类型的,也就是使用String对象来表示
下面列一些常用的API
1. CSS.escape() 用于转义css里面的特殊字符
上面代码中,该元素的id
属性包含一个#
号,该字符在 CSS 选择器里面有特殊含义。不能直接写成document.querySelector('#foo#bar')
,只能写成document.querySelector('#foo\\#bar')
CSS.escape
方法就用来转义那些特殊字符。
document.querySelector('#' + CSS.escape('foo#bar'))
2. CSS.supports 返回一个布尔值,表示当前环境是否支持某一句CSS规则。
它的参数有两种写法,一种是第一个参数是属性名,第二个参数是属性值;另一种是整个参数就是一行完整的 CSS 语句。
// 第一种写法
CSS.supports('transform-origin', '5px') // true
// 第二种写法
CSS.supports('display: table-cell') // true
注意,第二种写法的参数结尾不能带有分号,否则结果不准确。
CSS.supports('display: table-cell;') // false
3. window.getComputedStyle() 返回浏览器计算后得到的最终规则。它接受一个节点对象作为参数,返回一个 CSSStyleDeclaration 实例
getComputedStyle
方法还可以接受第二个参数,表示当前元素的伪元素(比如:before
、:after
、:first-line
、:first-letter
等)。
注意
px
后缀),颜色是rgb(#, #, #)
或rgba(#, #, #, #)
格式。margin
属性的值,不能直接读,只能读marginLeft
、marginTop
等属性;再比如,font
属性也是不能直接读的,只能读font-size
等单个属性。styleObj['z-index']
;如果读取骆驼拼写法的 CSS 属性名,可以直接读取styleObj.zIndex
。cssText
属性无效,返回undefined
4. StyleSheet 接口
StyleSheet
接口代表网页的一张样式表,包括元素加载的样式表和
元素内嵌的样式表。
var sheets = document.styleSheets;
严格地说,StyleSheet
接口不仅包括网页样式表,还包括 XML 文档的样式表。所以,它有一个子类CSSStyleSheet
表示网页的 CSS 样式表。我们在网页里面拿到的样式表实例,实际上是CSSStyleSheet
的实例。这个子接口继承了StyleSheet
的所有属性和方法,并且定义了几个自己的属性。
StyleSheet.disabled 返回一个布尔值,表示该样式表是否处于禁用状态。手动设置disabled
属性为true
,等同于在元素里面,将这张样式表设为
alternate stylesheet
,即该样式表将不会生效。
Stylesheet.href 返回样式表的网址。对于内嵌样式表,该属性返回null
。该属性只读。
StyleSheet.media 属性返回一个类似数组的对象(MediaList
实例),成员是表示适用媒介的字符串。表示当前样式表是用于屏幕(screen),还是用于打印(print)或手持设备(handheld),或各种媒介都适用(all)。该属性只读,默认值是screen
。
document.styleSheets[0].media.mediaText // "all"
MediaList
实例的appendMedium
方法,用于增加媒介;deleteMedium
方法用于删除媒介。
document.styleSheets[0].media.appendMedium('handheld');
document.styleSheets[0].media.deleteMedium('print');
StyleSheet.title 属性返回样式表的title
属性。
StyleSheet.type 属性返回样式表的type
属性,通常是text/css
StyleSheet.parentStyleSheet CSS 的@import
命令允许在样式表中加载其他样式表。StyleSheet.parentStyleSheet
属性返回包含了当前样式表的那张样式表。如果当前样式表是顶层样式表,则该属性返回null
。
StyleSheet.ownerNode 属性返回StyleSheet
对象所在的 DOM 节点,通常是或
。对于那些由其他样式表引用的样式表,该属性为
null
。
CSSStyleSheet.cssRules 属性指向一个类似数组的对象(CSSRuleList
实例),里面每一个成员就是当前样式表的一条 CSS 规则。使用该规则的cssText
属性,可以得到 CSS 规则对应的字符串。
CSSStyleSheet.ownerRule 有些样式表是通过@import
规则输入的,它的ownerRule
属性会返回一个CSSRule
实例,代表那行@import
规则。如果当前样式表不是通过@import
引入的,ownerRule
属性返回null
。
网页添加样式表有两种方式。一种是添加一张内置样式表,即在文档中添加一个节点。
// 写法一
var style = document.createElement('style');
style.setAttribute('media', 'screen');
style.innerHTML = 'body{color:red}';
document.head.appendChild(style);
// 写法二
var style = (function () {
var style = document.createElement('style');
document.head.appendChild(style);
return style;
})();
style.sheet.insertRule('.foo{color:red;}', 0);
另一种是添加外部样式表,即在文档中添加一个节点,然后将
href
属性指向外部样式表的 URL。
var linkElm = document.createElement('link');
linkElm.setAttribute('rel', 'stylesheet');
linkElm.setAttribute('type', 'text/css');
linkElm.setAttribute('href', 'reset-min.css');
document.head.appendChild(linkElm);
CSSRuleList 接口是一个类似数组的对象,表示一组 CSS 规则,成员都是 CSSRule 实例。
获取 CSSRuleList 实例,一般是通过StyleSheet.cssRules
属性。
//
var myStyleSheet = document.getElementById('myStyle').sheet;
var crl = myStyleSheet.cssRules;
crl instanceof CSSRuleList // true
CSSRuleList 实例里面,每一条规则(CSSRule 实例)可以通过rules.item(index)
或者rules[index]
拿到。CSS 规则的条数通过rules.length
拿到。还是用上面的例子。
crl[0] instanceof CSSRule // true
crl.length // 2
注意,添加规则和删除规则不能在 CSSRuleList 实例操作,而要在它的父元素 StyleSheet 实例上,通过StyleSheet.insertRule()
和StyleSheet.deleteRule()
操作。
CSSStyleDeclaration 接口可以直接读写 CSS 的样式属性,不过,连词号需要变成骆驼拼写法。
var divStyle = document.querySelector('div').style;
divStyle.backgroundColor = 'red';//写
divStyle.backgroundColor // red 读
上面代码中,style
属性的值是一个 CSSStyleDeclaration 实例。这个对象所包含的属性与 CSS 规则一一对应,【一般属性带横线的要改成驼峰,但是如果是保留字,要前面加css 如:float -> cssFloat】
Element.style
返回的只是行内样式,并不是该元素的全部样式。通过样式表设置的样式,或者从父元素继承的样式,无法通过这个属性得到。元素的全部样式要通过window.getComputedStyle()
得到
a. CSSStyleDeclaration.cssText属性用来读写当前规则的所有样式声明文本。
var divStyle = document.querySelector('div').style;
divStyle.cssText = 'background-color: red;'
+ 'border: 1px solid black;'
+ 'height: 100px;'
b. CSSStyleDeclaration.length属性返回一个整数值,表示当前规则包含多少条样式声明。
// HTML 代码如下
//
document.getElementById('myDiv').style.length;// 3
c. CSSStyleDeclaration.parentRule属性返回当前规则所属的那个样式块(CSSRule 实例)。如果不存在所属的样式块,该属性返回null
。 //TODO
实例方法:
a. CSSStyleDeclaration.getPropertyPriority() 方法接受 CSS 样式的属性名作为参数,返回字符串,表示有没有设置important
优先级。如果有就返回important
,否则返回空字符串。
// HTML 代码为
//
var style = document.getElementById('myDiv').style;
style.margin // "10px"
style.getPropertyPriority('margin') // "important"
style.getPropertyPriority('color') // ""
b. CSSStyleDeclaration.getPropertyValue() 方法接受 CSS 样式属性名作为参数,返回一个字符串,表示该属性的属性值。
// HTML 代码为
//
var style = document.getElementById('myDiv').style;
style.margin // "10px"
style.getPropertyValue("margin") // "10px"
c. CSSStyleDeclaration.item()方法接受一个整数值作为参数,返回该位置的 CSS 属性名。
// HTML 代码为
//
var style = document.getElementById('myDiv').style;
style.item(0) // "color"
style.item(1) // "background-color"
d. CSSStyleDeclaration.removeProperty() 方法接受一个属性名作为参数,在 CSS 规则里面移除这个属性,返回这个属性原来的值。
// HTML 代码为
//
// 111
//
var style = document.getElementById('myDiv').style;
style.removeProperty('color') // 'red'
// HTML 代码变为
//
e. CSSStyleDeclaration.setProperty() 方法用来设置新的 CSS 属性。该方法没有返回值。
该方法可以接受三个参数。
- 第一个参数:属性名,该参数是必需的。
- 第二个参数:属性值,该参数可选。如果省略,则参数值默认为空字符串。
- 第三个参数:优先级,该参数可选。如果设置,唯一的合法值是
important
,表示 CSS 规则里面的!important
。 // HTML 代码为
//
// 111
//
var style = document.getElementById('myDiv').style;
style.setProperty('border', '1px solid blue');
检测浏览器是否支持某些css属性方法
function isPropertySupported(property) {
if (property in document.body.style) return true;
var prefixes = ['Moz', 'Webkit', 'O', 'ms', 'Khtml'];
var prefProperty = property.charAt(0).toUpperCase() + property.substr(1);
for(var i = 0; i < prefixes.length; i++){
if((prefixes[i] + prefProperty) in document.body.style) return true;
}
return false;
}
isPropertySupported('background-clip')
// true