DOM与CSS样式表

时间:2022-12-15 08:39:45

在前文 《DOM与元素节点内联样式》中我们了解了用 DOM 提供的接口操作元素节点内联样式的方法,今天我们来学习一下如何用 DOM 操作 CSS 样式表。

CSS 样式表概况


通过使用 HTMLLinkElement 节点引入外部样式表,或者使用 HTMLStyleElement 节点来定义内联样式表,都可以添加样式表到 HTML 文档。在如下 HTML 文档中,这两种 Element 节点都在 DOM 中,并且我们可以验证哪个构造器构造了这些节点。

<link id='linkElement' href='h.css' rel='stylesheet' type='text/css'>
<style id='styleElement'>
  div {
    background-color: black;
  }
</style>

<script>
  // 输出 function HTMLLinkElement() { [native code] }
  console.log(document.querySelector('#linkElement').constructor);

  // 输出 function HTMLStyleElement() { [native code] }
  console.log(document.querySelector('#styleElement').constructor);
</script>

一有样式表添加到 HTML 文档中,它即表示为 CSSStyleSheet 对象。样式表里每条 CSS 规则(如 div {background-color: black;})都表示为一个 CSSStyleRule 对象。在如下代码中,我们可以验证是哪个构造器构造了样式表中的每个 CSS 规则。

<link id='linkElement' href='h.css' rel='stylesheet' type='text/css'>
<style id='styleElement'>
  div {
    background-color: black;
  }
</style>

<script>
  // 输出 function CSSStyleSheet() { [native code] }
  console.log(document.querySelector('#linkElement').sheet.constructor);

  // 输出 function CSSStyleRule() { [native code] }
  console.log(document.querySelector('#styleElement').sheet.cssRules[0].constructor);
</script>

记住,选取引入样式表的元素(即 <link><style> )与访问表示样式表自身的实际对象(CSSStyleSheet)是不同的。

CSSStyleSheet 对象


在上一小节中,我们知道了如何获取一个 CSSStyleSheet 对象的引用(例如 document.querySelector('#linkElement').sheet),而 document.styleSheets 则提供了一个包含 HTML 文档中所有样式表对象(即 CSSStyleSheet 对象)列表的访问方式,包括显式链接(即<link>)和内嵌(即<style>)。

<link id='linkElement' href='h.css' rel='stylesheet' type='text/css'>
<style id='styleElement'>
  div {
    background-color: black;
  }
</style>

<script>
  console.log(document.styleSheets.length); // 2
  console.log(document.styleSheets[0]); // <link>
  console.log(document.styleSheets[1]); // <style>
</script>

我们可以将 CSSStyleSheet 对象所拥有的属性和方法打印出来看看:

console.log(document.styleSheets[0]); // <link>
console.log(document.styleSheets[1]); // <style>

// <link>
cssRules: null
disabled: false
href: "file:///C:/Users/wwwy/Desktop/h.css"
media: MediaList
ownerNode: link#linkElement
ownerRule: null
parentStyleSheet: null
rules: null
title: null
type: "text/css"

// <style>
cssRules: CSSRuleList
disabled: false
href: null
media: MediaList
ownerNode: style#styleElement
ownerRule: null
parentStyleSheet: null
rules: CSSRuleList
title: null
type: "text/css"

我们对比后发现,内联样式表和外部引入的样式表是有区别的,最主要的区别就是内联样式表能用 cssRules 属性获取具体的 css 样式代码,继而能对它们进行操作,而外部引入的样式表则不行,仔细想想也有一定道理,毕竟外部的文件,我们怎么能随意对它们进行操作呢?接下去介绍几个重要的属性:

  1. disabled: 表示样式表是否被禁用的布尔值
  2. cssRules: 样式表中包含的样式规则的集合。IE 不支持这个属性,但有一个类似的 rules 属性

CSSStyleRule 概况


很显然,CSSStyleRule 才是本文的重点。CSSStyleRule 代表了样式表中所含的每条 CSS 规则。基本上,CSSStyleRule 即附加到某个选择器的 CSS 属性与值的接口。

<style id='styleElement'>
  div {
    background-color: black;
    width: 100px;
    height: 100px;
  }
</style>

<script>
  var sSheet = document.querySelector('#styleElement').sheet;

  // 输出 div { background-color: black; width: 100px; height: 100px; }
  console.log(sSheet.cssRules[0].cssText);
</script>

我们来看看 CSSStyleRule有哪些属性和方法:

<style id='styleElement'>
  div {
    background-color: black;
    width: 100px;
    height: 100px;
  }
</style>

<script>
  var sSheet = document.querySelector('#styleElement').sheet;

  console.log(sSheet.cssRules[0]);

  // cssText: "div { background-color: black; width: 100px; height: 100px; }"
  // parentRule: null
  // parentStyleSheet: CSSStyleSheet
  // selectorText: "div"
  // style: CSSStyleDeclaration
  // type: 1
</script>

CSSStyleRule之操作样式


当然,对于开发人员来说,如何用 CSSStyleRule 来获取和操作样式才是最重要的。

  • 使用 insertRule() 和 deleteRule() 来插入与删除样式表中的 CSS 规则

insertRule() 和 deleteRule() 方法提供了以编程方式操作样式表中 CSS 规则的能力。

<style id='styleElement'>
  div {
    background-color: black;
    width: 100px;
    height: 100px;
  }
</style>

<script>
  var sSheet = document.querySelector('#styleElement').sheet;

  // 输出 div { background-color: black; width: 100px; height: 100px; }
  console.log(sSheet.cssRules[0].cssText);

  // 在行内样式表中索引0的位置添加新规则
  // 原来该位置的行内样式被移到了索引为1的位置
  sSheet.insertRule('p{color:red}', 0);

  console.log(sSheet.cssRules.length); // 2

  // 输出 p { color: red; }
  console.log(sSheet.cssRules[0].cssText);

  // 删除添加的规则
  sSheet.deleteRule(0);

  console.log(sSheet.cssRules.length); // 1

  // 输出 div { background-color: black; width: 100px; height: 100px; }
  console.log(sSheet.cssRules[0].cssText);
</script>
  • 使用 .style 属性修改 CSSStyleRule 的值

正如我们有 .style 属性用于操作元素节点的内联样式,我们在 CSSStyleRule 对象上也有 .style 属性编排了在样式表上做相同的操作。

<style id='styleElement'>
  div {
    background-color: black;
    width: 100px;
    height: 100px;
  }
</style>

<script>
  var sSheet = document.querySelector('#styleElement').sheet;

  sSheet.cssRules[0].style.width = '200px';

  // 输出 div { background-color: black; width: 200px; height: 100px; }
  console.log(sSheet.cssRules[0].cssText);
</script>
  • 创建新的内联样式表

要在 HTML 页面加载完毕后打造一个新的样式表,我们只能创建一个新的 节点。

var styleElem = document.createElement('style');
styleElem.innerHTML = 'body{color:red}';
document.querySelector('head').appendChild(styleElem);
  • 以编程方式添加外部样式表到 HTML 文档

要以编程方式添加 CSS 文件到 HTML 文档,你需要创建一个 <link> 元素节点,给它合适的属性值,然后将它添加到 DOM 树。

var linkElem = document.createElement('link');
linkElem.setAttribute('rel', 'stylesheet');
linkElem.setAttribute('type', 'text/css');
linkElem.setAttribute('id', 'linkElement');
linkElem.setAttribute('href', '//..');

document.head.appendChild(linkElem);

本文参考文献:

  1. 《Javascript高级程序设计》
  2. 《DOM 启蒙》

DOM与CSS样式表的更多相关文章

  1. 一个DOM元素同时拥有多个类名时的样式产生冲突时 属性取决于css样式表中后读取到的属性

    如果一个DOM元素包含多个类名,其中的两个类名的属性产生冲突,并不是根据htnl中类名的顺序来决定DOM元素的属性, 而是根据css样式中的顺序来决定DOM元素的属性,它取决于css样式表中后读取到的 ...

  2. Chrome开发工具Elements面板&lpar;编辑DOM和CSS样式&rpar;详解

    Element 译为“元素”,Element 面板可以让我们动态查看和编辑DOM节点和CSS样式表,并且立即生效,避免了频繁切换浏览器和编辑器的麻烦. 我们可以使用Element面板来查看源代码,它不 ...

  3. CSS样式表继承详解

    最近在恶补css样式表的基础知识.上次研究了css样式表之冲突问题详解 .这次是对 css 继承 特性的学习. 什么是css 继承?要想了解css样式表的继承,我们先从文档树(HTML DOM)开始. ...

  4. JavaScript访问修改css样式表

    1.访问元素中style属性的css样式 可以根据属性的ID或name标签利用dom操作直接访问到内部的css样式,直接使用style对象访问 <div id="myid" ...

  5. 深度理解CSS样式表,内有彩蛋&period;&period;&period;&period;

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. CSS样式表

    CSS样式及属性 样式标的基本概念 样式表的分类 1.内联样式表 和html联合显示,控制精确,但可重用性差,冗余多. 例:<p style="font-size:14px;&quot ...

  7. JS 控制CSS样式表

    JS控制CSS所使用的方法: <style> .rule{ display: none; } </style> 你想要改变把他的display属性由none改为inline.  ...

  8. HTML基础(三)——css样式表

    CSS(Cascading Style Sheet,叠层样式表),作用是美化HTML网页. /*注释区域*/此为注释语法 一.样式表 (一)样式表的分类 1.内联样式表 和HTML联合显示,控制精确, ...

  9. 一起学HTML基础-CSS样式表-基本概念、分类、选择器

    一.基本概念: CSS  (Cascading Style Sheets)层叠样式表,是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言. ...

随机推荐

  1. android源码在线查看

    http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/

  2. 分享9款极具创意的HTML5&sol;CSS3进度条动画

    1.HTML5/CSS3图片加载进度条 可切换多主题 今天要分享的这款HTML5/CSS3进度条模拟了真实的图片加载场景,插件会默认去从服务器下载几张比较大的图片,然后让该进度条展现当前读取图片的进度 ...

  3. ASP&period;NET MVC:多语言的三种技术处理策略

    ASP.NET MVC:多语言的三种技术处理策略 背景 本文介绍了多语言的三种技术处理策略,每种策略对应一种场景,这三种场景是: 多语言资源信息只被.NET使用. 多语言资源信息只被Javascrip ...

  4. &lbrack;妙味JS基础&rsqb;第五课:函数传参、重用、价格计算

    知识点总结 函数传参,传的参数=数据类型(即:数值.字符串.布尔.函数.对象.未定义) 通过传参来重用代码 1.尽量保证 HTML 代码结构一致,可以通过父级选取子元素 2.把核心主程序实现,用函数包 ...

  5. Swift try try&excl; try&quest;使用和区别

    Swift try try! try?使用和区别 一.异常处理try catch的使用 1. swift异常处理 历史由来 Swift1.0版本 Cocoa Touch 的 NSError ,Swif ...

  6. Linux部署Java环境

    一. yum安装jdk (1) 搜索jdk安装包 yum search java|grep jdk (2) 下载jdk1.8,下载之后默认的目录为: /usr/lib/jvm/ yum install ...

  7. BZOJ4205卡牌配对——最大流&plus;建图优化

    题目描述 现在有一种卡牌游戏,每张卡牌上有三个属性值:A,B,C.把卡牌分为X,Y两类,分别有n1,n2张. 两张卡牌能够配对,当且仅当,存在至多一项属性值使得两张卡牌该项属性值互质,且两张卡牌类别不 ...

  8. LOJ550 Matching 构造

    传送门 题意:$T$组询问,每组询问给出一个$N \times M$的网格和一个$K$,每一次你可以消除网格中的两个块,如果两个块的曼哈顿距离小于$K$,则不会得到分数,否则得到等同于它们曼哈顿距离的 ...

  9. post请求数据量过大,提交失败

    HttpRuntimeSection.MaxRequestLength 属性,请求的最大大小(以千字节为单位). 默认大小为 4096 KB (4 MB) <system.web> &lt ...

  10. E&period; Intersection of Permutations

    题意:给两个排列,2种操作1,查询两个区间a和b一样的值个数,2,交换b的两个值 题解:树套树,先把a变成1到n的排列,对b做相同的变换,然后问题就变成了查询区间lb,rb中la到ra的个数,带修改可 ...