写在前面
正式发布了 。
Made css3 transform super easy. Made 60 FPS easy.
Figure 1
作为 Omi 组件化开发特效运动解决方案,让你轻松在Omi项目里快速简便支持CSS3 Transform设置。css3transform 是经受过海量项目洗礼的,作为移动 Web 特效解决方案,在、手Q兴趣部落、日迹、QQ、QQ附近等项目中广泛使用,以激进的修改DOM属性为代价,带来极为便利的可编程性。
你可以通过快速了解它。
上面的例子都是原生 js 的,css3transform 也拥有react版本,你也可以在 react 中以声明式的方式使用 css3transform:
render() { return ( <Transform translateX={100} scaleX={0.5} originX={0.5}> <div>你要运动的 DOM</div> </Transform>) }复制代码
这都不是重点,重点是 omi-transform。
3分钟掌握 omi-transform
通过npm安装
npm install omi-transform复制代码
使用
import { render, WeElement, define } from "omi"import "omi-transform"define("my-app", cl
ass extends WeElement { static observe = true install() { ateZ = 30 this.linkRef = (e) => { this.animDiv = e } } installed() { setInterval(() => { //slow //ateZ += 2 //fast ateZ += 2 //sync for update call of any scenario ateZ = ateZ }, 16) } render(props, data) { return ( <css3-transform rotateZ={ateZ} translateX={0} perspective={0} > <div ref={this.linkRef}> omi-transform </div> </css3-transform> ) } }) render(<my-app />, "body") 复制代码
∙ 把需要运动的 DOM 使用 <css3-transform></css3-transform> 包裹
∙ 在需要使用 css3transform 的 DOM 上标记 ref 用来直接操作 DOM
∙ 在组件函数里便可以使用 fs.animDiv 来读取或者设置 css transform属性
∙ 支持 "translateX", "translateY", "translateZ", "scaleX", "scaleY", "scaleZ", "rotateX", "rotateY", "rotateZ", "skewX", "skewY", "originX", "originY", "originZ", "perspective" 这些属性设置和读取
∙ perspective 表示透视投影的距离
组件里的某个 DOM 在运动过程中,可能会由于其他逻辑,进行 update。有可能是用户交互,有可能是数据返回的回调。所以,update 前后,DOM 的状态的保留显得尤其重要,不然的话就会有闪烁、跳跃的效果或者其他显示逻辑错误。
可以看到上面的代码在 DOM 运动过程中时不进行 Diff ?组件不进行 update ?万一组件 update,所有运动的状态都会丢失?Omi 怎么解决这个问题?上面的代码已经给出了答案:
使用 ateZ 来同步运动 DOM 的状态防止意外的刷新(update)
支持的属性
Property | Describe |
translateX | translateX |
translateY | translateY |
translateZ | translateZ |
scaleX | scaleX |
scaleY | scaleY |
scaleZ | scaleZ |
rotateX | rotateX |
rotateY | rotateY |
rotateZ | rotateZ |
skewX | skewX |
skewY | skewY |
originX | the basic x point of rotation |
originY | the basic y point of rotation |
originZ | the basic z point of rotation |
perspective | Perspective projection distance |
你既可以 get 也可以 set。
性能对比
因为 react 版本会有 diff 过程,然后 apply diff to dom 的过程,state 改变不会整个 innerHTML 全部替换,所以对浏览器渲染来说还是很便宜,但是在 js 里 diff 的过程的耗时还是需要去 profiles 一把,如果耗时严重,不在 webworker 里跑还是会卡住UI线程导致卡顿,动画卡顿丢帧、交互延缓等。所以要看一看 CPU 的耗时还是很有必要的。
下面数据是对比 omi-transform 和 react-transform,两种方式使用 chrome profiles 了一把。
先看总耗时对比:
react-transform:
[MISSING IMAGE: , ]
Figure 2
omi-transform:
[MISSING IMAGE: , ]
Figure 3
∙ react 在8739秒内CPU耗时花费了近似1686ms
∙ Omi 方式在9254ms秒内CPU耗时花费近似700ms
在不进行 profiles 就能想象到 react 是一定会更慢一些,因为 state 的改变要走把 react 生命周期走一遍,但是可以看到 react 的耗时还是在可以接受的范围,没有慢到难以接受。
而 Omi 的方式则和传统的原生 js 的耗时一模一样。因为运动过程不进行DOM Diff,直接操作 DOM!!
Omi 自身对比
//ateZ += 2复制代码
//ateZ += ateZ = ateZ复制代码
主要对比上面两个代码块的执行效率,打开谷歌浏览器的 Performance 运行 10 秒左右,打开 Summary 对比:
Slow | Fast |
[MISSING IMAGE: Omi, Omi ] Figure 4 | [MISSING IMAGE: Omi, Omi ] Figure 5 |
可以看到 omi 的两种方式都拥有很高性能,10秒钟内拥有大量的空闲时间,但是 fast 确实更加 fast,scripting 的耗时更短。但是优势不明显是为什么?因为 DOM 结构简单,如果 DOM 结构越复杂, fast 直接操作 DOM 的方式会把 slow 的方式甩开一大截!下面进行验证一下:
先发 render 的 DOM 结构修改成复杂的:
[MISSING IMAGE: Omi, Omi ]
Figure 6
打开谷歌浏览器的 Performance 运行 10 秒左右,打开 Summary 对比:
Slow | Fast |
[MISSING IMAGE: Omi, Omi ] Figure 7 | [MISSING IMAGE: Omi, Omi ] Figure 8 |
可以看到 Scripting Time 已经拉开了差距!
对比前后两次的数据:
DOM 结构 | Slow | Fast |
简单 | [MISSING IMAGE: Omi, Omi ] Figure 9 | [MISSING IMAGE: Omi, Omi ] Figure 10 |
复杂 | [MISSING IMAGE: Omi, Omi ] Figure 11 | [MISSING IMAGE: Omi, Omi ] Figure 12 |
可以看到 Fast 的前后两次没有太大差别,Slow 前后两次差距巨大。那么 Fast 内核 css3transform 原理是什么?
css3transform
安装
npm install css3transform复制代码
API
Transform(domElement, [notPerspective])复制代码
通过上面一行代码的调用,就可以设置或者读取 domElement 的"translateX", "translateY", "translateZ", "scaleX", "scaleY", "scaleZ", "rotateX", "rotateY", "rotateZ", "skewX", "skewY", "originX", "originY", "originZ"!
大道至简。
使用姿势
Transform(domElement)//or Transform(domElement, true);//set anslateX = 100 domElement.scaleX = 0.iginX = 50//get console.anslateX)复制代码
传统的CSS3编程的问题
以前,我们一般使用animate.css、zepto/jQuery的animate方法或者tween.js+css3进行交互特效编程。总结下来有三个缺点:
∙ 不直观
∙ 不直接
∙ 不方便
不直观
看下面这张图:
[MISSING IMAGE: , ]
Figure 13
顺序影响结果,不直观。那么为什么会是这个结果?可以通过new WebKitCSSMatrix(transform_str)对比最终的matrix。
[MISSING IMAGE: , ]
Figure 14
这也直接说明了矩阵不符合交换律。A*B != B*Ajs控制css3动画触发
不直接
zepto姿势:
$("#some_element").animate({ opacity: 0.25, left: '50px', color: '#abcdef', rotateZ: '45deg', translate3d: '0,10px,0' }, 500, 'ease-out')复制代码
translate3d: '0,10px,0'非常不方便,无法step递进递减控制。更别提配合一些运动或者时间的库来编程了。可能你会反驳'ease-out'不就可以实现缓动吗?但是如果我需要让x和y以及z分别对应不同的缓动函数,这种基于字符串编程的形式就费劲了~~ 这里还需要注意的是,zepto里的顺序也会影响结果。因为其最后也是拼成string赋给dom元素。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论