js_doucment.styleSheets获取StyleSheetList接口
-
通过
document.styleSheets
可以获取到一个StyleSheetList接口-
const aStyleList = document.styleSheets console.log(aStyleList.constructor.name) // StyleSheetList console.log(Object.prototype.toString.call(aStyleList)) // [object StyleSheetList] console.log(Array.isArray(aStyleList)) // false
-
StyleSheetList接口表示CSSTyleSheet对象的列表。Document.styleSheets可以返回此对象的实例。 它是一个类似数组的对象,但不能使用array方法进行迭代。然而,它可以在其索引上的标准for循环中迭代,或者转换为数组。
-
-
类似数组, 可以使用
.length
来获取样式表的数据, 每一个数据对应一个style标签内写入或者link标签所引入的样式对象( CSSStyleSheet对象 )-
console.log(aStyleList.length) // 3
-
Array.prototype.forEach.call(aStyleList, styleItem => { console.log(styleItem) }) // CSSStyleSheet // CSSStyleSheet // CSSStyleSheet
-
-
类似数组, 可以使用
[index]
来直接获取对应的 ,.item([index])
来获取对应的CSSStyleSheet对象-
console.log(aStyleList.item(0) === aStyleList[0]) // true
-
CSSStyleSheet对象
-
StyleSheetList类数组中的每一个组成项都是CSSStyleSheet对象
-
Array.prototype.forEach.call(aStyleList, styleItem => { console.log(styleItem.constructor.name) // CSSStyleSheet console.log(Object.prototype.toString.call(styleItem)) // [object CSSStyleSheet] console.log(Object.prototype.isPrototypeOf(styleItem)) // true })
-
-
属性组成
-
const oStyle1 = aStyleList.item(0) console.log(Object.keys(oStyle1)) // [] ,表示不存在可枚举的私有属性 console.log(Object.getOwnPropertyNames(oStyle1)) // [] ,表示不存在可枚举或不可枚举的私有属性
-
let arr = [] for (const prop in oStyle1) { arr.push(prop) } console.log(arr) // ['ownerRule', 'cssRules', 'rules', 'addRule', 'deleteRule', 'insertRule', 'removeRule', 'replace', 'replaceSync', 'type', 'href', 'ownerNode', 'parentStyleSheet', 'title', 'media', 'disabled']
-
CSSStyleSheet对象的部分属性与方法说明
for (const prop in oStyle1) {
// arr.push(prop)
console.group(prop)
try {
console.log(oStyle1[prop])
} catch (err) {
console.log(err)
}
console.groupEnd(prop)
}
-
ownerRule
- 如果使用@import规则将此样式表导入到文档中,ownerRule属性将返回相应的CSSImportRule;否则,此属性的值为null。
-
cssRules
-
CSSRuleList表示只读CSSRule对象的有序集合。 虽然CSSRuleList对象是只读的,不能直接修改,但它被视为活动对象,因为内容可能会随着时间的推移而更改。 要编辑CSSRule对象返回的底层规则,请使用CSSStyleSheet.insertRule()和CSSStyleSheet.deleteRule()。 接口没有构造函数。CSSRuleList的实例由CSSStyleSheet.cssRules和CSSKeyframesRule.cssRules返回。
-
const oStyle1 = aStyleList.item(0) console.log(oStyle1.cssRules.constructor.name) // CSSRuleList console.log(Array.isArray(oStyle1.cssRules)) // false console.log(oStyle1.cssRules.item(0)===oStyle1.cssRules[0]) // true console.log(Object.prototype.toString.call(oStyle1.cssRules)) // [object CSSRuleList] console.log(Object.keys(oStyle1.cssRules)) // ['0', '1', '2', '3', '4', '5', '6'] console.log(Object.getOwnPropertyNames(oStyle1.cssRules)) // ['0', '1', '2', '3', '4', '5', '6'] console.log(oStyle1.cssRules[0].constructor.name) // CSSStyleRule
-
如上代码所示, cssRules返回一个类数组CSSRuleList, 通过
.item([index])
或者[index]
来获取组成项, 每项都是一个 CSSStyleRule对象
-
-
href
- 如果是
<link>
标签引入的话那么就是link的href属性的值,style
标签返回null
- 如果是
cssRules属性
const aStyleList = document.styleSheets
const oStyle1 = aStyleList.item(1)
const oCssRules = oStyle1.cssRules[0]
console.log(Object.keys(oCssRules)) // []
console.log(Object.getOwnPropertyNames(oCssRules)) // []
console.log(oCssRules.constructor.name) // CSSStyleRule
let arr = []
for (const prop in oCssRules) {
arr.push(prop)
console.group(prop)
console.log(oCssRules[prop])
console.groupEnd(prop)
}
console.log(arr) // ['selectorText', 'style', 'styleMap', 'cssRules', 'deleteRule', 'insertRule', 'type', 'cssText', 'parentRule', 'parentStyleSheet', 'STYLE_RULE', 'CHARSET_RULE', 'IMPORT_RULE', 'MEDIA_RULE', 'FONT_FACE_RULE', 'PAGE_RULE', 'NAMESPACE_RULE', 'KEYFRAMES_RULE', 'KEYFRAME_RULE', 'COUNTER_STYLE_RULE', 'FONT_FEATURE_VALUES_RULE', 'SUPPORTS_RULE']
-
selectorText
- 返回选择器的字符串, 比如
.test
- 返回选择器的字符串, 比如
-
style
-
返回一个CSSStyleDeclaration 对象, 其属性包含大量css属性名, 可以通过
.
语法获取到对设置的对应的属性值; 如果该属性没有被设置, 那么返回空字符串 -
console.log(oCssRules.style.width) // 200px
-
-
styleMap
- 下属有一个
size
属性, 可以获取到该选择器样式表中有多少条属性, 但是它并不准确,padding
与margin
属性会被识别为4条
- 下属有一个
-
type
- 判断这个样式规则对象是哪中类型, 比如普通的选择器样式返回1, @keyframes的样式会返回7
-
cssText
- 返回该规则对象下的css的字符串形式, 比如
.test { width: 200px; height: 200px; border-radius: 50%; background-color: rgb(170, 17, 68); }
- 返回该规则对象下的css的字符串形式, 比如
添加样式与删除样式
deleteRule
- 接收一个序数数字, 将对应的cssRule对象从cssRuleList中删除
const aStyleList = document.styleSheets
const oStyle1 = aStyleList.item(1)
oStyle1.deleteRule(0) // 调用deleteRule方法, 传入在cssRuleList数组中的序数, 删除后DOM不再适配对应的样式, 但是样式本身还保存在html文本中
insertRule
- 接收两个值, 一个是样式的完整字符串, 另一个是要插入的位置序数
const aStyleList = document.styleSheets
const oStyle1 = aStyleList.item(1)
let styleStr = `.test1{width:100px;height:100px;background-color:#cc4;border-radius:50%;}`
oStyle1.insertRule(styleStr)
总结
- 每个选择器样式组成一个cssRule对象
- 每个
<style>
与<link>
下的所有的cssRule对象组成一个cssRuleList类数组 - 多个cssRuleList类数组组成了一个StyleSheetList类数组, document.document.styleSheets获取StyleSheetList类数组
- cssRule对象中selectorText获取选择器, style属性获取样式对象, type判断是什么类型的样式, cssText返回完整的样式文本
- cssRuleList类数组下的
deleteRule
与insertRule
方法来删除或新增