原文链接:https://github.com/AlloyTeam/AlloyTouch/wiki/AlloyTouch-0.2.0

背景

公司师姐昨日在KM发了篇长文,主要结论RAF+transform3d就是不如transition+transform3d平滑流畅,但是transition+transform3d没有translate属性变更change回调,只有transitionend的事件回调。最后得出的解决方案:

支持动态切换 raf 和 transition~~

AlloyTouch在这个基础上更加激进,直接支持change事件,不用用户去关心RAF还是transition,也不用用户去手动切换。那么是怎么做到了?往下看。

主要更新

AlloyTouch CSS版本已经支持change事件回调了

鱼和熊掌兼得!慢,什么是鱼?什么是熊掌?

鱼,性能。由于RAF+transform3d就是不如transition+transform3d平滑流畅。CSS版本在处理DOM局部滚动的时候明显更加smooth。

熊掌,change回调。以前使用CSS版本是无法监听到dom的translate属性变更change回调,只有transitionend的事件回调。

现在鱼和熊掌可以兼得!

举个例子

这里就是使用CSS版本制作的,而且滚动过程中可以执行change回调,所以头部的动画都在在change回调里进行处理的。

原理分析

  • 用户touchstart的时候开启RAF定时器
  • 定时器一直计算读取滚动元素的translate属性,并抛给用户传入的change事件
  • transitionend的时候关闭RAF定时器

对,就是这么简单!

代码分析

...
...
_start: function (evt) {
cancelAnimationFrame(this.tickID);
this._tick();
...
...
_tick: function () {
this.change.call(this, this.getComputedPosition());
this.tickID = requestAnimationFrame(this._tick.bind(this));
},
...

touchstart的时候会去触发_start事件,先去cancelAnimationFrame取消掉当前的循环,再重新开启一个,滚动点停。还可以看到,在不断tick的过程中,change函数是一直会被执行,而且计算出的translate会传给change回调。再看getComputedPosition:

getComputedPosition: function () {
var matrix = window.getComputedStyle(this.scroller, null);
matrix = matrix[transform].split(')')[0].split(', ');
return this.vertical ? (+(matrix[13] || matrix[5])) : (+(matrix[12] || matrix[4]));
},

这里会通过getComputedStyle去计算出滚动DOM的matrix,然后提取出translate出来。

读取

...
...
if (this.step) {
this.correction();
if (this._endCallbackTag) {
this._endTimeout = setTimeout(function () {
this.animationEnd.call(this, current);
cancelAnimationFrame(this.tickID);
}.bind(this), 400);
this._endCallbackTag = false;
}
} else {
this.animationEnd.call(this, current);
cancelAnimationFrame(this.tickID);
}
...

当触发了_transitionEnd之后,会去清除定时器。这里需要注意,当用户传了step配置,会延迟400ms清除定时器,因为校正step的过程需要400ms。

Q&A

问:那么非CSS版本还有存在的意义吗?

答:有的,因为非CSS不仅仅可以用于DOM,还能用于WebGL、Canvas,并且运动属性无关。CSS版本没有这些功能。

问:AlloyTouch如何做到这么小的尺寸?

答:AlloyTouch专注于数字的加速减速和回弹,抽象级别较高,而且适用场景较广。

问:有没有出React版本的计划?

这个正在计划当中,但是事实上,不是所有页面都适合React,比如无限滚动,不使用React性能会更优。有的时候要在体验最优和工程化最优做一个权衡,如果体验达不到预期,要学会放弃工程化最优的方案。

问:AlloyTouch和transformjs什么关系?

没有关系。AlloyTouch专注于触摸和运动,transformjs提供DOM和任意对象transformation能力以及一些基础工具函数。

但是建议一起使用。这里需要注意的是,CSS版本的AlloyTouch强制必须和transformjs一起使用。

开始AlloyTouch

Github:https://github.com/AlloyTeam/AlloyTouch

任何意见和建议欢迎new issue,我们会第一时间反馈。

AlloyTouch 0.2.0发布--鱼和熊掌兼得的更多相关文章

  1. SaaS服务和个性化需求,就不能鱼和熊掌兼得吗?

    随时随地.轻松高效,移动工作让人类的自由度最大化.但企业的移动化过程却不轻松:要综合考虑销售.产品.客服.市场销售.人力资源等错综复杂的流程和需求,以及原有IT系统.数据信息的对接. 千企千面,很难有 ...

  2. Redis 3.0正式版发布,正式支持Redis集群

    Redis是一个开源.基于C语言.基于内存亦可持久化的高性能NoSQL数据库,同时,它还提供了多种语言的API.近日,Redis 3.0在经过6个RC版本后,其正式版终于发布了.Redis 3.0的最 ...

  3. RDIFramework.NET平台代码生成器V3.0版本全新发布-更新于20160518(提供下载)

    最新版本请转到:RDIFramework.NET平台代码生成器V3.1版本全新发布-更新于2016-10-08(提供下载) RDIFramework.NET代码生成器V3.0版本修改了针对3.0版本的 ...

  4. Bootstrap v4.0.0-alpha.5 发布,大量更新

    Bootstrap v4.0.0-alpha.5 发布了,Bootstrap是快速开发Web应用程序的前端工具包.它是一个CSS和HTML的集合,它使用了最新的浏览器技术,给你的Web开发提供了时尚的 ...

  5. (转载)一个用于Gnome桌面的下拉式终端: Guake 0.7.0 发布

    转自:https://linux.cn/article-5507-1.html Linux的命令行是最好.最强大的东西,它使新手着迷,并为老手和极客的提供极其强大的功能.那些在服务器和生产环境下工作的 ...

  6. Ionic 2.0.0-rc.1 发布,HTML5 移动应用框架

    Ionic 2.0.0-rc.1 发布了,Ionic Framework 是个高级的 HTML5 移动端应用框架,是个很漂亮的使用 HTML5 开发混合移动应用前端框架.本次更新内容如下: Bug 修 ...

  7. MVC4.0中项目发布遇到IE11时session存入URL中,导致记不住密码的问题

    ///MVC4.0中项目发布遇到IE11时session存入URL中,导致记不住密码的问题,在webconfig中配置<system.web><authentication mode ...

  8. log-malloc2 0.2.4 发布

    log-malloc2 0.2.4 发布了,该版本修复了日志格式输出的 bug. og-malloc2 是一个 malloc 日志预加载库,用于检测内存泄漏问题.

  9. TypeScript 0.9.1 发布,新增 typeof 关键字

    TypeScript 0.9.1 发布了,该版本提升了编译器和语言的性能,增加新的语言特性 typeof ,更好的 this 处理等.详细介绍请看发行说明. TypeScript 是微软新推出的一种语 ...

随机推荐

  1. 数据库备份并分离日志表(按月)sh 脚本

    #!/bin/sh year=`date +%Y` month=`date +%m` day=`date +%d` hour=`date +%H` dir="/data/dbbackup/f ...

  2. BZOJ 2119: 股市的预测 [后缀数组 ST表]

    2119: 股市的预测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 331  Solved: 153[Submit][Status][Discuss ...

  3. hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()的用法

    javascript中有原型这么一个概念,任何一个构造函数都有它对应的原型(prototype),我们可以给这个原型赋予一些我们想要的属性,像下面这样: function Gadget(name, c ...

  4. egret GUI 和 egret Wing 是我看到h5 最渣的设计

    一个抄袭FlexLite抄的连自己思想都没有,别人精髓都不懂的垃圾框架.也不学学MornUI,好歹有点自己想法. 先来个最小可用集合吧: 1. egret create legogame --type ...

  5. 升级xcode8 之后遇到的一些问题

    昨天趁着快下班,就将xcode升级为8了,运行起来并没有什么问题,今天一早过来运行,结果,模拟器打不开了.... 1. unable to boot the Simulator 解决办法:重启Mac时 ...

  6. 游戏服务器菜鸟之C#初探四游戏服务

    经过多次折腾之后,在一次进行了一次重大的重构,去解决问题 主要重构如下 1.将原来的单一协议修改多协议进行,一些查询.认证的功能都采用HTTP进行,避免全部采用TCP链接资源的消耗: 2.原来单一的部 ...

  7. 在linux平台实现atosl

    ➠更多技术干货请戳:听云博客 序言 怎么在linux 平台下实现一个类似于mac 平台下的 atos 工具( iOS 符号化解析)? 分析问题 在github上找到了几年前的开源实现,[https:/ ...

  8. 前端学HTTP之网络基础

    × 目录 [1]网络 [2]OSI [3]TCP/IP 前面的话 HTTP协议对于前端工程师是非常重要的.我们在浏览网站时,访问的每一个WEB页面都需要使用HTTP协议实现.如果不了解HTTP协议,就 ...

  9. Log4net入门(WCF篇)

    在上一篇Log4net入门(ASP.NET MVC 5篇)中,我们讲述了如何在ASP.NET MVC 5项目中使用log4net.在这一篇中,我们将讲述如何在WCF应用中使用log4net,为了讲述这 ...

  10. [C#] 走进异步编程的世界 - 在 GUI 中执行异步操作

    走进异步编程的世界 - 在 GUI 中执行异步操作 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5877042.html 序 这是继<开始接 ...