首页 > 其他分享 >js_doucment.styleSheets获取StyleSheetList接口

js_doucment.styleSheets获取StyleSheetList接口

时间:2023-10-22 23:33:06浏览次数:41  
标签:console log StyleSheetList js styleSheets cssRules aStyleList oStyle1 const

  • 通过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属性, 可以获取到该选择器样式表中有多少条属性, 但是它并不准确, paddingmargin属性会被识别为4条
  • type

    • 判断这个样式规则对象是哪中类型, 比如普通的选择器样式返回1, @keyframes的样式会返回7
  • cssText

    • 返回该规则对象下的css的字符串形式, 比如
      • .test { width: 200px; height: 200px; border-radius: 50%; background-color: rgb(170, 17, 68); }

添加样式与删除样式

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类数组下的deleteRuleinsertRule方法来删除或新增

标签:console,log,StyleSheetList,js,styleSheets,cssRules,aStyleList,oStyle1,const
From: https://www.cnblogs.com/isAyi/p/17781388.html

相关文章

  • 【2023最新教程】有道翻译js 超详细!!!
    目录前言确定加密字段破解加密字段加密字段实现破解返回值跟踪堆栈找到解密后的返回值函数实现解密返回值语言转换完整代码效果展示前言有道翻译两个加密第一个是表单的sign用MD5加密可以点击目录的加密字段实现直接跳转第二个是返回值AES加密,而且AES的密匙他还用md5加......
  • 一键解决json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
    json.decoder.JSONDecodeError:Expectingvalue:line1column1(char0)文章目录问题描述解决思路解决方法问题描述json.decoder.JSONDecodeError:Expectingvalue:line1column1(char0)解决思路JSONDecodeError是指在使用json.loads()方法时,解析JSONJSONDecodeError是......
  • cube.js node addon 开发使用的框架neon 简单说明
    cube.jsnodeaddon的开发使用了neon框架,基于neon开发nodeaddon的好处是简单,而且开发上比较类似node的开发模式但是缺点也有不少,比如napi-rs支持方便的typescript类型定义生成,可以方便我们使用,对于neon这个issue大家已经提议很久了,应该是实现上问题比较多,官方还是没有实......
  • JS加密/解密之闭包的运用
    深入探讨JavaScript闭包的演变与应用摘要:本文将深入探讨JavaScript闭包的概念、特性以及其在实际开发中的应用。我们将从闭包的起源开始,探讨它在JavaScript编程中的重要性,并通过实例展示闭包在不同场景下的灵活应用。引言JavaScript作为一种高度灵活的编程语言,一直以其独特的特性......
  • PostgreSQL 不支持 union 查询 json
    当在使用PostgreSQL数据库查询数据的时候,因为查询出来的列中包含格式为json的字段进行union报错了,该操作不支持json类型,使用unionall也是同样错误最后查阅资料得出,需要转换为jsonb才行,需要使用函数to_jsonb(你的json字段),之后,union和unionall就都可以了json与jsonbPostgre......
  • 基于JS的大文件分片
    项目需要上传超大文件,后台为DJANGO,不能直接用H5的FILEAPI来POST,所以采用slice分片在分片后为BLOB不能直接传,bolb转file有些浏览器又有支持问题。所以做一些转换,转uint8,uint16,uint32,django的后台处理起来都比较烦所以试着用base64装入json,很容易搞定。具体思路:1.读入文件路径......
  • js实现大文件分片上传的方法
    借助js的Blob对象FormData对象可以实现大文件分片上传的功能,关于Blob和FormData的具体使用方法可以到如下地址去查看FormData对象的使用Blob对象的使用以下是实现代码,本例中后端代码使用php来实现,只是演示基本功能,具体一些文件验证逻辑先忽略。前段代码:<!DOCTYPEhtml><htmlla......
  • 原生JS实现大文件分片
    为了实现断点续传,研究了js的文件分片实现断点续传的步骤文件分片按顺序上传,上传第一个后文件名md5加密保存到rdis的key,value保存为上传的index,然后下面每次上传成功就更新对应的value,保持最新的第一次上传时,查询redis是否已经存在相同的key,如果相同就跳到保存的index的下一......
  • Vue.js框架:vue3版本引入使用element-ui
    一、引入element-pluselement-ui只支持vue2,vue3需要引入element-plus进行使用,两个分别对应vue2和3两个版本,各自独立,无法跨级兼容。地址:https://element-plus.gitee.io/在vue3项目终端里使用以下命令引入该依赖:npminstallelement-plus--save二、修......
  • nodejs 安装升级解决导入es6语法兼容性问题??=
    nodejs无法识别??==的问题是因为nodejs的版本太老,而引入的模块中包含了新的语法,例如空值运算符??=。这样nodejs就会报错。解决方法大概有三个1,找到对应老版本的模块使用。2,修改模块中不兼容的语法。3,更新nodejs。三个方法中前两个显然会面临大量工作。作为懒人的我,选择了方......