设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 IT综合资讯 查看内容

为什么每个前端开发者都要理解页面的渲染?

2014-7-4 11:14| 发布者: joejoe0332| 查看: 2838| 评论: 0|原作者: Moejser|来自: 伯乐在线

摘要: 今天我要将关注点放到页面渲染以及其重要性上。虽然已经有很多文章提到过这个主题了,但大部分信息都是零碎的片段。为了思考这件事情,我需要研究很多信息的来源。这也就是为什么我觉得我应该写这篇文章的原因。 ...


  我们从一个有transition的CSS class开始:

.has-transition {
   -webkit-transition: margin-left 1s ease-out;
      -moz-transition: margin-left 1s ease-out;
        -o-transition: margin-left 1s ease-out;
           transition: margin-left 1s ease-out;
}


  然后进行实现:

//我们的元素默认有"has-transition"属性
var $targetElem = $('#targetElemId');

//删除包含transition的class
$targetElem.removeClass('has-transition');

// 当包含transition的class已经没了的时候,改变元素属性
$targetElem.css('margin-left', 100);

// 再将包含transition的class添加回来
$targetElem.addClass('has-transition');

// 改变元素属性
$targetElem.css('margin-left', 50);


  上面的实现没有按照期望的运行。所有的修改都被浏览器缓存了,只在上面这段代码的最后才会执行。我们需要的是一次强制重排,我们可以通过进行以下修改来实现:

//删除包含transition的class
$(this).removeClass('has-transition');

// 改变元素属性
$(this).css('margin-left', 100);

//触发一次强制重排,从而使变化了的class或属性能够立即执行。
$(this)[0].offsetHeight; // offsetHeight仅仅是个例子,其他的属性也可以奏效。

// 再将包含transition的class添加回来
$(this).addClass('has-transition');

// 改变元素属性
$(this).css('margin-left', 50);

  现在这段代码如我们所期望的运行了。


  实际的优化建议


  汇总了一些有用的信息,我建议以下几点:

  • 创建合法的 HTML 和 CSS ,别忘了制定文件编码,Style 应该写在 head 标签中,script 标签应该加载 body 标签结束的位置。

  • 试着简化和优化 CSS 选择器(这个优化点被大多数使用 CSS 预处理器的开发者忽略了)。将嵌套层数控制在最小。以下是 CSS 选择器的性能排行(从最快的开始):

  1. ID选择器:#id

  2. class选择器: .class

  3. 标签: div

  4. 相邻的兄弟元素:a + i

  5. 父元素选择器: ul > li

  6. 通配符选择器: *

  7. 伪类和伪元素: a:hover ,你应该记住浏览器处理选择器是从右向左的,这也就是为什么最右面的选择器会更快——#id.class

div * {...} // bad
.list li {...} // bad
.list-item {...} // good
#list .list-item {...} // good
  1. 在你的脚本中,尽可能的减少 DOM 的操作。把所有东西都缓存起来,包括属性和对象(如果它可被重复使用)。进行复杂的操作的时候,最好操作一个“离线”的元素(“离线”元素的意思是与 DOM 对象分开、仅存在内存中的元素),然后将这个元素插入到 DOM 中。

  2. 如果你使用 jQuery,遵循jQuery 选择器最佳实践

  3. 要改变元素的样式,修改“class”属性是最高效的方式之一。你要改变 DOM 树的层次越深,这一条就越高效(这也有助于将表现和逻辑分开)。

  4. 尽可能的只对 position 为 absolute 或 fix 的元素做动画。

  5. 当滚动时禁用一些复杂的 :hover 动画是一个很好的主意(例如,给 body 标签加一个 no-hover 的 class)关于这个主题的文章


  想了解更多的细节,可以看一下这些文章:

  1. How browsers work

  2. Rendering: repaint, reflow/relayout, restyle


  希望这篇文章能够对你有所帮助!


原文链接: frontendbabel   翻译: 伯乐在线 - Moejser
译文链接: http://blog.jobbole.com/72692/


酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部