原文链接: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. GIT笔记命令行(1)

    Git简单易用,只要输入git就可以列出他的所有参数 C:\Users\spu>git usage: git [--version] [--help] [-C <path>] [-c ...

  2. Orcale 三层嵌套分页代码

    select * from( select emp.*,rownum a from ( select * from emp ) emp where rownum<7) where a>3

  3. mono for android Listview 里面按钮 view Button click 注册方法 并且传值给其他Activity 主要是context

    需求:为Listview的Item里面的按钮Button添加一个事件,单击按钮时通过事件传值并跳转到新的页面. 环境:mono 效果: 布局代码 主布局 <?xml version=" ...

  4. [httpserver]如何解析HTTP请求报文

    这个http server的实现源代码我放在了我的github上,有兴趣的话可以点击查看哦. 在上一篇文章中,讲述了如何编写一个最简单的server,但该程序只是接受到请求之后马上返回响应,实在不能更 ...

  5. 纯JS打造比QQ空间更强大的图片浏览器-支持拖拽、缩放、过滤、缩略图等

    在线演示地址(打开网页后,点击商家图册): http://www.sport7.cn/cc/jiangnan/football5.html 先看一看效果图: 该图片浏览器实现的功能如下: 1. 鼠标滚 ...

  6. MapReduce剖析笔记之七:Child子进程处理Map和Reduce任务的主要流程

    在上一节我们分析了TaskTracker如何对JobTracker分配过来的任务进行初始化,并创建各类JVM启动所需的信息,最终创建JVM的整个过程,本节我们继续来看,JVM启动后,执行的是Child ...

  7. MapReduce剖析笔记之六:TaskTracker初始化任务并启动JVM过程

    在上面一节我们分析了JobTracker调用JobQueueTaskScheduler进行任务分配,JobQueueTaskScheduler又调用JobInProgress按照一定顺序查找任务的流程 ...

  8. ASP.NET MVC 描述类型(一)

    ASP.NET MVC 描述类型(一) 前言 在前面的好多篇幅中都有提到过ControllerDescriptor类型,并且在ASP.NET MVC 过滤器(一)篇幅中简单的描述过,今天我们就来讲一下 ...

  9. Redis集群搭建与简单使用

    介绍安装环境与版本 用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master.3 salve 环境. redis 采用 redis-3.2.4 版本. 两台虚拟机都是 CentOS ,一台 ...

  10. ABP框架 - 动态Web Api层

    文档目录 本节内容: 创建动态Web Api控制器 ForAll 方法 重写 ForAll ForMethods Http 动词 WithVerb 方法 HTTP 特性 命名约定 Api 浏览器 Re ...