`
zhengchao860730
  • 浏览: 62565 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

让页面变得更快一点-HTML解析原理[转]

阅读更多

Web页面运行在各种各样的浏览器当中,浏览器载入、渲染页面的速度直接影响着用户体验。非常不幸的是,效率最低的IE浏览器仍然占领者绝大多数市场份额,这已经严重制约了互联网的发展(感叹一下:“马赛克和IE——阻碍人类文明发展的绊脚石!”)。

简单地说,页面渲染就是浏览器将html代码根据CSS定义的规则显示在浏览器窗口中的这个过程。先来大致了解一下浏览器都是怎么干活的:

  1. 用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件;
  2. 浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部CSS文件;
  3. 浏览器又发出CSS文件的请求,服务器返回这个CSS文件;
  4. 浏览器继续载入html中<body>部分的代码,并且CSS文件已经拿到手了,可以开始渲染页面了;
  5. 浏览器在代码中发现一个<img>标签引用了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码;
  6. 服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码;
  7. 浏览器发现了一个包含一行Javascript代码的<script>标签,赶快运行它;
  8. Javascript脚本执行了这条语句,它命令浏览器隐藏掉代码中的某个<div> (style.display=”none”)。杯具啊,突然就少了这么一个元素,浏览器不得不重新渲染这部分代码;
  9. 终于等到了</html>的到来,浏览器泪流满面……
  10. 等等,还没完,用户点了一下界面中的“换肤”按钮,Javascript让浏览器换了一下<link>标签的CSS路径;
  11. 浏览器召集了在座的各位<div><span><ul><li>们,“大伙儿收拾收拾行李,咱得重新来过……”,浏览器向服务器请求了新的CSS文件,重新渲染页面。

 

浏览器每天就这么来来回回跑着,要知道不同的人写出来的html和css代码质量参差不齐,说不定哪天跑着跑着就挂掉了。好在这个世界还有这么一群人——页面重构工程师,平时挺不起眼,也就帮视觉设计师们切切图啊改改字,其实背地里还是干了不少实事的。

说到页面为什么会慢?那是因为浏览器要花时间、花精力去渲染,尤其是当它发现某个部分发生了点变化影响了布局,需要倒回去重新渲染,内行称这个回退的过程叫reflow。

 

reflow.gif

reflow几乎是无法避免的。现在界面上流行的一些效果,比如树状目录的折叠、展开(实质上是元素的显示与隐藏)等,都将引起浏览器的 reflow。鼠标滑过、点击……只要这些行为引起了页面上某些元素的占位面积、定位方式、边距等属性的变化,都会引起它内部、周围甚至整个页面的重新渲染。通常我们都无法预估浏览器到底会reflow哪一部分的代码,它们都彼此相互影响着。

reflow问题是可以优化的,我们可以尽量减少不必要的reflow。比如开头的例子中的<img>图片载入问题,这其实就是一个可以避免的reflow——给图片设置宽度和高度就可以了。这样浏览器就知道了图片的占位面积,在载入图片前就预留好了位置。

另外,有个和reflow看上去差不多的术语:repaint,中文叫重绘。如果只是改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性,将只会引起浏览器repaint。repaint的速度明显快于reflow(在IE下需要换一下说法,reflow要比repaint 更缓慢)。下次将通过一系列的实验说明在Firefox、IE等浏览器下reflow的优化。

repaint.gif

分享到:
评论
2 楼 zhengchao860730 2011-09-25  
完善自我 写道
图片太形象了,在Firefox、IE等浏览器下reflow的优化写了吗?

不是我写的啦 我也是学习。
1 楼 完善自我 2011-08-16  
图片太形象了,在Firefox、IE等浏览器下reflow的优化写了吗?

相关推荐

    前端开源库-error-html

    总的来说,"前端开源库-error-html" 提供了一个创新的解决方案,让前端开发中的错误处理变得更加直观和高效。通过HTML呈现错误堆栈,不仅提升了开发者体验,也有助于团队协作和持续集成过程中的错误追踪。

    前端开源库-swint-builder-html

    1. **模板引擎**:Swint-Builder-HTML 支持使用模板语言来编写 HTML,这使得动态生成页面变得更加简单。它可以解析模板语法,将数据与模板结合,生成最终的 HTML 输出。 2. **模块化**:通过模块化的组织方式,...

    将截图直接生成 HTML 页面 screenshot-to-code.docx

    随着 AI 技术的发展,这类工具将会变得更加智能和准确。例如,未来可能会支持更多框架和技术栈,同时还能更好地处理复杂的布局和样式问题。此外,随着 Web 技术的不断演进,此类工具也将不断升级以适应新的需求和...

    pd4ml在线转pdf

    综上所述,pd4ml是一款强大的工具,能够帮助开发者轻松地将HTML内容转换为专业品质的PDF文档,而"pd4ml在线转pdf"则提供了一个便捷的示例,让学习和使用变得更加直观。通过深入理解这个工具的原理和使用方法,开发者...

    HtmlParser用于将HTML转换为PugJinja2和Blade模板的交互式工具

    然而,当网页变得复杂时,HTML代码可能会变得难以维护。这就是模板引擎如Pug、Jinja2和Blade的作用。它们提供了一种更加结构化和模块化的语法,可以减少重复代码,提高代码可读性和可维护性。 **Pug** Pug(前身为...

    小程序页面生成工具

    小程序页面生成工具是一种高效开发微信小程序页面的辅助软件,它基于FreeMarker模板引擎...通过理解和熟练运用这种工具,开发者可以更专注于业务逻辑,提高开发效率,降低出错概率,让小程序的开发变得更加轻松和高效。

    javascript原理

    JavaScript事件处理机制使得用户与网页的交互变得更加灵活,比如在表单提交时,JavaScript可以验证数据,避免无效的服务器请求,提高用户体验。 为了保证JavaScript的标准化,Microsoft与ECMA合作,使得Internet ...

    转换为chm格式

    - **搜索功能**:内置的全文搜索功能使得查找特定信息变得简单。 - **易于分发**:作为一个单文件,CHM便于通过电子邮件或其他方式分享。 然而,也有需要注意的局限性: - **兼容性问题**:并非所有操作系统都支持...

    自动生成静态页面

    1. **数据更新**:如果网站需要频繁更新动态数据,手动更新静态页面会变得繁琐,需要借助Webhooks或其他自动化流程。 2. **交互复杂性**:对于高度交互的网站,静态页面可能无法满足需求,这时可能需要引入AJAX或...

    Ruby-Glim一个静态站点生成器它兼容Jekyll但速度更快

    1. **更快的速度**:Glim采用了优化的渲染引擎,减少了生成静态页面所需的时间,提高了整体性能。 2. **并发处理**:Glim支持多线程处理,可以并行生成页面,大大加快了构建过程。 3. **更强大的插件系统**:Glim的...

    wxparse(富文本解析文件)

    总的来说,`wxparse`是微信小程序开发中的利器,它使富文本解析变得简单易行,让开发者能够专注于业务逻辑,而不是纠结于前端展示细节。结合其丰富的特性与良好的社区支持,`wxparse`成为了解决微信小程序富文本问题...

    asp.net 生成静态页面

    1. **性能提升**:静态页面相对于动态页面而言,加载速度更快,因为它们不需要服务器端的实时处理。 2. **服务器压力减小**:静态页面减少了对服务器资源的需求,尤其是在高并发访问情况下,可以显著降低服务器负载...

    前端开源库-css-selector-extract

    然而,随着项目规模的增长,CSS文件可能会变得庞大且复杂,查找特定的选择器变得困难。css-selector-extract 库就是为了解决这个问题而诞生的,它提供了自动化的方式来提取和分析CSS选择器。 这个库的工作原理可能...

    Ajax基本运行原理

    ### Ajax基本运行原理详解 ...随着现代Web开发技术的进步,如jQuery库等工具的出现,使用Ajax变得更加简单高效。此外,诸如Fetch API这样的新API也逐渐取代了传统的`XMLHttpRequest`,为开发者提供了更简洁易用的接口。

    html5shiv.min.js 下载

    当`html5shiv.min.js`被引入到页面中时,它会在旧版IE浏览器中动态创建HTML5的新元素,从而使这些元素变得可识别并允许CSS对其进行样式控制。例如,你可以直接对`&lt;header&gt;`、`&lt;section&gt;`、`&lt;article&gt;`等HTML5新元素...

    Pro HTML5 and CSS5 Design Patterns

    - **第1章:设计模式:让CSS变得简单** - 介绍CSS的基本概念和设计模式的应用方法,为后续章节打下基础。 - **第2章:HTML设计模式** - 深入讲解HTML标记语言在设计中的应用,包括不同元素的选择和组合方式。 - **...

    HTML编辑器

    这对于初学者尤其有帮助,因为它们通常会提供可视化工具,使得布局和设计变得更加直观。 在学习HTML时,了解基本元素是非常重要的。例如,`&lt;html&gt;`、`&lt;head&gt;`和`&lt;body&gt;`标签构成了HTML文档的基本结构。`&lt;html&gt;`是...

    支付宝小程序-wxParse

    总之,支付宝小程序-wxParse是一个强大的富文本解析工具,它为支付宝小程序的开发带来了便利,使得处理复杂HTML内容变得更加简单高效。通过合理运用,开发者可以快速构建功能丰富的交互界面,提升用户在小程序中的...

    超轻量级 JSON / XML / YAML 解析门面 API,用法简单,不依赖具体的 JSON / XML / YAML 实现

    这篇介绍的是一个超轻量级的解析门面API,它提供了统一的接口来处理这三种格式的数据,使得在JSON、XML和YAML之间转换变得简单易行,而且这个API不依赖任何特定的JSON、XML或YAML实现,增加了其灵活性和可移植性。...

Global site tag (gtag.js) - Google Analytics