zoukankan      html  css  js  c++  java
  • html基础问题总结

    1.reflow

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

      构造frame, 以建立对象树(DOM树)
      reflow, 以确定对象位置,或者是调用mozilla的Layout(这里是指源码的实现)
      绘制,以便对象能显示在屏幕上
    总结了在哪些情况下会导致reflow发生:
      改变窗囗大小
      改变文字大小
      添加/删除样式表
      内容的改变,如用户在输入框中敲字(这样也会-_-||)
      激活伪类,如:hover (IE里是一个兄弟结点的伪类被激活)
      操作class属性
      脚本操作DOM
      计算offsetWidth和offsetHeight
      设置style属性

    reflow是不可避免的,只能将reflow对性能的影响减到最小。Nicole提出6点建议:

      尽可能限制reflow的影响范围。以上面的代码为例,要改变p的样式,class不要加在div上,通过父级元素影响子元素不好。最好直接加在p上。
      通过设置style属性改变结点样式的话,每设置一次都会导致一次reflow。所以最好通过设置class的方式。
      实现元素的动画,它的position属性应当设为fixed或absolute,这样不会影响其它元素的布局。
      权衡速度的平滑。比如实现一个动画,以1个像素为单位移动这样最平滑,但reflow就会过于频繁,CPU很快就会被完全占用。如果以3个像素为单位移动就会好很多。
      不要用tables布局的另一个原因就是tables中某个元素一旦触发reflow就会导致table里所有的其它元素reflow。在适合用 table的场合,可以设置table-layout为auto或fixed,这样可以让table一行一行的渲染,这种做法也是为了限制reflow的 影响范围。
      很多情况下都会触发reflow,如果css里有expression,每次都会重新计算一遍。

    总的来说,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,道理应该如此。

    关于reflow的hack用法

    我们常常遇到这种产品需求,tab标签栏开始固定,当滚动向下超过该标签栏后便会变成fixed元素,一直出现在头部,这样的需求在电脑上没有问题,但是在iPhone5s以下的手机常常会出现小范围错位或者快速移动大范围错位的问题

    这个时候我们可以引起reflow迫使浏览器重绘以解决这个问题,这里推荐一个奇怪的hack写法:同时设置三个image元素的src属性,便可以全范围解决该难题, 该方案被团队证实并得到应用。

    //三图片src,引发reflow,处理fixed方案惯性问题

    var el = this.els.ctlc.find('img');

    $(el[0]).attr("src", 'http://res.m.ctrip.com/html5/Content/images/144.png');

    $(el[1]).attr("src", 'http://res.m.ctrip.com/html5/Content/images/144.png');

    $(el[2]).attr("src", 'http://res.m.ctrip.com/html5/Content/images/144.png');

    另外,上图中的tab标签下面的蓝线具有动画,但是在小米或者三星手机上可能不会移动,这个时候也可以动态引起reflow解决这个BUG。

    其它

    l  CSS选择器尽量使用id与class,避免过度层叠

    l  避免使用数值,比如:border: none不会引起渲染,而boder: 0会

    l  动画时候让元素脱离文档流,以免导致大量reflow

    l  避免逐条修改DOM样式,改以className实现同样功能

    l  操作DOM时将display设置为none,因为这种元素不会影响渲染,或者操作fragment对象取代操作显示在页面上的DOM

    l  避免将获取DOM样式属性的操作写在循环中,可能引起重复reflow

  • 相关阅读:
    字符串混淆技术应用 设计一个字符串混淆程序 可混淆.NET程序集中的字符串
    运用Mono.Ceci类库修改.NET程序集 走上破解软件的道路
    字符串反混淆实战 Dotfuscator 4.9 字符串加密技术应对策略
    数学:《初等书论》素数与合数
    数学:《线性代数》矩阵乘积 之 代码实现
    数学:《线性代数》方阵求逆 之 代码实现
    数学:《线性代数》矩阵运算
    数学:《线性代数》矩阵初等行变换及其应用(线性方程求解)
    数学:《概率》条件概率公式
    Entityframework:启用延时加载的主意事项(只为强化记忆)
  • 原文地址:https://www.cnblogs.com/juexin/p/7212173.html
Copyright © 2011-2022 走看看