浏览器是怎么样渲染一个页面的

解析与构建DOM树

解析html文件构建DOM树的一些规则:

1,外部样式会阻塞后续脚本执行,直到外部样式加载并解析完毕。

2,外部样式不会阻塞后续外部脚本的加载,但会阻塞外部脚本的执行。

3,如果后续外部脚本含有async属性(IE下为defer),则外部样式不会阻塞该脚本的加载和运行。

4,对于动态创建的link标签不会阻塞其后动态创建的script的加载与执行,不管script标签是否具有async属性,但对于其他非动态创建的script,以上三条结论仍适用

构建呈现树

HTML解析完毕后,开始构建呈现树RenderTree,这一步的主要工作在于将css样式应用到DOM节点上面,WebKit内核将这一过程称为附着,其他浏览器有不同的概念。对前端工程师而言这个过程会涉及到css层叠问题。

首先将根据样式重要性排序,由低到高依次为:

1,浏览器声明

2,用户普通声明

3,作者普通声明

4,作者重要声明

5,用户重要声明

对于同一重要级别,则是根据css选择符的特指度来判定优先级;

各级别的优先级:

important > 内联  > ID > 类 > 标签|伪类|属性选择器 > 伪对象 > 通配符 > 继承

1,权值的大小跟选择器的类型和数量有关

2,样式的优先级跟样式的定义顺序有关

呈现树的每一个节点即为与其对应的DOM节点的css框,框的类型与DOM节点的display属性有关,block元素生成block框,inline元素生成inline框,每一个呈现树节点都有与之对应的DOM节点,但DOM节点不一定有与之相对应的呈现树节点,你如display属性为none的DOM节点,而且呈现树节点在呈现树中的位置与他们在DOM树中的位置不一定相同,比如float与绝对定位元素。

布局

定位元素的坐标和大小,是否换行,各种 position, overflow, z-index 属性

绘制

这里有两个概念,一个是 Reflow,另一个是 Repaint。

repaint 屏幕的一部分要重画,比如某个css的背景色变了,但是元素的几何尺寸没有变。

reflow 意味着元件的几何尺寸变了,我们需要重新验证并计算render tree。是render tree的一部分或全部发生了变化,这就是reflow 或是layout。reflow的成本比repaint的成本高很多,DOM tree里面的每个节点都会有reflow方法,一个节点的reflow很有可能导致子节点,甚至是父节点以及同级节点的reflow。

display:none 会触发 reflow,而 visibility:hidden 只会触发 repaint。

参考

答寒冬九问之讲讲输入完网址按下回车,到看到网页这个过程中发生了什么。

CSS选择器、优先级与匹配原理

时间: 2024-10-14 14:53:33

浏览器是怎么样渲染一个页面的的相关文章

5秒后跳转到另一个页面的js代码

今天看视频学习时学习了一种新技术,即平时我们在一个页面点击"提交"或"确认"会自动跳转到一个页面. 在网上搜了一下,关于这个技术处理有多种方法,我只记下我在视频里学到的三种: 1.用一个response.sendRedirect("目标页面.jsp\.htm");实现直接跳转: 2.有时我们需要有点提示,比如"x秒后自动跳转,若没有跳转,请点击此处",则可以在myeclipse中调用Snippets中的Delay Go To

调用上一个页面的js方法

点击商品分类,弹出下框 点击确定,将选中的类别的name和唯一的code返回到上个页面 function save(){ var ids = getIdSelections(); jp.get("${ctx}/product/hzproduct/saveType?ids=" + getIdSelections()+"&id="+$.trim($("#idele").text()), function(data){ if(data.succ

[thinkphp] 是如何输出一个页面的

表面上看,TP输出一个页面很简单:$this->display(); 实际上是怎么回事呢?$this->display(); 这个display()方法是定义在ThinkPHP/Library/Think/Controller.class.php这个文件中的 protected function display($templateFile='',$charset='',$contentType='',$content='',$prefix='') { $this->view->di

PHP把数据传到下一个页面的4种方法

<?php /*数据存到数据库成功之后想跳转到下一个页面,PHP然后把数据也传到下一个页面 php里面当页面读取结束的时候,所有的变量将全部清空,所以需要通过别的手段来传值, */ //1.通过url参数 比如:在跳转链接上加上?id1=$id1&id2=$id2 //这个最常用,也最省资源,但传递的内容有限. ///2.保存到session.将数据保存到特定的session中,到下个页面再从session中取出 session_start(); $emailaddress = "

关于如何控制一个页面的Ajax读数据只读一次的简单解决办法!

例如:一个页面有一个按钮,点击的时候用ajax去后台获取数据,获取成功以后返回.下次再点击的时候就不要去获取数据了. 解决办法有很多: 1.用Get方法去读数据,会缓存. 2.用jquery的data方法去手动缓存,读数据的时候判断缓存是否存在. 我的解决办法是在按钮加载的时候给按钮一个标志它未去后台获取过数据的属性(如readnot). 然后在第一次去后台获取数据成功后使用removeAttr("readnot")移除这个属性即可. 这样只要在每次点击按钮的时候判断是否存在readn

关于一个页面的tab切换整体页面刷新而tab标签处是同一个文件怎么做焦点的问题

解决方法,不能直接写点击效果就要在超链接中加一个参数,根据参数的值去给变焦点的效果,实现方法如下: <div class="vip_search">             <div class='vip_search1'>                 <div class='vip_search1a' >                     <ul class='texts'>                         &

winform中如何选中datagridview中的一行数据双击后跳转并将其显示在另一个页面的datagirdview中

Form1:    public static string[] a;   private void dataGridView1_DoubleClick(object sender, EventArgs e)//添加datagridview1的双击事件         {             try             {                 int index = dataGridView1.CurrentRow.Index;                 a = new

WebBrowser之获取跳转页面的Document接口源码

问题由来是这样的,今天帮一个网友解决问题,说从VC驿站下载了一个源码,程序的功能主要是在对话框上面放置了一个WebBrowser控件,程序启动的时候默认调用这句代码: m_web.Navigate(_T("https://www.baidu.com/s?wd=400电话"), NULL, NULL, NULL, NULL); 打开这个网址:https://www.baidu.com/s?wd=400电话,如下图: 点击[获取测试]按钮之后,执行如下函数: 1 void CCctryDl

页面的div中有滚动条,js实现刷新页面后回到记录时滚动条的位置

当div中绑定数据,给它一个属性overflow-y: scroll,添加长度大小,使其能够出现滚动条:每次刷新的时候滚动条总是会出现在最上方,这使我很头疼,经过查阅网上资料,返现两种方法可行.如下: 第一种方案 将上一个页面的div的scrolltop距离长度记录在cookie中,然后通过js调整刷新页面时的长度记录,代码如下: js代码: <script> var _h = 0; function SetH(o) { _h = o.scrollTop SetCookie("a&q