在DevTools中开始渲染,向下滑动一点点滚动条,然后停止滚动。

在结果中,注意frames总是在30ftps线上面,甚至都木有很接近69ftps线的(事实上帧执行的太缓慢以致于60ftps线在图上都不显示)

打开一个帧可以看见在scrol事件之后是一个函数回调,然很多分离的layout事件,每个分离的layout事件都有一个红色的小三角形,红色小三角形是强制同步layout( a forced synchronous layout )执行的标记。

Note

  • 被强制的synchronous layout发生在当浏览器在一个脚本中运行layout的时候,强制重新计算样式,所以需要再次运行layout。这个典型的发生在循环内部,就像下面的代码展示的一样,在一系列div中循环且重新设置它们的宽度属性,强制synchronous layout。
var newWidth = container.offsetWidth;
divs.forEach(function(elem, index, arr) {
elem.style.width = newWidth;
})

这里有很多css属性可以导致layout被触发;查看会触发layout的属性:CSS Triggers.

查看layout事件的详细信息,你可以看见被强制的同步layout提醒是被app.js中的colorizeAndScaleStories函数触发。

让我们检查函数

function colorizeAndScaleStories() {
var storyElements = document.querySelectorAll('.story');
// It does seem awfully broad to change all the
// colors every time!
for (var s = 0; s < storyElements.length; s++) {
var story = storyElements[s];
var score = story.querySelector('.story__score');
var title = story.querySelector('.story__title');
// Base the scale on the y position of the score.
var height = main.offsetHeight;
var mainPosition = main.getBoundingClientRect();
var scoreLocation = score.getBoundingClientRect().top -
document.body.getBoundingClientRect().top;
var scale = Math.min(1, 1 - (0.05 * ((scoreLocation - 170) / height)));
var opacity = Math.min(1, 1 - (0.5 * ((scoreLocation - 170) / height)));
score.style.width = (scale * 40) + 'px';
score.style.height = (scale * 40) + 'px';
score.style.lineHeight = (scale * 40) + 'px';
// Now figure out how wide it is and use that to saturate it.
scoreLocation = score.getBoundingClientRect();
var saturation = (100 * ((scoreLocation.width - 38) / 2));
score.style.backgroundColor = 'hsl(42, ' + saturation + '%, 50%)';
title.style.opacity = opacity;
}
}

注意height,width和line-height被计算,所有的这些属性将会导致layout被触发。

透明度属性也被设置了——但是透明度属性不会触发layout——这一行代码应用了新的样式,所以会触发样式的再次计算以及layout。

上面两个技术用于函数的主循环中将会导致强迫的同步layout问题。

虽然我们可以通过css样式修改来替代js,但是我们最好还是完全去除这些效果:最简单的就是——有时候最好的代码设置就是删除代码。

让我们去除上面的所有代码再次查看,你可以看见60ftps,性能好多了。

额外的layout和强制的同步layout提醒不存在了,帧执行的速度也很棒!

提高scroll性能的更多相关文章

  1. 如何提高scroll事件的性能

    1. chrome devtool 是诊断页面滚动性能的有效工具 2. 提升滚动时性能,就是要达到fps高且稳. 3. 具体可以从以下方面着手 使用web worker分离无页面渲染无关的逻辑计算 触 ...

  2. SQL Server-聚焦过滤索引提高查询性能(十)

    前言 这一节我们还是继续讲讲索引知识,前面我们讲了聚集索引.非聚集索引以及覆盖索引等,在这其中还有一个过滤索引,通过索引过滤我们也能提高查询性能,简短的内容,深入的理解,Always to revie ...

  3. [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)

    [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这 ...

  4. [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中)

    [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中) 本节要点: 上节介绍了多线程的基本使用方法和基本应用示例,本节深入介绍.NET ...

  5. [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上)

    [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上) 本节导读: 随着硬件和网络的高速发展,为多线程(Multithreading) ...

  6. 关于大小型项目如何最大限度提高WebAPi性能

    前言 WebAPi作为接口请求的一种服务,当我们请求该服务时我们目标是需要快速获取该服务的数据响应,这种情况在大型项目中尤为常见,此时迫切需要提高WebAPi的响应机制,当然也少不了前端需要作出的努力 ...

  7. 用CSS开启硬件加速来提高网站性能

    国外一篇文章,有点意思,转载过来,准备尝试下~ 中文地址:http://www.cnblogs.com/rubylouvre/p/3471490.html 原文地址:http://blog.teamt ...

  8. 转载--提高C++性能的编程技术

    读书笔记:提高C++性能的编程技术   第1章 跟踪范例 1.1 关注点 本章引入的实际问题为:定义一个简单的Trace类,将当前函数名输出到日志文件中.Trace对象会带来一定的开销,因此在默认情况 ...

  9. 用CSS开启硬件加速来提高网站性能(转)

    翻译文章,原文地址:http://blog.teamtreehouse.com/increase-your-sites-performance-with-hardware-accelerated-cs ...

随机推荐

  1. java判断日期与星期

    原文:http://www.open-open.com/code/view/1440592372888 import java.text.SimpleDateFormat; import java.u ...

  2. MySQL常用SQL整理

    MySQL常用SQL整理 一.DDL #创建数据库 CREATE DATABASE IF NOT EXISTS product DEFAULT CHARSET utf8 COLLATE utf8_ge ...

  3. Git安装及SSH Key管理之Mac篇

    1.下载git客户端,下载地址为:https://git-scm.com/download/mac 2.打开安装包,可以看到此时的界面为:   我们需要把.pkg的安装包安装到系统当中.我双击了安装包 ...

  4. angular - 新建项目 - 2

    ng new testNg 新建项目后,从网络上拉取模板(最后缓存下来,我们下次创建项目的时间将会减少80%) 安装过程中,需要我们提供Git账号和姓名 最后,我们进入 useNg 然后,启动服务器 ...

  5. WMS8_基本操作

    建立分拣[收货.出货.领料]         点击仪表盘上的任何一个 All operations 链接切换至分拣 列表视图         点击 creae 按钮,建立一个新的分拣     part ...

  6. 关于ASP.NET MVC中Response.Redirect和RedirectToAction的BUG (跳转后继续执行后面代码而不结束进程)以及处理方法

    关于ASP.NET MVC中Response.Redirect和RedirectToAction的BUG (跳转后继续执行后面代码而不结束进程)以及处理方法   在传统的ASP.NET中,使用Resp ...

  7. Audio原理图设计

    1.DMIC 1)当双MIC时,通过MIC上的Selection PIN脚PULL  U/D进行左右channel选择.

  8. shell tr命令的使用

    http://fyan.iteye.com/blog/1172279 tr是translate的简写,亦即翻译,但是遗憾的是,它不能翻译句子,只能翻译单个字符. 1 tr的工作原理是什么? 先记住一点 ...

  9. FastDFS的配置、部署与API使用解读(8)FastDFS多种文件上传接口详解(转)

    1.StorageClient与StorageClient1的区别 相信使用happy_fish的FastDFS的童鞋们,一定都熟悉StorageClient了,或者你熟悉的是StorageClien ...

  10. 发送验证码60s倒计时实现

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...