html自定义节点的概念与好处

html自定义节点的概念与好处,第1张

首先自定义节点就是自定义标签,也就是书写非HTML官方定义的标签,比如:

<test>在HTML文件当中并没有test这个标签,这个是由我自己创建的</test>

默认创建的标签,浏览器可以识别,会解析为行元素,可以用CSS进行样式设置。

但是在实际的开发工作当中,基本不使用自定义节点,原因很简单:不利于后期维护以及团队合作工作,而且HTML提供的标签,本身也足够使用。

当浏览器从服务器接收到页面的HTML响应时,在屏幕上绘制像素之前需要采取许多步骤。浏览器为页面的初始绘制需要执行的顺序称为“ 关键渲染路径 ” (CRP)。

CRP知识对于了解如何改善站点性能非常有用。CRP分为6个阶段-

DOM( 文档对象模型 )树是完全解析的HTML页面的对象表示。从根元素开始, <html>将为页面上的每个元素/文本创建节点。嵌套在其他元素中的元素表示为子节点,每个节点都包含该元素的完整属性。例如, <a>元素将具有 href 与其节点关联的属性。

以这个样本文件为例-

这将创建以下DOM树-

关于HTML的一件好事是它可以部分执行。无需加载完整的文档即可使内容开始出现在页面上。但是,其他资源(CSS和JavaScript)可能会阻止页面的呈现。

CSSOM( CSS对象模型 )是与DOM关联的样式的对象表示。它以与DOM相似的方式表示,但包括每个节点的关联样式,无论它们是显式声明的还是隐式继承的。

在上述 style.css 文档的文件中,我们具有以下样式-

这将创建以下CSSOM树-

CSS被视为 “渲染阻止资源” 。这意味着如果不首先完全解析资源,则无法构建 渲染树 。与HTML不同,由于CSS具有继承级联性质,因此不能部分使用。稍后在文档中定义的样式可以覆盖和更改先前定义的样式。因此,如果我们在解析整个样式表之前开始使用样式表中较早定义的CSS样式,则可能会遇到应用了错误CSS的情况。这意味着,在我们进入下一阶段之前,必须对CSS进行完全解析。

CSS文件仅适用于当前设备,才被视为渲染阻止。该 <link rel="stylesheet">标签可以接受一个 media 属性,我们可以在其中指定任何媒体查询其内的样式应用到。例如,如果我们有一个样式表,其media属性为 orientation:landscape ,并且我们正在以纵向模式查看页面,则该资源将不被视为渲染阻止。

CSS也可以是 “脚本阻止” 。这是因为JavaScript文件必须等待CSSOM构造完成后才能运行。

JavaScript被视为 “解析器阻止资源” 。这意味着HTML文档本身的解析已被JavaScript阻止。

当解析器到达一个 <script>标签时,无论是内部标签还是外部标签,它都会停止获取(如果是外部标签)并运行它。这就是为什么,如果我们有一个JavaScript文件引用了文档中的元素,则必须将其放在该文档的外观之后。

为了避免JavaScript被解析器阻止,可以通过应用 async 属性异步加载它。

渲染树是DOM和CSSOM的组合。它是一棵树,代表最终将在页面上呈现的内容。这意味着它仅捕获可见的内容,并且不包括例如使用CSS被CSS隐藏的元素 display: none 。

使用上面的示例DOM和CSSOM,将创建以下渲染树-

布局是决定视口大小的要素,它为依赖于它的CSS样式(例如百分比或视口单位)提供了上下文。视口大小由文档头中提供的meta视口标签确定,或者,如果未提供标签,则使用默认视口宽度980px。

例如,最常见的元视口值是将视口大小设置为与设备宽度相对应-

如果用户在宽度为例如1000px的设备上访问网页,则尺寸将基于该单位。视口的一半将是500px,10vw将是100px,依此类推。

最后,在“绘画”步骤中,页面的可见内容可以转换为要在屏幕上显示的像素。

绘制步骤需要花费多少时间取决于DOM的大小以及所应用的样式。某些样式比其他样式需要执行更多工作。例如,复杂的渐变背景图像比简单的纯色背景需要更多的时间。

要查看正在处理的关键渲染路径,我们可以在DevTools中对其进行检查。在Chrome浏览器中,它位于“ 时间轴” 标签下(在Canary中,不久后成为Chrome稳定版,它已重命名为 Performance )。

举例来说,我们上面的示例HTML(带有添加的 <script>标记)-

如果我们查看页面加载的事件日志,就会得到以下信息:

基于此信息,我们可以决定如何优化“关键渲染路径”。

Understanding the Critical Rendering Path

根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点:

通过 HTML DOM,树中的所有节点均可通过 JavaScript 进行访问。所有 HTML 元素(节点)均可被修改,也可以创建或删除节点。

<code>

<html>

<head>

<title>DOM 教程</title>

</head>

<body>

<p>Hello world!</p>

</body>

</html>

</code>

上面的 HTML 中:

html节点没有父节点;它是根节点

head 和 <body>的父节点是 <html>节点

文本节点 "Hello world!" 的父节点是 p节点

html 节点拥有两个子节点:<head>和 <body>

head节点拥有一个子节点:<title>节点

title 节点也拥有一个子节点:文本节点 "DOM 教程"

head 元素是 <html>元素的首个子节点

body 元素是 <html>元素的最后一个子节点

p 元素是 <body>元素的最后一个子节点

方法是我们可以在节点(HTML 元素)上执行的动作。

一些常用的 HTML DOM 方法:

一些常用的 HTML DOM 属性:

属性是节点(HTML 元素)的值,您能够获取或设置。

获取或替换HTML元素的值

规定节点的名称

规定节点的值

返回节点的类型,nodeType是只读的

访问 HTML DOM - 查找 HTML 元素。

访问 HTML 元素等同于访问节点

返回带有指定ID的元素

<code>

document.getElementByld("intro")

</code>

返回带有指定标签名的所有元素

<code>

x = document.getElementByTagName("p")

document.write(x[0].innerHTML)

</code>

查找带有相同类名的所有HTML元素

<code>document.getElementsByClassName("intro")</code>

修改 HTML = 改变元素、属性、样式和事件。

改变元素内容的最简答的方法是使用 innerHTML 属性。

<code>

document.getElementById("p1").innerHTML="New text!"

</code>

访问 HTML 元素的样式对象

<code>

document.getElementById("p2").style.color="blue"

document.getElementById("p2").style.fontFamily="Arial"

document.getElementById("p2").style.fontSize="larger"

</code>

如需向 HTML DOM 添加新元素,您首先必须创建该元素(元素节点),然后把它追加到已有的元素上。

<code>

var para=document.createElement("p")

var node=document.createTextNode("This is new.")

para.appendChild(node)

var element=document.getElementById("div1")

element.appendChild(para)

</code>

当 HTML 元素”有事情发生“时,浏览器就会生成事件:

添加、删除和替换 HTML 元素。

如需向 HTML DOM 添加新元素,您首先必须创建该元素,然后把它追加到已有的元素上。

<code>

var para=document.createElement("p") //创建文本节点

var node=document.createTextNode("This is new.") //向 p 元素追加文本节点

para.appendChild(node)//向已有元素追加这个新元素

</code>

appendChild() 方法,将新元素作为父元素的最后一个子元素进行添加。

如果不希望如此,您可以使用 insertBefore() 方法。

如需删除 HTML 元素,您必须清楚该元素的父元素

<code>

var parent=document.getElementById("div1")

var child=document.getElementById("p1")

parent.removeChild(child)

</code>

当想要删除一个子元素但是不知道他的父元素的时候,可以用parentNode来查找他的父元素。

<code>

var child=document.getElementById("p1")

child.parentNode.removeChild(child)

</code>

<code>

var parent=document.getElementById("div1")

var child=document.getElementById("p1")

var para=document.createElement("p")

var node=document.createTextNode("This is new.")

para.appendChild(node)

parent.replaceChild(para,child)

</code>

HTML DOM 允许 JavaScript 对 HTML 事件作出反应

当事件发生时,可以执行 JavaScript,比如当用户点击一个 HTML 元素时。

<code><h1 onclick="this.innerHTML='hello!'">请点击这段文本!</h1></code>

如需向 HTML 元素分配事件,可以使用事件属性

HTML DOM 允许使用 JavaScript 向 HTML 元素分配事件

举例:为 button 元素分配 onclick 事件:

<code><script>

document.getElementById("myBtn").onclick=function(){displayDate()}

</script></code>

当用户进入或离开页面时,会触发 onload 和 onunload 事件。

onchange 事件常用于输入字段的验证。

onmouseover 和 onmouseout 事件可用于在鼠标指针移动到或离开元素时触发函数。

onmousedown、onmouseup 以及 onclick 事件是鼠标点击的全部过程。首先当某个鼠标按钮被点击时,触发 onmousedown 事件,然后,当鼠标按钮被松开时,会触发 onmouseup 事件,最后,当鼠标点击完成时,触发 onclick 事件。

通过 HTML DOM,您能够使用节点关系在节点树中导航。

getElementsByTagName() 方法返回节点列表。节点列表是一个节点数组。

length 属性定义节点列表中节点的数量。

您能够使用三个节点属性:parentNode、firstChild 以及 lastChild ,在文档结构中进行导航

这里有两个特殊的属性,可以访问全部文档:

document.documentElement - 全部文档

document.body - 文档的主体

除了 innerHTML 属性,您也可以使用 childNodes 和 nodeValue 属性来获取元素的内容。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6267514.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-19
下一篇 2023-03-19

发表评论

登录后才能评论

评论列表(0条)

保存