vue 组件中使用 transition 和 transition-group实现过渡动画


Posted in Javascript onJuly 09, 2019

前言

记一次vue 组件中使用 transition 和 transition-group 设置过渡动画,总结来说可分为分为 name 版, js 钩子操作类名版, js 钩子操作行内样式版...

template模板结构

// 单个元素
  <transition name="自定义名字">
   <p v-if="show">hello</p>
  </transition>
 // 列表元素: 注意group的直接子元素是v-for渲染出来的
  <ul class="list">
   <transition-group name="list">
    <li v-for="(item, index) in gameList" :key="item.id">
     <app-horizontal :itemData="item"></app-horizontal>
    </li>
   </transition-group>
  </ul>

name 版,name 为组件中的属性

出现的过程: name-enter(初始态) => name-enter-active(中间态) => name-enter-to(终止态)
消失的过程: name-leave => name-leave-active => name-leave-to
以进场过渡动画为例子

我们可以分别设置 enter 阶段 和 enter-to 阶段的动画

  1.设置进入时需要过渡的属性

.name-enter
 {
  opacity: 0;
  transform: translateY(30px)
 }

  2.然后在 name-enter-active中设置过渡时间

.name-enter-active {
  transition: all .3s;
 }

  3.最后在 name-enter-to 中写上终止态属性

    其实终止态的opacity: 1;transform: none; 是默认的,可以不用写

.name-enter-to {
  opacity: 1;
  transform: translateY(0);
 }

  如果要给列表中的元素设置交错的效果, 元素不多的话可以添加 delay 属性

.name-enter-active:nth-child(3n+1) {
  transition-delay: 0s;
 }
 .name-enter-active:nth-child(3n+2) {
  transition-delay: .1s;
 }
 .name-enter-active:nth-child(3n+3) {
  transition-delay: .2s;
 }

  离场动画同理...

js 钩子实现过渡动画: 通过操作类名; 就是 name 版的 js 实现

// 例如实现上述列表依次显示
 <ul class="list">
  <transition-group
   v-bind:css="false"
   v-on:before-enter="beforeEnter"
   v-on:enter="enter"
   v-on:after-enter="afterEnter">
   <li v-for="(item, index) in gameList" 
    :key="item.id" 
    :data-delay="index*100" 
   >
     <app-horizontal :itemData="item"></app-horizontal>
   </li>
  </transition-group>
 </ul> 
 // 
 methods: {
  // 事先定义上述类名
  // 在beforeEnter enter afterEnter 钩子中手动操作上述类名
  
  // 初始态
  beforeEnter(dom) {
   dom.classList.add('list-enter', 'list-enter-active');
  },
  // 中间态
  enter(dom,done) {
   // 通过 setTimeout + dataset 实现过渡
   let delay = dom.dataset.delay;
   setTimeout(function () {
    dom.classList.remove('list-enter');
    dom.classList.add('list-enter-to');
    //监听 transitionend 事件
    var transitionend = window.ontransitionend ? "transitionend" : "webkitTransitionEnd";
    dom.addEventListener(transitionend, function onEnd() {
     // 移除事件
     dom.removeEventListener(transitionend, onEnd);
     //调用done(),表示动画已完成
     done()
    });
   }, delay)
  },
  // 终止态
  afterEnter(dom) {
   dom.classList.remove('list-enter-to', 'list-enter-active');
  }
 }

js 钩子过渡动画: 通过操作行内属性, 自定义动画

<ul class="list">
  <transition-group
   v-bind:css="false"
   v-on:before-enter="beforeEnter"
   v-on:enter="enter"
   v-on:after-enter="afterEnter">
   <li v-for="(item, index) in gameList" 
    :key="item.id" 
    :data-delay="index*100"
    data-y = "100%" 
   >
     <app-horizontal :itemData="item"></app-horizontal>
   </li>
  </transition-group>
 </ul> 
 // 对应的操作方法; 添加自定义的 dataset,给dom设置css样式;根据需求添加
  methods: {
   // 初始态
  beforeEnter(dom) {
   let { x = 0, y = 0, opacity = 0 } = dom.dataset;
   dom.style.cssText = `transition: .3s;opacity: ${opacity};transform: translateX(${x}) translateY(${y});`;
  },
  // 中间态
  enter(dom,done) {
   let delay = dom.dataset.delay;
   setTimeout(function () {
    dom.style.cssText = `transition: .3s;opacity: 1;transform: translateX(0) translateY(0);`;
    //监听 transitionend 事件
    var transitionend = window.ontransitionend ? "transitionend" : "webkitTransitionEnd";
    dom.addEventListener(transitionend, function onEnd() {
       dom.removeEventListener(transitionend, onEnd);
       done(); 
    });
   }, delay)
  },
  // 终止态
  afterEnter(dom) {
   dom.style.cssText = "";
  }
 }

这里记录一下监听css3的animation动画和transition事件:

webkit-animation动画有三个事件:
  开始事件: webkitAnimationStart
  结束事件: webkitAnimationEnd
  重复运动事件: webkitAnimationIteration
css3的过渡属性transition: 一个事件
  过渡结束: webkitTransitionEnd

总结

以上所述是小编给大家介绍的vue 组件中使用 transition 和 transition-group实现过渡动画 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
javascript 内存回收机制理解
Jan 17 Javascript
不同Jquery版本引发的问题解决
Oct 14 Javascript
js中键盘事件实例简析
Jan 10 Javascript
jQuery+html5+css3实现圆角无刷新表单带输入验证功能代码
Aug 21 Javascript
Bootstrap每天必学之按钮(Button)插件
Apr 25 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
Oct 04 Javascript
JavaScript基本类型值-Number类型
Feb 24 Javascript
Vue2.0 多 Tab切换组件的封装实例
Jul 28 Javascript
基于vue配置axios的方法步骤
Nov 09 Javascript
Angular2使用vscode断点调试ts文件的方法
Dec 13 Javascript
JavaScript eval()函数定义及使用方法详解
Jul 07 Javascript
javascript使用正则表达式实现注册登入校验
Sep 23 Javascript
详解vue 2.6 中 slot 的新用法
Jul 09 #Javascript
JavaScript中var的重要性实例分析
Jul 09 #Javascript
js图片无缝滚动插件使用详解
May 26 #Javascript
vue中datepicker的使用教程实例代码详解
Jul 08 #Javascript
微信小程序实现类似微信点击语音播放效果
Mar 30 #Javascript
微信小程序如何访问公众号文章
Jul 08 #Javascript
JavaScript实现的开关灯泡点击切换特效示例
Jul 08 #Javascript
You might like
smarty中先strip_tags过滤html标签后truncate截取文章运用
2010/10/25 PHP
Yii快速入门经典教程
2015/12/28 PHP
必须收藏的php实用代码片段
2016/02/02 PHP
PHP的PDO常用类库实例分析
2016/04/07 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
2018/04/09 PHP
php图片裁剪函数
2018/10/31 PHP
JS日期和时间选择控件升级版(自写)
2013/08/02 Javascript
用jquery中插件dialog实现弹框效果实例代码
2013/11/15 Javascript
原生js结合html5制作小飞龙的简易跳球
2015/03/30 Javascript
js实现延时加载Flash的方法
2015/11/26 Javascript
基于jquery编写的放大镜插件
2016/03/23 Javascript
NodeJS中的MongoDB快速入门详细教程
2016/11/11 NodeJs
javascript trie前缀树的示例
2018/01/29 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
使用JS判断页面是首次被加载还是刷新
2019/05/26 Javascript
Python字符串转换成浮点数函数分享
2015/07/24 Python
Python中使用装饰器来优化尾递归的示例
2016/06/18 Python
Python之ReportLab绘制条形码和二维码的实例
2018/01/15 Python
Python3实现的简单验证码识别功能示例
2018/05/02 Python
python实现广度优先搜索过程解析
2019/10/19 Python
如何基于python实现脚本加密
2019/12/28 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
2020/02/25 Python
Python 数据分析之逐块读取文本的实现
2020/12/14 Python
关于html字符串正则判断和匹配的具体使用
2019/12/12 HTML / CSS
玩具反斗城美国官网:Toys"R"Us
2016/09/17 全球购物
运动会广播稿300字
2014/01/10 职场文书
毕业生面试求职信
2014/06/23 职场文书
高中生第一学年自我鉴定2015
2014/09/28 职场文书
大学生在校表现评语
2014/12/31 职场文书
监护人证明
2015/06/19 职场文书
85句关于理想的名言警句大全
2019/08/22 职场文书
OpenCV图像变换之傅里叶变换的一些应用
2021/07/26 Python
MySQL外键约束(FOREIGN KEY)案例讲解
2021/08/23 MySQL
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
2021/12/06 Java/Android
i5-10400f处理相当于i7多少水平
2022/04/19 数码科技