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

第二章 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.mzph.cn/news/628390.shtml

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

相关文章

合适的索引顺序

一.前言 正确的顺序依赖于使用索引的查询,并且同时需要考虑如何更好地满足排序和分组的需要。因为哈希或者其他类型的索引并不会像 B-Tree索引一样顺序存储数据,所以这里只针对B-Tree展开讨论。 二.合适的索引顺序 1. 概念 对于如何选择索引顺序有一个经验法则: 将选择性最…

hcip-4

ISIS:中央系统到中央系统 基于OSI模型开发&#xff1b; 集成的ISIS&#xff0c;基于OSI开发后转移到TCP/IP模型执行&#xff1b; 故集成的ISIS既可以在OSI模型&#xff0c;也可在TCP/IP模型工作&#xff1b; ISIS是在ISP中使用的一个IGP协议&#xff0c;其归属于无类别链路状…

HashData湖仓一体方案:方案概览与Hive数据同步

随着云计算、大数据、AI的发展和普及&#xff0c;各行各业的业务场景日益复杂&#xff0c;数据呈现出大规模、多样性的特点&#xff0c;企业对数据仓库的需求也进一步拓展至对多元化数据实时处理的场景。 数据湖是多元数据存储与使用的便捷选择&#xff0c;而云原生具有数据资…

谷歌aab包在Android 14闪退而apk没问题(targetsdk 34)

问题原因 Unity应用(target SDK 34)上线到GooglePlay&#xff0c;有用户反馈fold5设备上&#xff08;Android14系统&#xff09;疯狂闪退&#xff0c;经测试&#xff0c;在小米手机Android14系统的版本复现成功了&#xff0c;奇怪的是apk直接安装没问题&#xff0c;而打包成aa…

浙大恩特客户资源管理系统CrmBasicAction.entcrm接口存在任意文件上传漏洞

@[toc] 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. 浙大恩特客户资源管理系统接口简介 微信公…

搭建eureka-server

首先要搭建注册中心服务端&#xff1a;eureka-server&#xff0c;这必须是一个独立的微服务 1.创建项目 创建maven工程即可 2.引入依赖 提示&#xff1a;starter是springboot中的自动装配&#xff0c;在这个依赖里&#xff0c;已经帮我们把eureka的所有配置都做好了 <de…

构建一个最新版本 Maven 项目

文章目录 构建一个最新版本 Maven 项目1. 所用各种软件的版本2. 踩过的坑3. 构建项目过程4. 项目打包方式 构建一个最新版本 Maven 项目 截止 2024 年 1 月 13 日&#xff0c;Apache 官网上 Maven 的最新安全版本为 3.9.6&#xff0c;下载、安装及配置方法见之前的博客&#x…

SUKER书客重磅发布—书客Sun立式护眼台灯,掀起光学护眼养眼新纪元

SUKER书客作为台灯行业的引路者&#xff0c;在台灯中取得颠覆行业的成绩后&#xff0c;并没有就此停下脚步&#xff0c;终于在近日的新品发布中揭露了神秘面纱——书客Sun立式护眼灯&#xff0c;再现创新光学护眼养眼&#xff0c;突破行业护眼天花板&#xff0c;帮助孩子们预防…

一步直达 - CDPATH的妙用

文章目录 一步直达 - CDPATH的妙用更多信息 一步直达 - CDPATH的妙用 适用于贼长的目录路径 如果你的目录路径贼长&#xff0c;一定要用一下这个命令。 变量CDPATH定义了目录的搜索路径&#xff0c;这个设置特别适合经常需要进入到某个目录&#xff0c;此时这个设置就及其有用…

直线模组的适用性

直线模组是由直线运动导向部件和滑块组成的&#xff0c;是一种常见的机械元件&#xff0c;主要用于传输力和运动&#xff0c;其结构简洁&#xff0c;安装方便&#xff0c;耐用高效&#xff0c;广泛应用于各行各业&#xff0c;并且可以通过调整其长度和直径来适应不同的应用场景…

rust跟我学:文件时间属性获得方法

图为RUST吉祥物 大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info是怎样获得杀毒软件的病毒库时间的。 首先,先要了解get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址…

Vue-路由-声明式导航

1. 导航链接 vue-router 提供了一个全局组件 router-link (取代 a 标签) 能跳转&#xff0c;配置 to 属性指定路径(必须) 。本质还是 a 标签 &#xff0c;to 无需 #能高亮&#xff0c;默认就会提供高亮类名&#xff0c;可以直接设置高亮样式 如&#xff1a; <div class&…

反序列化提升刷题

例题&#xff1a; <?php //flag is in flag.php highlight_file(__FILE__); error_reporting(0); class Modifier { private $var; public function append($value) { include($value); echo $flag; } public function __invoke(){ …

LabVIEW编码器自动校准系统

简介 在工作中&#xff0c;精确的角度测量和校准对于保持设备精度至关重要。开发了一套自动化角度编码器校准系统&#xff0c;利用了LabVIEW的强大功能。该系统以全圆连续角度标准装置为基础&#xff0c;配合二维导轨装夹系统&#xff0c;实现了空心轴角度编码器的高效自动校…

红日靶场5

目录 前言 外网渗透 信息收集 1、arp探测 2、nmap 3、nikto 4、whatweb 5、gobuster 6、dirsearch 漏洞探测 ThinKPHP漏洞 漏洞利用 get shell 内网渗透 信息收集 CS 启动&#xff01; CS连接 CS信息收集 1、hashdump 2、猕猴桃 3、端口扫描 MSF启动&…

项目架构之Zabbix部署

1 项目架构 1.1 项目架构的组成 业务架构&#xff1a;客户端 → 防火墙 → 负载均衡&#xff08;四层、七层&#xff09; → web缓存/应用 → 业务逻辑&#xff08;动态应用&#xff09; → 数据缓存 → 数据持久层 运维架构&#xff1a;运维客户端 → 跳板机/堡垒机&#x…

JVM基础(4)——JVM存活判定算法

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

C++ 实现十大排序算法

教你手撕排序&#xff0c;这里有一个概念就是稳定排序。假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff0c;这些记录的相对次序保持不变&#xff0c;即在原序列中&#xff0c;r[i]r[j]&#xff0c;且r[i]在r[j]之前&#…

第十三讲 单片机驱动彩色液晶屏 bin档的烧录方法

单片机驱动TFT彩色液晶屏系列讲座 目录 第一讲 单片机最小系统STM32F103C6T6通过RA8889驱动彩色液晶屏播放视频 第二讲 单片机最小系统STM32F103C6T6控制RA8889驱动彩色液晶屏硬件框架 第三讲 单片机驱动彩色液晶屏 控制RA8889软件:如何初始化 第四讲 单片机驱动彩色液晶屏 控…

Java生成四位数随机验证码

引言&#xff1a; 我们生活中登录的时候都要输入验证码&#xff0c;这些验证码是为了增加注册或者登录难度&#xff0c;减少被人用脚本疯狂登录注册导致的一系列危害&#xff0c;减少数据库的一些压力。 毕竟那些用脚本生成的账号都是垃圾账号 本次实践&#xff1a;生成这样的…