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 相关文章推荐
extjs两个tbar问题探讨
Aug 08 Javascript
JavaScript中的异常捕捉介绍
Dec 31 Javascript
浅谈js中test()函数在正则中的使用
Aug 19 Javascript
JS实现图片局部放大或缩小的方法
Aug 20 Javascript
Angular工具方法学习
Dec 26 Javascript
Vue2.0组件间数据传递示例
Mar 07 Javascript
vue实例中data使用return包裹的方法
Aug 27 Javascript
浅谈vue后台管理系统权限控制思考与实践
Dec 19 Javascript
JavaScript设计模式之享元模式实例详解
Jan 17 Javascript
详解Bootstrap 学习(一)入门
Apr 12 Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
Jun 10 Javascript
微信小程序保存图片到相册权限设置
Apr 09 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
PHP安全性漫谈
2012/06/28 PHP
PHP系列学习之日期函数使用介绍
2012/08/18 PHP
使用php将某个目录下面的所有文件罗列出来的方法详解
2013/06/21 PHP
laravel执行php artisan migrate报错的解决方法
2019/10/09 PHP
不安全的常用的js写法
2009/09/15 Javascript
基于jquery的回到页面顶部按钮
2011/06/27 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
浅谈JavaScript超时调用和间歇调用
2015/08/30 Javascript
JS实现样式清新的横排下拉菜单效果
2015/10/09 Javascript
使用jQuery加载html页面到指定的div实现方法
2016/07/13 Javascript
jQuery简单实现彩色云标签效果示例
2016/08/01 Javascript
JS实现的表格行上下移动操作示例
2016/08/03 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
ES6新特性二:Iterator(遍历器)和for-of循环详解
2017/04/20 Javascript
提高Node.js性能的应用技巧分享
2017/08/10 Javascript
vue2.0 父组件给子组件传递数据的方法
2018/01/15 Javascript
nodejs简单读写excel内容的方法示例
2018/03/16 NodeJs
配置node服务器并且链接微信公众号接口配置步骤详解
2019/06/21 Javascript
Vue 使用Props属性实现父子组件的动态传值详解
2019/11/13 Javascript
构建Python包的五个简单准则简介
2015/06/15 Python
python3 模拟登录v2ex实例讲解
2017/07/13 Python
树莓派采用socket方式文件传输(python)
2019/06/22 Python
Python 绘制酷炫的三维图步骤详解
2019/07/12 Python
Python udp网络程序实现发送、接收数据功能示例
2019/12/09 Python
15行Python代码实现免费发送手机短信推送消息功能
2020/02/27 Python
Python3 中sorted() 函数的用法
2020/03/24 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
2020/06/10 Python
凯撒娱乐:Caesars Entertainment
2018/02/23 全球购物
世界闻名的衬衫制造商:Savile Row Company
2018/07/30 全球购物
几个常见的软件测试问题
2016/09/07 面试题
工作的心得体会
2013/12/31 职场文书
优秀大学生事迹材料
2014/12/24 职场文书
javaScript Array api梳理
2021/03/31 Javascript
解决Go gorm踩过的坑
2021/04/30 Golang
在Django中使用MQTT的方法
2021/05/10 Python
JavaScript中时间格式化新思路toLocaleString()
2021/11/07 Javascript