From f7b28cf49ab01a724a2847dc1e219d19c7b4036b Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Fri, 11 May 2018 21:39:36 +0800 Subject: [PATCH] 14 --- 14.md | 171 +++++++++++++++++++++++++++------------------------ img/14-0.jpg | Bin 0 -> 28971 bytes img/14-1.svg | 23 +++++++ img/14-2.svg | 36 +++++++++++ img/14-3.svg | 25 ++++++++ img/14-4.svg | 11 ++++ 6 files changed, 186 insertions(+), 80 deletions(-) create mode 100644 img/14-0.jpg create mode 100644 img/14-1.svg create mode 100644 img/14-2.svg create mode 100644 img/14-3.svg create mode 100644 img/14-4.svg diff --git a/14.md b/14.md index 98837ca..94681b4 100644 --- a/14.md +++ b/14.md @@ -1,16 +1,28 @@ ## 十四、文档对象模型 +> 原文:[The Document Object Model](https://eloquentjavascript.net/14_dom.html) +> +> 译者:[飞龙](https://github.com/wizardforcel) +> +> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) +> +> 自豪地采用[谷歌翻译](https://translate.google.cn/) +> +> 部分参考了[《JavaScript 编程精解(第 2 版)》](https://book.douban.com/subject/26707144/) + > Too bad! Same old story! Once you've finished building your house you notice you've accidentally learned something that you really should have known—before you started. > > Friedrich Nietzsche,《Beyond Good and Evil》 -当你在浏览器中打开网页时,浏览器会接收网页的HTML文本并进行解析,其解析方式与第11章中介绍的解析器非常相似。浏览器构建文档结构的模型,并使用该模型在屏幕上绘制页面。 +![](img/14-0.jpg) -JavaScript在其沙箱中提供了将文本转换成文档对象模型的功能。它是你可以读取或者修改的数据结构。模型是一个所见即所得的数据结构,改变模型会使得屏幕上的页面产生相应变化。 +当你在浏览器中打开网页时,浏览器会接收网页的 HTML 文本并进行解析,其解析方式与第 11 章中介绍的解析器非常相似。浏览器构建文档结构的模型,并使用该模型在屏幕上绘制页面。 + +JavaScript 在其沙箱中提供了将文本转换成文档对象模型的功能。它是你可以读取或者修改的数据结构。模型是一个所见即所得的数据结构,改变模型会使得屏幕上的页面产生相应变化。 ## 文档结构 -你可以将HTML文件想象成一系列嵌套的箱子。诸如<body>和</body>之类的标签会将其他标签包围起来,而包含在内部的标签也可以包含其他的标签和文本。这里给出上一章中已经介绍过的示例文件。 +你可以将 HTML 文件想象成一系列嵌套的箱子。诸如``和``之类的标签会将其他标签包围起来,而包含在内部的标签也可以包含其他的标签和文本。这里给出上一章中已经介绍过的示例文件。 ```html @@ -29,55 +41,55 @@ JavaScript在其沙箱中提供了将文本转换成文档对象模型的功能 该页面结构如下所示。 -![](../Images/00374.jpeg) +![](img/14-1.svg) -浏览器使用与该形状对应的数据结构来表示文档。每个盒子都是一个对象,我们可以和这些对象交互,找出其中包含的盒子与文本。我们将这种表示方式称为文档对象模型(Document Object Model),或简称DOM。 +浏览器使用与该形状对应的数据结构来表示文档。每个盒子都是一个对象,我们可以和这些对象交互,找出其中包含的盒子与文本。我们将这种表示方式称为文档对象模型(Document Object Model),或简称 DOM。 -我们可以通过全局绑定document来访问这些对象。该对象的documentElement属性引用了表示<html>标签的对象。由于每个 HTML 文档都有一个头部和一个主体,它还具有`head`和`body`属性,指向这些元素。 +我们可以通过全局绑定`document`来访问这些对象。该对象的`documentElement`属性引用了``标签对象。由于每个 HTML 文档都有一个头部和一个主体,它还具有`head`和`body`属性,指向这些元素。 ## 树 -回想一下第12章中提到的语法树。其结构与浏览器文档的结构极为相似。每个节点可以使用children引用其他节点,而每个子节点又有各自的children。其形状是一种典型的嵌套结构,每个元素可以包含与其自身相似的子元素。 +回想一下第 12 章中提到的语法树。其结构与浏览器文档的结构极为相似。每个节点使用`children`引用其他节点,而每个子节点又有各自的`children`。其形状是一种典型的嵌套结构,每个元素可以包含与其自身相似的子元素。 -如果一个数据结构有分支结构,而且没有任何回环(一个节点不能直接或间接包含自身),并且有一个单一、定义明确的“根节点”,那么我们将这种数据结构称之为树。就DOM来讲,document.documentElement就是其根节点。 +如果一个数据结构有分支结构,而且没有任何环路(一个节点不能直接或间接包含自身),并且有一个单一、定义明确的“根节点”,那么我们将这种数据结构称之为树。就 DOM 来讲,`document.documentElement`就是其根节点。 -在计算机科学中,树的应用极为广泛。除了表现诸如HTML文档或程序之类的递归结构,树还可以用于维持数据的有序集合,因为在树中寻找或插入一个节点往往比在数组中更高效。 +在计算机科学中,树的应用极为广泛。除了表现诸如 HTML 文档或程序之类的递归结构,树还可以用于维持数据的有序集合,因为在树中寻找或插入一个节点往往比在数组中更高效。 -一棵典型的树有不同类型的节点。Egg 语言的语法树有标识符、值和应用节点。应用节点常常包含子节点,而标识符、值则是叶子节点,也就是没有孩子的节点。 +一棵典型的树有不同类型的节点。Egg 语言的语法树有标识符、值和应用节点。应用节点常常包含子节点,而标识符、值则是叶子节点,也就是没有子节点的节点。 -DOM中也是一样。元素(表示 HTML 标签)的节点用于确定文档结构。这些节点可以包含子节点。这类节点中的一个例子是document.body。其中一些子节点可以是叶子节点,比如文本片段或注释。 +DOM中也是一样。元素(表示 HTML 标签)的节点用于确定文档结构。这些节点可以包含子节点。这类节点中的一个例子是`document.body`。其中一些子节点可以是叶子节点,比如文本片段或注释。 -每个DOM节点对象都包含nodeType属性,该属性包含一个标识节点类型的代码(数字)。元素的值为1,DOM也将该值定义成一个常量属性document.ELEMENT_NODE。文本节点(表示文档中的一段文本)代码为3(document.TEXT_NODE)。注释的代码为8(document.COMMENT_NODE)。 +每个 DOM 节点对象都包含`nodeType`属性,该属性包含一个标识节点类型的代码(数字)。元素的值为 1,DOM 也将该值定义成一个常量属性`document.ELEMENT_NODE`。文本节点(表示文档中的一段文本)代码为 3(`document.TEXT_NODE`)。注释的代码为 8(`document.COMMENT_NODE`)。 因此我们可以使用另一种方法来表示文档树: -![](../Images/00375.jpeg) +![](img/14-2.svg) 叶子节点是文本节点,而箭头则指出了节点之间的父子关系。 ## 标准 -并非只有JavaScript会使用数字代码来表示节点类型。本章随后将会展示其他的DOM接口,你可能会觉得这些接口有些奇怪。这是因为DOM并不是为JavaScript而设计的,它尝试成为一组语言中立的接口,确保也可用于其他系统中,不只是HTML,还有XML。XML是一种通用数据格式,语法与HTML相近。 +并非只有 JavaScript 会使用数字代码来表示节点类型。本章随后将会展示其他的 DOM 接口,你可能会觉得这些接口有些奇怪。这是因为 DOM 并不是为 JavaScript 而设计的,它尝试成为一组语言中立的接口,确保也可用于其他系统中,不只是 HTML,还有 XML。XML 是一种通用数据格式,语法与 HTML 相近。 这就比较糟糕了。一般情况下标准都是非常易于使用的。但在这里其优势(跨语言的一致性)并不明显。相较于为不同语言提供类似的接口,如果能够将接口与开发者使用的语言进行适当集成,可以为开发者节省大量时间。 -我们举例来说明一下集成问题。比如DOM中每个元素都有childNodes属性。该属性是一个类似于数组的对象,有length属性,也可以使用数字标签访问对应的子节点。但该属性是NodeList类型的实例,而不是真正的数组,因此该类型没有诸如slice和map之类的方法。 +我们举例来说明一下集成问题。比如 DOM 中每个元素都有`childNodes`属性。该属性是一个类数组对象,有`length`属性,也可以使用数字标签访问对应的子节点。但该属性是`NodeList`类型的实例,而不是真正的数组,因此该类型没有诸如`slice`和`map`之类的方法。 -有些问题是由不好的设计导致的。例如,我们无法在创建新的节点的同时立即为其添加孩子和属性。相反,你首先需要创建节点,然后使用副作用,将子节点和属性逐个添加到节点中。大量使用DOM的代码通常较长、重复和丑陋。 +有些问题是由不好的设计导致的。例如,我们无法在创建新的节点的同时立即为其添加子节点和属性。相反,你首先需要创建节点,然后使用副作用,将子节点和属性逐个添加到节点中。大量使用 DOM 的代码通常较长、重复和丑陋。 -但这些问题并非无法改善。因为JavaScript允许我们构建自己的抽象,可以设计改进方式来表达您正在执行的操作。 许多用于浏览器编程的库都附带这些工具。 +但这些问题并非无法改善。因为 JavaScript 允许我们构建自己的抽象,可以设计改进方式来表达你正在执行的操作。 许多用于浏览器编程的库都附带这些工具。 ## 沿着树移动 -DOM节点包含了许多指向相邻节点的链接。下面的图表展示了这一点。 +DOM 节点包含了许多指向相邻节点的链接。下面的图表展示了这一点。 -![](../Images/00376.jpeg) +![](img/14-3.svg) -尽管图表中每种类型的节点只显示出一条链接,但每个节点都有parentNode属性,指向一个节点,它是这个节点的一部分。类似的,每个元素节点(节点类型为1)均包含childNodes属性,该属性指向一个类似于数组的对象,用于保存其子节点。 +尽管图表中每种类型的节点只显示出一条链接,但每个节点都有`parentNode`属性,指向一个节点,它是这个节点的一部分。类似的,每个元素节点(节点类型为 1)均包含`childNodes`属性,该属性指向一个类数组对象,用于保存其子节点。 -理论上,你可以通过父子之间的链接移动到树中的任何地方。但JavaScript也提供了一些更加方便的额外链接。firstChild属性和lastChild属性分别指向第一个孩子和最后一个孩子,若没有孩子则值为null。类似的,previousSibling和nextSibling指向相邻节点,分别指向拥有相同父亲的前一个节点和后一个节点。对于第一个孩子,previousSibling是null,而最后一个孩子的nextSibling则是null。 +理论上,你可以通过父子之间的链接移动到树中的任何地方。但 JavaScript 也提供了一些更加方便的额外链接。`firstChild`属性和`lastChild`属性分别指向第一个子节点和最后一个子节点,若没有子节点则值为`null`。类似的,`previousSibling`和`nextSibling`指向相邻节点,分别指向拥有相同父亲的前一个节点和后一个节点。对于第一个子节点,`previousSibling`是`null`,而最后一个子节点的`nextSibling`则是`null`。 -也存在`children`属性,它就像`childNodes`,但只包含元素(类型为 1)的子节点,而不包含其他类型的子节点。 当您对文本节点不感兴趣时,这可能很有用。 +也存在`children`属性,它就像`childNodes`,但只包含元素(类型为 1)子节点,而不包含其他类型的子节点。 当你对文本节点不感兴趣时,这可能很有用。 处理像这样的嵌套数据结构时,递归函数通常很有用。 以下函数在文档中扫描包含给定字符串的文本节点,并在找到一个时返回`true`: @@ -105,18 +117,18 @@ console.log(talksAbout(document.body, "book")); ## 查找元素 -使用父节点、子节点和兄弟节点之间的连接遍历节点确实非常实用。但是如果我们只想查找文档中的特定节点,那么从document.body开始盲目沿着硬编码的链接路径查找节点并非良策。如果程序通过树结构定位节点,就需要依赖于文档的具体结构,而文档结构随后可能发生变化。另一个复杂的因素是DOM会为不同节点之间的空白字符创建对应的文本节点。例如示例文档中的body标签不止包含3个孩子(<h1>和两个<p>元素),其实包含7个孩子:这三个节点、三个节点前后的空格、以及元素之间的空格。 +使用父节点、子节点和兄弟节点之间的连接遍历节点确实非常实用。但是如果我们只想查找文档中的特定节点,那么从`document.body`开始盲目沿着硬编码的链接路径查找节点并非良策。如果程序通过树结构定位节点,就需要依赖于文档的具体结构,而文档结构随后可能发生变化。另一个复杂的因素是 DOM 会为不同节点之间的空白字符创建对应的文本节点。例如示例文档中的`body`标签不止包含 3 个子节点(`

`和两个`

`元素),其实包含 7 个子节点:这三个节点、三个节点前后的空格、以及元素之间的空格。 -因此,如果你想获取文档中某个链接的href属性,最好不要去获取文档body元素中第六个孩子的第二个孩子,而最好直接获取文档中的第一个链接,而且这样的操作确实可以实现。 +因此,如果你想获取文档中某个链接的`href`属性,最好不要去获取文档`body`元素中第六个子节点的第二个子节点,而最好直接获取文档中的第一个链接,而且这样的操作确实可以实现。 ```html let link = document.body.getElementsByTagName("a")[0]; console.log(link.href); ``` -所有元素节点都包含getElementsByTagName方法,用于从所有后代节点中(直接或间接子节点)搜索包含给定标签名的节点,并返回一个类数组的对象。 +所有元素节点都包含`getElementsByTagName`方法,用于从所有后代节点中(直接或间接子节点)搜索包含给定标签名的节点,并返回一个类数组的对象。 -你也可以使用document.getElementById来寻找包含特定id属性的某个节点。 +你也可以使用`document.getElementById`来寻找包含特定`id`属性的某个节点。 ```html

My ostrich Gertrude:

@@ -128,11 +140,11 @@ console.log(link.href); ``` -第三个类似的方法是getElementsByClassName,它与getElementsByTagName类似,会搜索元素节点的内容并获取所有包含特定class属性的元素。 +第三个类似的方法是`getElementsByClassName`,它与`getElementsByTagName`类似,会搜索元素节点的内容并获取所有包含特定`class`属性的元素。 ## 修改文档 -几乎所有DOM数据结构中的元素都可以被修改。文档树的形状可以通过改变父子关系来修改。 节点的`remove`方法将它们从当前父节点中移除。appendChild方法可以添加子节点,并将其放置在子节点列表末尾,而insertBefore则将第一个参数表示的节点插入到第二个参数表示的节点前面。 +几乎所有 DOM 数据结构中的元素都可以被修改。文档树的形状可以通过改变父子关系来修改。 节点的`remove`方法将它们从当前父节点中移除。`appendChild`方法可以添加子节点,并将其放置在子节点列表末尾,而`insertBefore`则将第一个参数表示的节点插入到第二个参数表示的节点前面。 ```html

One

@@ -145,15 +157,15 @@ console.log(link.href); ``` -每个节点只能存在于文档中的某一个位置。因此,如果将段落Three插入到段落One前,会将该节点从文档末尾移除并插入到文档前面,最后结果为“Three/One/Two”。所有将节点插入到某处的方法都有这种副作用——会将其从当前位置移除(如果存在的话)。 +每个节点只能存在于文档中的某一个位置。因此,如果将段落`Three`插入到段落`One`前,会将该节点从文档末尾移除并插入到文档前面,最后结果为`Three/One/Two`。所有将节点插入到某处的方法都有这种副作用——会将其从当前位置移除(如果存在的话)。 -replaceChild方法用于将一个子节点替换为另一个子节点。该方法接受两个参数,第一个参数是新节点,第二个参数是待替换的节点。待替换的节点必须是该方法调用者的子节点。这里需要注意,replaceChild和insertBefore都将新节点作为第一个参数。 +`replaceChild`方法用于将一个子节点替换为另一个子节点。该方法接受两个参数,第一个参数是新节点,第二个参数是待替换的节点。待替换的节点必须是该方法调用者的子节点。这里需要注意,`replaceChild`和`insertBefore`都将新节点作为第一个参数。 ## 创建节点 假设我们要编写一个脚本,将文档中的所有图像(``标签)替换为其`alt`属性中的文本,该文本指定了图像的文字替代表示。 -这不仅涉及删除图像,还涉及添加新的文本节点,并替换原有图像节点。为此我们使用document.createTextNode方法。 +这不仅涉及删除图像,还涉及添加新的文本节点,并替换原有图像节点。为此我们使用`document.createTextNode`方法。 ```html

The Cat in the @@ -178,7 +190,7 @@ replaceChild方法用于将一个子节点替换为另一个子节点。该方 给定一个字符串,`createTextNode`为我们提供了一个文本节点,我们可以将它插入到文档中,来使其显示在屏幕上。 -该循环从列表末尾开始遍历图像。我们必须这样反向遍历列表,因为getElementsByTagName之类的方法返回的节点列表是动态变化的。该列表会随着文档改变还改变。若我们从列表头开始遍历,移除掉第一个图像会导致列表丢失其第一个元素,第二次循环时,因为集合的长度此时为1,而i也为1,所以循环会停止。 +该循环从列表末尾开始遍历图像。我们必须这样反向遍历列表,因为`getElementsByTagName`之类的方法返回的节点列表是动态变化的。该列表会随着文档改变还改变。若我们从列表头开始遍历,移除掉第一个图像会导致列表丢失其第一个元素,第二次循环时,因为集合的长度此时为 1,而`i`也为 1,所以循环会停止。 如果你想要获得一个固定的节点集合,可以使用数组的`Array.from`方法将其转换成实际数组。 @@ -189,9 +201,9 @@ console.log(array.map(s => s.toUpperCase())); // → ["ONE", "TWO"] ``` -你可以使用document.createElement方法创建一个元素节点。该方法接受一个标签名,返回一个新的空节点,节点类型由标签名指定。 +你可以使用`document.createElement`方法创建一个元素节点。该方法接受一个标签名,返回一个新的空节点,节点类型由标签名指定。 -下面的示例定义了一个elt工具,用于创建一个新的元素节点,并将其剩余参数当作该节点的子节点。接着使用该函数为引用添加来源信息。 +下面的示例定义了一个`elt`工具,用于创建一个新的元素节点,并将其剩余参数当作该节点的子节点。接着使用该函数为引用添加来源信息。 ```html @@ -222,9 +234,9 @@ console.log(array.map(s => s.toUpperCase())); ## 属性 -我们可以通过元素的DOM对象的同名属性去访问元素的某些属性,比如链接的href属性。这仅限于最常用的标准属性。 +我们可以通过元素的 DOM 对象的同名属性去访问元素的某些属性,比如链接的`href`属性。这仅限于最常用的标准属性。 -HTML允许你在节点上设定任何属性。这一特性非常有用,因为这样你就可以在文档中存储额外信息。你自己创建的属性不会出现在元素节点的属性中。你必须使用getAttribute和setAttribute方法来访问这些属性。 +HTML 允许你在节点上设定任何属性。这一特性非常有用,因为这样你就可以在文档中存储额外信息。你自己创建的属性不会出现在元素节点的属性中。你必须使用`getAttribute`和`setAttribute`方法来访问这些属性。 ```html

The launch code is 00000000.

@@ -242,17 +254,17 @@ HTML允许你在节点上设定任何属性。这一特性非常有用,因为 建议为这些组合属性的名称添加`data-`前缀,来确保它们不与任何其他属性发生冲突。 -这里有一个常用的属性:class。该属性是JavaScript中的保留字。因为某些历史原因(某些旧版本的JavaScript实现无法处理和关键字或保留字同名的属性),访问class的属性名为className。你也可以使用getAttribute和setAttribute方法,使用其实际名称“class”来访问该属性。 +这里有一个常用的属性:`class`。该属性是 JavaScript 中的保留字。因为某些历史原因(某些旧版本的 JavaScript 实现无法处理和关键字或保留字同名的属性),访问`class`的属性名为`className`。你也可以使用`getAttribute`和`setAttribute`方法,使用其实际名称`class`来访问该属性。 ## 布局 -你可能已经注意到不同类型的元素有不同的布局。某些元素,比如段落(<p>)和标题(<h1>)会占据整个文档的宽度,并且在独立的一行中渲染。这些元素被称为块(Block)元素。其他的元素,比如链接(<a>或<strong>元素则与周围文本在同一行中渲染。这类元素我们称之为内联(Inline)元素。 +你可能已经注意到不同类型的元素有不同的布局。某些元素,比如段落(`

`)和标题(`

`)会占据整个文档的宽度,并且在独立的一行中渲染。这些元素被称为块(Block)元素。其他的元素,比如链接(``或``元素则与周围文本在同一行中渲染。这类元素我们称之为内联(Inline)元素。 对于任意特定文档,浏览器可以根据每个元素的类型和内容计算其尺寸与位置等布局信息。接着使用布局来绘制文档。 -JavaScript中可以访问元素的尺寸与位置。 +JavaScript 中可以访问元素的尺寸与位置。 -属性offsetWidth和offsetHeight给出元素的起始位置(单位是像素)。像素是浏览器中的基本测量单元。它通常对应于屏幕可以绘制的最小的点,但是在现代显示器上,可以绘制非常小的点,这可能不再适用了,并且浏览器像素可能跨越多个显示点。 +属性`offsetWidth`和`offsetHeight`给出元素的起始位置(单位是像素)。像素是浏览器中的基本测量单元。它通常对应于屏幕可以绘制的最小的点,但是在现代显示器上,可以绘制非常小的点,这可能不再适用了,并且浏览器像素可能跨越多个显示点。 同样,`clientWidth`和`clientHeight`向你提供元素内的空间大小,忽略边框宽度。 @@ -268,11 +280,11 @@ JavaScript中可以访问元素的尺寸与位置。 ``` -getBoundingClientRect方法是获取屏幕中某个元素精确位置的最有效方法。该方法返回一个对象,包含top、bottom、left和right四个属性,表示元素相对于屏幕左上角的位置(单位是像素)。若你想要知道其相对于整个文档的位置,必须加上其滚动位置,你可以在pageXOffset和pageYOffset绑定中找到。 +`getBoundingClientRect`方法是获取屏幕中某个元素精确位置的最有效方法。该方法返回一个对象,包含`top`、`bottom`、`left`和`right`四个属性,表示元素相对于屏幕左上角的位置(单位是像素)。若你想要知道其相对于整个文档的位置,必须加上其滚动位置,你可以在`pageXOffset`和`pageYOffset`绑定中找到。 -我们还需要花些力气才能完成文档的排版工作。为了加快速度,每次你改变它时,浏览器引擎不会立即重新绘制整个文档,而是尽可能等待并推迟重绘操作。当一个修改文档的JavaScript程序结束时,浏览器会计算新的布局,并在屏幕上显示修改过的文档。若程序通过读取offsetHeight和getBoundingClientRect这类属性获取某些元素的位置或尺寸时,为了提供正确的信息,浏览器也需要计算布局。 +我们还需要花些力气才能完成文档的排版工作。为了加快速度,每次你改变它时,浏览器引擎不会立即重新绘制整个文档,而是尽可能等待并推迟重绘操作。当一个修改文档的 JavaScript 程序结束时,浏览器会计算新的布局,并在屏幕上显示修改过的文档。若程序通过读取`offsetHeight`和`getBoundingClientRect`这类属性获取某些元素的位置或尺寸时,为了提供正确的信息,浏览器也需要计算布局。 -如果程序反复读取DOM布局信息或修改DOM,会强制引发大量布局计算,导致运行非常缓慢。下面的代码展示了一个示例。该示例包含两个不同的程序,使用X字符构建一条线,其长度是2000像素,并计算每个任务的时间。 +如果程序反复读取 DOM 布局信息或修改 DOM,会强制引发大量布局计算,导致运行非常缓慢。下面的代码展示了一个示例。该示例包含两个不同的程序,使用`X`字符构建一条线,其长度是 2000 像素,并计算每个任务的时间。 ```html

@@ -305,18 +317,18 @@ getBoundingClientRect方法是获取屏幕中某个元素精确位置的最有 ## 样式 -我们看到了不同的HTML元素的绘制是不同的。一些元素显示为块,一些则是以内联方式显示。我们还可以添加一些样式,比如使用<strong>加粗内容,或使用<a>使内容变成蓝色,并添加下划线。 +我们看到了不同的 HTML 元素的绘制是不同的。一些元素显示为块,一些则是以内联方式显示。我们还可以添加一些样式,比如使用``加粗内容,或使用`
`使内容变成蓝色,并添加下划线。 -<img>标签显示图片的方式或点击标签<a>时跳转的链接都和元素类型紧密相关。但元素的默认样式,比如文本的颜色、是否有下划线,都是可以改变的。这里给出使用style属性的示例。 +``标签显示图片的方式或点击标签``时跳转的链接都和元素类型紧密相关。但元素的默认样式,比如文本的颜色、是否有下划线,都是可以改变的。这里给出使用`style`属性的示例。 ```html

Normal link

Green link

``` -样式属性可以包含一个或多个声明,格式为属性(比如color)后跟着一个冒号和一个值(比如green)。当包含更多声明时,不同属性之间必须使用分号分隔,比如“color:red;border:none”。 +样式属性可以包含一个或多个声明,格式为属性(比如`color`)后跟着一个冒号和一个值(比如`green`)。当包含更多声明时,不同属性之间必须使用分号分隔,比如`color:red;border:none`。 -文档的很多方面会受到样式的影响。例如,display属性控制一个元素是否显示为块元素或内联元素。 +文档的很多方面会受到样式的影响。例如,`display`属性控制一个元素是否显示为块元素或内联元素。 ```html This text is displayed inline, @@ -324,9 +336,9 @@ This text is displayed inline, not at all. ``` -标签block会结束其所在的那一行,因为块元素是不会和周围文本内联显示的。最后一个标签完全不会显示出来,因为display:none会阻止一个元素呈现在屏幕上。这是隐藏元素的一种方式。更好的方式是将其从文档中完全移除,因为稍后将其放回去是一件很简单的事情。 +`block`标签会结束其所在的那一行,因为块元素是不会和周围文本内联显示的。最后一个标签完全不会显示出来,因为`display:none`会阻止一个元素呈现在屏幕上。这是隐藏元素的一种方式。更好的方式是将其从文档中完全移除,因为稍后将其放回去是一件很简单的事情。 -JavaScript代码可以通过元素的style属性操作元素的样式。该属性保存了一个对象,对象中存储了所有可能的样式属性,这些属性的值是字符串,我们可以把字符串写入属性,修改某些方面的元素样式。 +JavaScript 代码可以通过元素的`style`属性操作元素的样式。该属性保存了一个对象,对象中存储了所有可能的样式属性,这些属性的值是字符串,我们可以把字符串写入属性,修改某些方面的元素样式。 ```html

@@ -340,11 +352,11 @@ JavaScript代码可以通过元素的style属性操作元素的样式。该属 ``` -一些样式属性名包含破折号,比如font-family。由于这些属性的命名不适合在JavaScript中使用(你必须写成style[“font-family”]),因此在JavaScript中,样式对象中的属性名都移除了破折号,并将破折号之后的字母大写(style.fontFamily)。 +一些样式属性名包含破折号,比如`font-family`。由于这些属性的命名不适合在 JavaScript 中使用(你必须写成`style["font-family"]`),因此在 JavaScript 中,样式对象中的属性名都移除了破折号,并将破折号之后的字母大写(`style.fontFamily`)。 ## 层叠样式 -我们把HTML的样式化系统称为CSS,即层叠样式表(Cascading Style Sheets)。样式表是一系列规则,指出如何为文档中元素添加样式。可以在<style>标签中写入CSS。 +我们把 HTML 的样式化系统称为 CSS,即层叠样式表(Cascading Style Sheets)。样式表是一系列规则,指出如何为文档中元素添加样式。可以在` @@ -580,4 +592,3 @@ document.getElementsByTagName方法返回带有特定标签名称的所有子元 requestAnimationFrame(animate); ``` - diff --git a/img/14-0.jpg b/img/14-0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..90af0d7411a044161e98e95d6e919d6aabd80aad GIT binary patch literal 28971 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 dlId5L(*FP)HA?4HFCKH=&Jw# literal 0 HcmV?d00001 diff --git a/img/14-1.svg b/img/14-1.svg new file mode 100644 index 0000000..f985457 --- /dev/null +++ b/img/14-1.svg @@ -0,0 +1,23 @@ + + +herea.I also wrote a book! Read itpHello, I am Marijn and this is...pMy home pageh1bodyMy home pagetitleheadhtml diff --git a/img/14-2.svg b/img/14-2.svg new file mode 100644 index 0000000..c6c3510 --- /dev/null +++ b/img/14-2.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + +htmlheadtitleMy home pagebodyh1My home pagepHello! I am...pI also wrote...herea. diff --git a/img/14-3.svg b/img/14-3.svg new file mode 100644 index 0000000..1fc0487 --- /dev/null +++ b/img/14-3.svg @@ -0,0 +1,25 @@ + + +I also wrote a book! ...pHello, I am Marijn...pMy home pageh1body012childNodesfirstChildlastChildpreviousSiblingnextSiblingparentNode diff --git a/img/14-4.svg b/img/14-4.svg new file mode 100644 index 0000000..bfde16f --- /dev/null +++ b/img/14-4.svg @@ -0,0 +1,11 @@ + + +cos(¼π)sin(¼π)cos(-⅔π)sin(-⅔π)