页面渲染流程

本文详细介绍了网页的渲染过程,包括DOM树构建、样式结构体解析、呈现树生成及页面绘制,并通过一个找方块的小游戏实例展示了DOM操作对页面渲染的影响。

 页面渲染过程

一、dom树

        浏览器把html代码解析成1个Dom树,html中的每个tag都是Dom树中的1个节点,根节点就是我们常用的document对象。dom树就是html结构,里面包含了所有的html tag,包括用JS添加的元素。

二、样式结构体

        浏览器把所有样式(主要包括css和浏览器自带的样式设置)解析成样式结构体,在解析的过程中会去掉浏览器不能识别的样式。

三、呈现树 render tree

        dom tree和样式结构体结合后构建呈现树(render tree),将每个节点与其对应的css样式结合。

四、绘制页面

        一旦render tree构建完毕后,浏览器就根据render tree来绘制页面。

理解

        1.render tree可以粗犷的理解为加上了对应样式的dom树;

        2.  render tree不包含隐藏的节点(比如display:none的节点,还有head节点),因为这些节点不会用于呈现,而且不会影响呈现的,所以就不会包含到render tree中。(不占位置,不影响布局)

        3.visibility:hidden隐藏的元素还是会包含到render tree中的,因为visibility:hidden 会影响布局,会占有位置。(占位置,影响布局)

再介绍两个知识点

重绘

        重新绘画(页面的重新渲染),对页面进行操作,如:更换颜色、更换背景,不改变页面布局,但是颜色或背景变了,就会重新渲染页面,这就是重绘。

回流

       当增加或删除dom节点,或者给元素修改宽高时,会改变页面布局,那么就会重新构造dom树然后再次进行渲染,这就是回流。

注意

        回流一定引起重绘,重绘不一定是因为发生了回流。

实例经验:

        这是我学dom操作的第一天制作的一款找方块小游戏

         点击开始,粉色盒子消失,在青色盒子里点击寻找,找到粉色盒子再次显示出来。

代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>方块去哪儿~</title>
    <style>
        #div2 {
            position: relative;
            width: 400px;
            height: 400px;
            margin: 0 auto;
            background-color: aqua;
            line-height: 400px;
            text-align: center;
            cursor: pointer;
            color: gray;
            border-radius: 20px;
        }

        #div1 {
            position: absolute;
            line-height: 100px;
            left: 0px;
            top: 0px;
            height: 100px;
            width: 100px;
            background-color: pink;
            border-radius: 20px;
            cursor: pointer;
            display: block;

        }
    </style>
</head>

<body>
    <div id="div2">
        方块去哪儿了~(鼠标点击此区域寻找)
        <div id="div1">点我开始</div>
    </div>

    <script>
        let div1 = document.getElementById('div1');

        div1.onclick = function () {
            if (getComputedStyle(div1, null).opacity == 0) {
                div1.style.opacity = '1';
                alert('被发现啦~')
            } else {
                let x = Math.floor(Math.random() * 300);
                let y = Math.floor(Math.random() * 300);
                div1.style.left = x + 'px';
                div1.style.top = y + 'px';
                div1.style.opacity = '0';
            }
        }

    </script>
</body>
</html>

实现思路

        1.浅绿色盒子里面有一个粉色盒子;

        2.小盒子上写一个点击事件,可改变样式(相对于绿色盒子的位置,粉色盒子自身的显示与隐藏)

实现——点击改变粉色盒子位置

        经典子绝父相,为浅绿色盒子设置相对定位,粉色盒子设置绝对定位,在粉色盒子的事件执行函数里,为粉色盒子设置定位的top和left(random产生两个随机数),即可达到粉色盒子的位置随机。

实现——点击改变粉色盒子显示与隐藏       

第一个想法就是通过display:none与display:block的改变实现。

        依据这个思路实现时,发现盒子消失之后再也点不到了,浏览器检查,页面中也无法找到粉色盒子,好像这盒子消失了。。。

        根据前面页面渲染流程中的知识,粉色盒子因为样式改变发生了回流,原先显示的粉色盒子,变成了display:none;回流后,这个盒子就不会用于呈现,即页面上没有这个元素了,所以在小时候去点击,是无论如何也点到粉色盒子的了

        解决思路:

       使用opacity,点击过后将盒子设为完全透明,达到盒子隐藏的目的,再次点击,将盒子设置为不透明,就达到了显示的目的。

        这样处理的目的是,页面只发生重绘,没有改变布局,粉色盒子还是会绘制出来,但是因为是透明的,我们才观察不到它。

        (当然还会有其他很多方法)

浏览器的页面渲染流程是一个复杂但有序的过程,它确保了网页内容能够正确显示在用户的屏幕上。整个流程可以分为以下几个主要阶段: ### 解析HTML并构建DOM树 浏览器首先接收HTML文档的字节流,将其转换为字符流,然后进行词法分析生成令牌(Token),接着这些令牌被解析成节点(Node),最终形成文档对象模型(DOM)树。DOM树包含了HTML文档的结构化表示,每个元素、属性和文本都是DOM树中的一个节点。 ### 解析CSS并构建CSSOM树 与此同时,浏览器解析CSS样式表,构建CSS对象模型(CSSOM)树。CSSOM树描述了样式规则及其优先级,它是样式计算的基础。CSSOM树与DOM树是独立构建的,这意味着CSS的解析不会直接阻塞HTML的解析,但两者最终需要结合以确定页面上每个元素的视觉表现。 ### 合成渲染树 接下来,DOM树和CSSOM树被结合起来生成渲染树(Render Tree)。渲染树只包含需要显示的节点,并且每个节点都带有计算后的样式信息。这个阶段不会包含那些不可见的元素,例如`<head>`部分的内容或者设置了`display: none`的元素。 ### 布局计算(Layout) 布局计算阶段也被称为“重排”(Reflow),在这个过程中,浏览器根据渲染树的结构来计算每个元素的确切位置和大小。这是个相对耗时的过程,因为每个元素的位置都可能影响到其他元素的位置。 ### 分层 为了提高渲染效率,现代浏览器会对页面进行分层处理。每个图层可以独立渲染,并且可以在GPU上进行合成,从而利用硬件加速提升性能。当元素的状态发生变化时,如动画效果,浏览器可能会创建新的复合图层。 ### 绘制页面(Paint) 在绘制阶段,浏览器会将每个图层的内容转化为实际的像素点,这个过程称为“重绘”(Repaint)。重绘是将元素的可视部分绘制到屏幕上的过程,它发生在布局计算之后。 ### 回流与重绘 如果页面上的某些部分发生了变化,比如元素的尺寸或位置改变,那么就需要重新进行布局计算和绘制,这可能导致回流和重绘的发生。频繁的回流和重绘会影响页面性能,因此应尽量减少这类操作。 ### 性能优化策略 为了优化页面渲染性能,开发者可以采取多种措施,例如避免使用table布局,使用`transform`代替`top`/`left`动画,将频繁变化的元素设为独立图层,以及通过内联关键CSS、异步加载JavaScript、代码分割等方法来加速解析过程。此外,还可以利用HTTP/2多路复用、资源压缩、CDN加速等网络层优化技术来提升加载速度。 ### 示例代码 下面是一个简单的HTML示例,展示了基本的DOM结构: ```html <html> <head> <title>渲染示例</title> </head> <body> <div class="container"> <h1>Hello World</h1> <p>浏览器渲染原理</p> </div> </body> </html> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值