《WebKit 技术内幕》之二: HTML 网页和结构

news2024/10/7 2:31:14

第二章 HTML 网页和结构

       HTML网页是利用HTML语言编写的文档,HTML是半结构化的数据表现方式,它的结构特征可以归纳为:树状结构、层次结构和框结构。

1.网页构成

1.1 基本元素和树状结构

        HTML网页使用HTML语言撰写的文档,发展到今天基本上都是动态网页(Dynamic HTML)也就是网页可以出现动画,可以与用户交互,这就需要CSS样式语言和JavaScript语言,Javascript用来控制网页内部逻辑,CSS用来描述网页的显示信息。

<html>
    <head>
        <style type="text/css">                <!-- CSS代码 -->
            img { width: 100px; }
        </style>
        <title>This is a simple case.</title>
    </head>
    <body>
        <img src="apic.png"></img>
        <div>Hello world!</div>
        <script type="text/javascript">
            window.onload = function(){
                console.log("window.onload()");
            }
            console.log("It's me.");
        </script>
    </body>
</html>

HTML节点:根节点,包含HEAD、BODY两个子节点。

HEAD节点:网页的头节点,网页的头部说明等,本节点含Style节点,定义显示样式等。

BODY节点:网页的内容实体节点,本节点包含了Img、div,script等节点。

STYLE节点:该节点包含了一段CSS代码,用来定义元素的样式信息。CSS是一种样式语言,用来描述元素的显示信息,借鉴数据和显示分离的原理,规范设计者们可以将有关显示的信息如颜色、大小】字体等抽取出来,使用CSS语言编写代码来描述它们,与HTML元素的内容分离开来。

IMG节点:用来在网页中显示图片节点。

DIV节点:用来显示一段文字。

SCRIPT节点:嵌入了一段JavaScript代码。javascript是一种解释型的脚本语言,主要目的是控制用户逻辑,同用户交互等,它可以修改HTML元素和内容。

        从上面的代码可以看出,一个完整的网页组成包括HTML文本、JavaScript代码、CSS代码以及各种各样的资源文件。网络上的每个资源都是由URL(Unified Resource Locator)标记的。

1.2 HTML新特性

        HTML5引入的最让人惊讶的最新能力之一是对2D和3D图形以及多媒体方面的支持,这将彻底改变网页的渲染方式和复杂度。这里包括但不限于HTML5视频、Canvas 2D、WebGL(也就是Canvas 3D),以及CSS3 3D变换(transform)和转换(transition)。HTML5视频引入了一个新的“video”元素,支持在网页中播放视频。Canvas2D通过定义一个新的“canvas”元素,网页开发者利用该元素的2D绘图上下文(graphics context)调用标准定义的接口,绘制常见的2D图形,如、点、线、矩形、多变形等。WebGL则使用“canvas”元素,网页开发者可以利用该元素的3D绘图上下文调用标准定义的接口,绘制3D图形,这些接口类似于OpenGL ES的接口。CSS 3D的变换和转换则可以作用于HTML的任意可视元素,制造出炫丽的3D效果。

        HTML5规范下,视频、3D图形等和其他普通HTML元素一样,可以被赋予同样的样式和操作。不仅支持第三方插件所提供的能力,而且其功能更为强大,因为除了创建HTML元素并可以在它上面绘制2D、3D图形之外,甚至还可以将3D的变化和动画效果作用于任意HTML元素之上,包括视频等、

2.网页结构

2.1 框结构

        框架结构用来对网页的布局进行分割,将网页分成几个框。同时,网页开发者也可以让网页嵌入其他网页。在HTML的语法中frameset、frame、iframe可以用来在当前网页中嵌入新的框结构。

        每一个框结构包含一个HTML文档,最简单的框结构网页就是单一的框,其文档没有包含其他的框。

网页页可以有很复杂的框结构,叶菊是框里面再嵌入框。

多框结构网页对于移动领域不适合(对触控操作是一场灾难)

2.2 层次结构

        网页的元素可能分布在不同的层次,某些元素可能不同于它的父元素所在层次(某些情况下 WebKit 需要为该元素和它的子女建立一个新层)。对于需要复杂变换和处理的元素(如video、3D变换、复杂的2D3D绘图操作),它们需要新层从而实现渲染引擎在处理上的方便或高效。

        根层:图中最大的层,网页构建层次结构首先构件根节点时创建的层,对应着整个网页文档对象。

3.WebKit 网页渲染过程

3.1 加载和渲染

浏览器主要作用:将用户输入的 URL 转变成可视化图像。包含两个过程:

  • 网页加载过程,从 URL 到 DOM 树
  • 网页渲染过程,从 DOM 树到可视化图像

        其实,这两个过程也会交叉,很难给予明确区分,所以,为了简单起见,统称这两个过程为网页渲染过程。        

        视图:viewport,当前可见区域,一般网页都要比屏幕可视面积大,因为网页比视图区域大,所以浏览器在渲染网页时,一般会加入滚动条,以帮助翻滚网页。就用户体验来说,垂直方向滚动效果好于水平方向。

3.2 webkit的渲染过程

渲染过程分为三个阶段。

(1) 网页 URL 到构建 DOM 树:

  1. 用户输入 URL ,WebKit 调用其资源加载器加载该 URL 对应的网页
  2. 加载器依赖网络模块建立连接,发送请求并接收答复
  3. WebKit 接收到各种网页或者资源的数据,其中某些资源可能是同步或异步获取
  4. 网页被交给 HTML 解释器转变成一系列词语(Token)
  5. 解释器根据词语构建节点(Node),形成 DOM 树
  6. 如果节点是 JavaScript 代码,调用 JavaScript 引擎解释并执行
  7. JavaScript 代码可能会修改 DOM 树的结构
  8. 如果节点需要依赖其他资源,例如图片、CSS、视频等,调用资源加载器来加载它们(异步加载,不会阻碍当前 DOM 树的继续创建);如果是 JavaScript 资源 URL (并且没有标明以异步方式),需要停止当前 DOM 树的创建知道 JavaScript 资源加载并被 JavaScript 引擎执行后才继续 DOM 树的创建。

上述过程中网页会有两个重要事件:DOMContentLoaded (原文中为 DOMConent)与 load 事件

  • DOMContentLoaded:初始 HTML 文档被完全加载和解析完成之后即触发,无需等待样式表、图像、子框架 subframe 的完成加载(这里需要等待的只是会阻碍 DOM 树创建完成的元素加载,包括 script 标签),参考 MDN
  • Load:DOM 树构建完并且网页所依赖的资源都加载完之后发生

(2) 利用 CSS 和 DOM 树构建 RenderObject 树直到绘图上下文:

  1. CSS 文件被 CSS 解释器解释成内部表示结构
  2. CSS 解释器工作完之后,在 DOM 树上附加解释后的样式信息,即为 RenderObject 树
  3. RenderObject 节点在创建的同时,WebKit 会根据网页的层级结构创建 RenderLayer 树,同时构建一个虚拟的绘图上下文

CSSOM,DOM,RenderObject 树,RenderLayer 树会一直存在直到网页销毁

(3) 绘图上下文到最终的图像:

  • 绘图上下文:与平台无关的抽象类,将每个绘图操作桥接到不同的具体实现类(绘图具体实现类)
  • 绘图实现类页可能有简单的实现,也有可能的复杂实现。在Chromiu中,它的实现相当复杂,需要Chromium的合成器来完成复杂的多进程和GPU加速机制。
  • 绘图实现类:将 2D 图形库与 3D 图形库绘制结果保存下来,交给浏览器来同浏览器界面一起显示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1385413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实战 | 某电商平台类目SKU数获取与可视化展示

一、项目背景 最近又及年底&#xff0c;各类分析与规划报告纷至沓来&#xff0c;于是接到了公司平台类目商品增长方向的分析需求&#xff0c;其中需要结合外部电商平台做对比。我选择了国内某电商平台作为比较对象&#xff0c;通过获取最细层级前台类目下的SKU数以及结构占比&…

免费分享一套PyQt6图书管理系统(附带完整开发视频教程) Python入门项目实战,果断收藏了~~

大家好&#xff0c;我是python222_小锋老师&#xff0c;最近写了一套PyQt6图书管理系统源码&#xff0c;附带完整开发视频教程&#xff0c;作为Python学习者的入门实战项目&#xff0c;带大家一起入门学习Python技术&#xff0c;感谢大家支持&#xff0c;特来分享下哈。 项目实…

java小游戏——动漫美女拼图

1&#xff1a;继承 1.1 继承概述 首先&#xff0c;我们来说一下&#xff0c;什么是继承&#xff1a; 继承是面向对象三大特征之一(封装&#xff0c;继承和多态) 可以使得子类具有父类的属性和方法&#xff0c;还可以在子类中重新定义&#xff0c;追加属性和方法 也就是说&…

生日视频模板-试试这样制作

视频制作已经成为表达情感、记录生活的重要方式。尤其在生日这样的特殊日子&#xff0c;一份个性化的视频祝福不仅能让人感到温馨&#xff0c;还能成为长久珍藏的回忆。那么&#xff0c;如何快速制作出精美的生日模版视频呢&#xff1f;下面就给大家介绍几种可以制作生日模版的…

论文阅读:Attention is all you need

【最近课堂上Transformer之前的DL基础知识储备差不多了&#xff0c;但学校里一般讲到Transformer课程也接近了尾声&#xff1b;之前参与的一些科研打杂训练了我阅读论文的能力和阅读源码的能力&#xff0c;也让我有能力有兴趣对最最源头的论文一探究竟&#xff1b;我最近也想按…

300块成本从零开始搭建自己的家庭版NAS还可以自动备份,懂点代码有手就行!

前言 300块成本从零开始搭建自己的家庭版NAS&#xff0c;还可以手机上文件照片音乐自动备份&#xff0c;完全实现了自己的网盘效果&#xff0c;可以设置用户权限分配&#xff0c;目录上传、断点续传、并行上传、拖拽文件上传等日常操作。 为什么要搭建NAS&#xff1f; 现在的手…

【数据库】间隙锁Gap Lock

什么是间隙锁 间隙锁&#xff08;Gap Lock&#xff09;&#xff1a;间隙锁是&#xff08;RR级别下&#xff09;一个在索引记录之间的间隙上的锁&#xff0c;可以是两个索引记录之间&#xff0c;也可能是第一个索引记录之前或最后一个索引之后的空间。间隙锁&#xff08;Gap Lo…

失踪人员信息发布与管理系统:计算机毕设课题的研究与实践 springboot+java+vue+mysql

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Cesium 模型压平

最近整理了下手上的代码&#xff0c;以下是对模型压平的说明。 原理是使用了customShader来重新设置了模型的着色器&#xff0c;通过修改模型顶点的坐标来实现了压平。 废话不多说&#xff0c;下面上代码&#xff1a; /*** class* description 3dtiles模型压平*/ class Flat…

docker-ce 安装与国内源配置 | Ubuntu 20.04

博客原文 文章目录 让apt可以支持HTTPS将官方Docker库的GPG公钥添加到系统中将Docker库添加到APT里更新包列表为了确保修改生效&#xff0c;让新的安装从Docker库里获取&#xff0c;而不是从Ubuntu自己的库里获取&#xff0c;执行&#xff1a;安装 docker-ce配置 docker 阿里源…

Java多线程并发篇----第十四篇

系列文章目录 文章目录 系列文章目录前言一、ReadWriteLock 读写锁二、共享锁和独占锁三、重量级锁(Mutex Lock)四、轻量级锁前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给…

【图解数据结构】深入剖析时间复杂度与空间复杂度的奥秘

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;图解数据结构、算法模板 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️算法的定义二. ⛳️算法的特性2.1 &#x1f514;输入输出2.2 &#x1f514;输入输出2.3 &…

Multimodal Prototypical Networks for Few-shot Learning

tcGAN is provided with an embedding ϕ T \phi_T ϕT​() of the textual description 辅助信息 作者未提供代码

大模型中的显卡优化与分布式训练策略

目录 前言1 大模型训练优化的目标1.1 简单性1.2. 高效性1.3 廉价性 2 显存的组成与利用2.1 参数存储2.2 梯度计算与存储2.3 中间计算结果2.4 优化器信息 3 优化方法3.1 数据并行3.2 模型并行3.3 零冗余优化器&#xff08;Zero Redundancy Optimizer&#xff09;3.4 Pipeline并行…

前端数据魔法:解析数据透视功能实现

前言 在信息爆炸的时代&#xff0c;数据扮演着关键的角色。从庞大的数据中提取有用的信息并进行有效地分析&#xff0c;是一项充满挑战的任务。为了应对这个挑战&#xff0c;数据透视表这一工具应运而生。它通过重新排列和组合数据&#xff0c;使得原始数据更易于理解和分析。…

解决鸿蒙APP的内存泄漏

解决鸿蒙&#xff08;HarmonyOS&#xff09;应用的内存泄漏问题需要采用一系列的策略和技术。与解决Android内存泄漏类似&#xff0c;以下是一些建议&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1…

增强FAQ搜索引擎:发挥Elasticsearch中KNN的威力

英文原文地址&#xff1a;https://medium.com/nerd-for-tech/enhancing-faq-search-engines-harnessing-the-power-of-knn-in-elasticsearch-76076f670580 增强FAQ搜索引擎&#xff1a;发挥Elasticsearch中KNN的威力 2023 年 10 月 21 日 在一个快速准确的信息检索至关重要的…

收银系统源码,连锁店收银系统源码

智慧新零售系统是一套线下线上一体化的收银系统。致力于给零售门店提供『多样化线下收银』、『ERP进销存』、『o2o小程序商城』、『精细化会员管理』、『丰富营销插件』等一体化行业解决方案&#xff01; 一、多样化线下收银 1.聚合收款码 ①适用商户&#xff1a;小微门店&am…

在 .NET 中使用可以漫游的 Web 凭据

Windows 凭据管理器是一个内置在 Windows 操作系统中的功能&#xff0c;为用户提供一种安全的方式来存储和管理凭据。本文主要介绍如何在 .NET 中使用可以漫游的 Web 凭据&#xff0c;以及使用中的基本事项。 1. 引言 在前面的文章《试用 Windows Terminal 中的 Terminal Chat…

SwiftUI CoreData Picker

开发多账本功能 CoreData 与 Picker 的使用 上代码&#xff1a; // // TestZhangBenPicker.swift // pandabill // // Created by 朱洪苇 on 2024/1/14. //import SwiftUIstruct TestZhangBenPicker: View {FetchRequest(sortDescriptors: [SortDescriptor(\.cc_at)],anima…