打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Omi官方插件系列 。。支持CSS3 Transform设置

原文链接 - https://github.com/AlloyTeam/omi/tree/master/tutorial

写在前面

Omi框架正式发布了omi-transform作为Omi组件化开发特效运动解决方案,让你轻松在Omi项目里快速简便支持CSS3 Transform设置。先说说 transform.js (npm上的名字是 css3transform)。transform.js作为移动Web特效解决方案,在手Q兴趣部落、日迹、QQ群、QQ附近等项目中广泛使用,以激进的修改DOM属性为代价,带来极为便利的可编程性。

你可以通过http://alloyteam.github.io/AlloyTouch/transformjs/快速了解它。

上面官网的例子都是原声js的,transformjs也拥有react版本,你也可以在react中以声明式的方式使用transformjs:

  1. render() {
  2. return (
  3. <Transform
  4. translateX={100}
  5. scaleX={0.5}
  6. originX={0.5}>
  7. <div>sth</div>
  8. </Transform>
  9. );
  10. }

3分钟掌握omi-transform

演示

http://alloyteam.github.io/omi/plugins/omi-transform/example/simple/

通过npm安装

npm install omi-transform

使用

  1. import Omi from 'omi';
  2. import OmiTransform from '../../omi-transform.js';
  3. OmiTransform.init();
  4. class App extends Omi.Component {
  5. constructor(data) {
  6. super(data);
  7. }
  8. installed(){
  9. setInterval(function(){
  10. this.refs.test.rotateZ += 0.1;
  11. }.bind(this));
  12. }
  13. render() {
  14. return `
  15. <div omi-transform class="test" ref="test" rotateZ="45" translateX="100" perspective="400">
  16. omi-transform
  17. </div>
  18. `;
  19. }
  20. }
  21. Omi.render(new App(),"#container");
  • 在需要使用transformjs的DOM上标记 omi-transform 和 ref="xxx"

  • 在组件函数里便可以使用 this.refs.xxx 来读取或者设置 css transform属性

  • this.refs.xxx 支持 "translateX", "translateY", "translateZ", "scaleX", "scaleY", "scaleZ", "rotateX", "rotateY", "rotateZ", "skewX", "skewY", "originX", "originY", "originZ", "perspective"这些属性设置和读取

  • 没有标记perspective的话代码没有透视投影

性能对比

因为react版本会有diff过程,然后apply diff to dom的过程,state改变不会整个innerHTML全部替换,所以对浏览器渲染来说还是很便宜,但是在js里diff的过程的耗时还是需要去profiles一把,如果耗时严重,不在webworker里跑还是会卡住UI线程导致卡顿,交互延缓等。所以要看一看CPU的耗时还是很有必要的。

下面数据是对比omi-transform和react-transform,两种方式使用chrome profiles了一把。

先看总耗时对比

react-transform:

omi-transform:

  • react在8739秒内CPU耗时花费了近似1686ms

  • Omi方式在9254ms秒内CPU耗时花费近似700ms

在不进行profiles就能想象到react是一定会更慢一些,因为state的改变要走把react生命周期走一遍,但是可以看到react的耗时还是在可以接受的范围,没有慢到难以接受。

而Omi的方式则和传统的原生js的耗时一模一样。以为运动过程不进行DOMI Diff!!

慢着?不进行Diff?意思就是组件不进行update?
意思就是万一组件update,所有运动的状态都会丢失?Omi怎么解决这个问题?

状态保存

组件里的某个DOM在运动过程中,可能会由于其他逻辑,进行update。有可能是用户交互,有可能是数据返回的回调。所以,update前后,DOM的状态的保留显得尤其重要,不然的话就会有闪烁、跳跃的效果或者其他显示逻辑错误。

  1. ...
  2. constructor(data) {
  3. super(data);
  4. //初始状态
  5. this.rotateZ = 45;
  6. }
  7. installed(){
  8. setInterval(() =>{
  9. //sync for update 记录同步到this.rotateZ
  10. this.rotateZ = this.refs.test.rotateZ += 0.1;
  11. });
  12. }
  13. render() {
  14. //通过 ${this.rotateZ} 设置rotateZ
  15. return `
  16. <div omi-transform class="test" ref="test" rotateZ="${this.rotateZ}" translateX="100" perspective="400" >
  17. omi-transform
  18. </div>
  19. `;
  20. }
  21. ...

上面的所有例子和代码可以在这里找到。

Omi相关

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
VUE踩坑——正在进行中……
常见 React 面试题
这个应该才是大家都想要的《强势整理+MACD二次翻红》吧!!! - 选股公式 - 股海明灯...
好吧,CSS3 3D transform变换,不过如此! ? 张鑫旭
一篇文章教会你利用html5和css3实现3D立方体效果图
【转载】【聊代码】第一四六集 css样式(二十三)单曲单行歌词逐字变色
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服