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 相关文章推荐
用Jquery.load载入页面实现局部刷新
Jan 22 Javascript
jquery显示loading图片直到网页加载完成的方法
Jun 25 Javascript
jQuery插件FusionCharts绘制的2D条状图效果【附demo源码】
May 13 jQuery
three.js实现3D影院的原理的代码分析
Dec 18 Javascript
vue.js 微信支付前端代码分享
Feb 10 Javascript
webpack 样式加载的实现原理
Jun 12 Javascript
layer弹出层 iframe层去掉滚动条的实例代码
Aug 17 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
Dec 24 Javascript
Three.js中矩阵和向量的使用教程
Mar 19 Javascript
了解javascript中的Dom操作
May 27 Javascript
vue悬浮可拖拽悬浮按钮的实例代码
Aug 20 Javascript
Node.js学习教程之Module模块
Sep 03 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获取汉字拼音首字母的方法
2015/10/21 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
2017/10/10 PHP
关于Mozilla浏览器不支持innerText的解决办法
2011/01/01 Javascript
Array的push与unshift方法性能比较分析
2011/03/05 Javascript
Ajax异步提交表单数据的说明及方法实例
2013/06/22 Javascript
Jquery下EasyUI组件中的DataGrid结果集清空方法
2014/01/06 Javascript
Javascript实现商品秒杀倒计时(时间与服务器时间同步)
2015/09/16 Javascript
从重置input file标签中看jQuery的 .val() 和 .attr(“value”) 区别
2016/06/12 Javascript
jQuery3.0中的buildFragment私有函数详解
2016/08/16 Javascript
清除js缓存的多种方法总结
2016/12/09 Javascript
canvas压缩图片转换成base64格式输出文件流
2017/03/09 Javascript
jQuery实现select下拉框获取当前选中文本、值、索引
2017/05/08 jQuery
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
JQueryDOM之样式操作
2019/03/27 jQuery
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
element el-tree组件的动态加载、新增、更新节点的实现
2020/02/27 Javascript
js实现拖拽与碰撞检测
2020/09/18 Javascript
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
使用python实现扫描端口示例
2014/03/29 Python
Python环境变量设置方法
2016/08/28 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
2019/05/07 Python
Python图片处理模块PIL操作方法(pillow)
2020/04/07 Python
Python日志处理模块logging用法解析
2020/05/19 Python
html5的canvas方法使用指南
2014/12/15 HTML / CSS
bonprix荷兰网上商店:便宜的服装、鞋子和家居用品
2020/07/04 全球购物
优秀村官事迹材料
2014/01/10 职场文书
行政助理的岗位职责
2014/02/18 职场文书
高三学生评语大全
2014/04/25 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
2015秋季开学演讲稿范文
2015/07/16 职场文书
创业计划书介绍
2019/04/24 职场文书
利用Redis实现点赞功能的示例代码
2022/06/28 Redis
MySQL存储过程及语法详解
2022/08/05 MySQL
JS前端canvas交互实现拖拽旋转及缩放示例
2022/08/05 Javascript