当前位置: 首页 > news >正文

Reflow

转自:http://www.ued163.com/?p=661

在CSS规范中有一个渲染对象的概念,通常用一个盒子(box, rectangle)来表示。mozilla通过一个叫frame的对象对盒子进行操作。frame主要的动作有三个:

* 构造frame, 以建立对象树(DOM树)
* reflow, 以确定对象位置,或者是调用mozilla的Layout(这里是指源码的实现)
* 绘制,以便对象能显示在屏幕上

总的来说,reflow就是载入内容树(在HTML中就是DOM树)和创建或更新frame结构的响应的一种过程。

要 提高页面性能,其实就是避免reflow的开销。那么,有哪些方面是需要reflow的呢?比如,未指定图片宽高的话,图片的载入会使页面 reflow, 因为要根据图片宽高来更新frame。这里就有一个提高页面性能的小技巧:如果事先能够确定图片宽高的话,最好在HTML里写上。

在 编写一些常见的动态效果时,一般使用CSS的display来切换可见性。很不幸,这也会产生reflow. 把元素置为display:none,相当于把这个元素的frame销毁了,再置回非none时,需要重新构造frame,这就产生了reflow. 而另外一个切换可见性的属性visibility则不存在reflow问题,置为visibility:hidden的元素的frame并没有销毁,需要 显示的时候其实就是一个绘制(上面提到的动作第三步)过程而已,没有reflow,因此效率会更高。如果你看过一些JavaScript库/框架的源码, 会发现它们大量使用visibility而不是display,道理应该如此。

转自:http://www.99css.com/2009/06/minimizing-browser-reflow.html

 

 

浏 览器为了重新渲染部分或整个页面,重新计算页面元素位置和几何结构(geometries)的进程叫做 reflow。由于 reflow 是一种浏览器中的用户拦截(user-blocking)操作,所以了解如何减少 reflow 次数,及不同的文档属性(DOM 层级(DOM depth),CSS 效率,不用类型的 style 变化)对 reflow 次数的影响对开发者来说非常必要。有时 reflow 页面中的一个元素会 reflow 它的父元素(译注:这里是复数)以及所有子元素。

有多种用户操作和 DHTML 变化可能会触发 reflow。调整浏览器窗口的大小,用 javascript 计算样式(computed styles),在 DOM 中创建删除元素,改变元素的 class 都会触发 reflow。值得注意的是,有些操作会多次触发 reflow,超出你的想象。下图源自 Steve Souders 的演讲 "Even Faster Web Sites":

从上表可以很明显的看出,在所有浏览器中并非所有 javascript 控制的样式都触发 reflow,即使触发了触发的次数也不尽相同。同时可以看出现代浏览器在控制 reflow 次数方面做的越来越好。

 在 Google,我们通过多种方式对我们的页面及 Web 应用测速,同时 reflow 是我们增加 UI 时考虑的一个关键因素。我们致力于传达轻快的(lively),交互性强的(interactive)和令人愉悦的(delightful)的用户体验。

原则

下面是一些减小 reflow 的原则:

    1. 减少不必要的 DOM 层级(DOM depth)。改变 DOM 树中的一级会导致所有层级的改变,上至根部,下至被改变节点的子节点。这导致大量时间耗费在执行 reflow 上面。
    2. 尽量减少 CSS 规则,去除未用到的 CSS。
    3. 如果做复杂的表现变化,如动画,让它脱离文档流。用绝对定位或 fixed 定位来完成。
    4. 避免不必要的复杂的 CSS 选择器,尤其是后代选择器(descendant selectors),因为为了匹配选择器将耗费更多的 CPU。

转载于:https://www.cnblogs.com/chris-oil/archive/2013/01/11/2855849.html

相关文章:

  • emacs-shell
  • WPF 去除头部,实现拖动
  • shell四大变量和实例_李强强
  • 通过SharpShell快速实现Windows Shell扩展
  • 简明 Vim 练级攻略 | 酷壳 - CoolShell.cn
  • 简单.net 数组
  • C# List数据类型的简单使用
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • CentOS VNC安装
  • 一个(次)线程的生命史
  • 查看内存使用情况(转)
  • 《算法导论》读书笔记之第6章 优先级队列
  • 自动文字提示列表
  • keyboard Button
  • App应用里应该自动跳转到系统设置界面吗?
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • Flex布局到底解决了什么问题
  • gcc介绍及安装
  • java8-模拟hadoop
  • JavaScript对象详解
  • React-Native - 收藏集 - 掘金
  • Selenium实战教程系列(二)---元素定位
  • springboot_database项目介绍
  • vagrant 添加本地 box 安装 laravel homestead
  • 如何胜任知名企业的商业数据分析师?
  • 微服务框架lagom
  • 学习JavaScript数据结构与算法 — 树
  • FaaS 的简单实践
  • Java数据解析之JSON
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​Spring Boot 分片上传文件
  • (1)bark-ml
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (七)Knockout 创建自定义绑定
  • (转)ObjectiveC 深浅拷贝学习
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • ./和../以及/和~之间的区别
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net CHARTING图表控件下载地址
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .Net MVC + EF搭建学生管理系统
  • .Net6 Api Swagger配置
  • .NET学习全景图
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @javax.ws.rs Webservice注解
  • @RequestBody与@ResponseBody的使用
  • [ IO.File ] FileSystemWatcher
  • [51nod1610]路径计数
  • [Android 13]Input系列--获取触摸窗口
  • [BT]BUUCTF刷题第9天(3.27)
  • [C++] 默认构造函数、参数化构造函数、拷贝构造函数、移动构造函数及其使用案例
  • [C++]C++入门--引用
  • [CF703D]Mishka and Interesting sum/[BZOJ5476]位运算