vue的列表交错过渡实现代码示例


Posted in Javascript onMay 05, 2019

交错过渡效果

vue的列表交错过渡实现代码示例

花里胡哨,华而不...真香

基于vue的,需要你对 vue 的 transition 和 transition-group有过使用和了解。

transition

vue的文档对 transtion 组件已经有了很详细的 分析 了。

这里说一下我的理解:

transtion 是vue提供的一个抽象组件,会在 合适的时机 帮我们操作其包裹的子元素。

这个合适的时机是:

  1. beforeEnter dom 从 js 生成,并刚插入页面的 那一帧(对应下图的动画开始)
  2. enter dom 插入页面之后的 下一帧(对应下图的动画中)
  3. afterEnter dom 动画完成之后的 下一帧(对应下图的动画结束)

vue的列表交错过渡实现代码示例

transition-group

ransition-group组件 会对包裹的列表中每一个元素批量进行 transtion组件 的操作。

html

<div id="app" @click="num === 0 ? num++ : num = 5">
  <transition-group name="list">
    <item v-for="n in num" :key=n />
  </transition-group>
</div>

css

.list-enter {
  opacity: 0;
  transform: translateY(100%);
}
.list-enter-active {
  transition: .3s;
}
/* enter-to其实可以不用写, 没有显性写明,就是默认的opacity: 1;transform: none; */
.list-enter-to {
  opacity: 1;
  transform: translateY(0);
}

vue的列表交错过渡实现代码示例

接下来给 每个列表项 加上不同 延时 即可。

transition-delay

css

.list-enter-active:nth-child(5n+2) {
  transition-delay: .3s;
}
.list-enter-active:nth-child(5n+3) {
  transition-delay: .5s;
}
.list-enter-active:nth-child(5n+4) {
  transition-delay: .7s;
}
.list-enter-active:nth-child(5n+5) {
  transition-delay: .9s;
}

vue的列表交错过渡实现代码示例

用 transition-delay 配合 css选择器,确实可以实现交错过渡,

但是缺点也很明显,要写大量的 css ,修改起来也不灵活。

接下来我们用vue的 JavaScript钩子 来实现。

setTimeout

html

<div id="app" @click="num === 0 ? num++ : num = 5">
  <!-- 这里加上 v-bind:css="false" 让vue跳过对css的检测,让我们更好控制 动画完成的时机 -->
  <transition-group 
    v-bind:css="false"
    v-on:before-enter="beforeEnter" 
    v-on:enter="enter"
    v-on:after-enter="afterEnter">

    <item v-for="(n,index) in num" :key=n :data-delay=index*100 />

  </transition-group>
</div>

当只用 JavaScript 过渡的时候,在 enter 和 leave 中必须使用 done 进行回调。否则,它们将被同步调用,过渡会立即完成。

new Vue({
  el: "#app",
  data: () => ({
    num: 0
  }),
  methods: {
    //让我们在 beforeEnter enter afterEnter 钩子里,把 vue 帮我们做的事,自己做一遍:
    //添加移除 class 类名,监听 transitionend 事件。
    beforeEnter(dom) {
      dom.classList.add('list-enter', 'list-enter-active');
    },
    enter(dom,done) {
      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() 告诉vue动画已完成,以触发 afterEnter 钩子
        });
      }, delay)
    },
    afterEnter(dom) {
      dom.classList.remove('list-enter-to', 'list-enter-active');
    }
  }
})

vue的列表交错过渡实现代码示例

目前来说,运行良好,实现了交错过渡的效果,也不用写大量的 css。

回头看看我们一共做了2件事,用 .list-enter .list-enter-to 和 setTimeout

告诉浏览器,在不同的时间把列表项,从opacity 0 translateY(100%) 过渡到,opacity 1 translateY(0)。

告诉浏览器元素的不同状态,除了类名之外,

我们可以直接操作dom,把样式写到内联,

除了完全不用写css类名之外,

还可以有更多的编程性。

style

html

<div id="app" @click="num ? num++ : num=5">
    <transition-group 
      v-bind:css="false" 
      v-on:before-enter="beforeEnter" 
      v-on:enter="enter"
      v-on:after-enter="afterEnter">

      <item v-for="(n,index) in num" 
        :key=n 
        :data-delay=index*100 
        data-y="100%"
        />

    </transition-group>
  </div>
new Vue({
  el: "#app",
  data: () => ({
    num: 0
  }),
  methods: {
    beforeEnter(dom) {
      let { x = 0, y = 0, s = 1, opacity = 0 } = dom.dataset;
      dom.style.cssText = `transition: .3s;opacity: ${opacity};transform: scale(${s}) translateX(${x}) translateY(${y});`;
    },
    enter(dom,done) {
      let delay = dom.dataset.delay;
      setTimeout(function () {
        dom.style.cssText = `transition: .3s;opacity: 1;transform: scale(1) translateX(0) translateY(0);`;
        //监听 transitionend 事件
        var transitionend = window.ontransitionend ? "transitionend" : "webkitTransitionEnd";
        dom.addEventListener(transitionend, function onEnd() {
         dom.removeEventListener(transitionend, onEnd);
         done(); //调用done() 告诉vue动画已完成,以触发 afterEnter 钩子
        });
      }, delay)
    },
    afterEnter(dom) {
      dom.style.cssText = "";
    }
  }
})

vue的列表交错过渡实现代码示例

嗯 不错,不过既然都上 js 了,能限制的就只有你的想象力了。

html

<item v-for="(n,index) in num" 
    :key=n 
    :data-delay=index*100 
    :data-x="index%2 === 0 ? '-50%' : '50%'" 
    :data-y="getRandom()+'%'"
    :data-s="Math.random()"
  />
getRandom() {
  var rate = Math.floor(Math.random() * 90 + 10);
  return Math.random() > 0.5 ? rate : -1 * rate;
}

vue的列表交错过渡实现代码示例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jQuery的倒计时实现代码
May 30 Javascript
javascript模拟地球旋转效果代码实例
Dec 02 Javascript
javascript实现复制与粘贴操作实例
Oct 16 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
Nov 17 Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
Sep 05 Javascript
jquery.validate.js 多个相同name的处理方式
Jul 10 jQuery
基于node.js之调试器详解
Aug 22 Javascript
js数组常用最重要的方法
Feb 04 Javascript
bootstrap自定义样式之bootstrap实现侧边导航栏功能
Sep 10 Javascript
手把手带你封装一个vue component第三方库
Feb 14 Javascript
小程序测试后台服务的方法(ngrok)
Mar 08 Javascript
JS highcharts实现动态曲线代码示例
Oct 16 Javascript
微信小程序上传多图到服务器并获取返回的路径
May 05 #Javascript
详解如何在vue项目中使用layui框架及采坑
May 05 #Javascript
详解小程序input框失焦事件在提交事件前的处理
May 05 #Javascript
详解小程序毫秒级倒计时(适用于拼团秒杀功能)
May 05 #Javascript
小程序关于请求同步的总结
May 05 #Javascript
vue列表单项展开收缩功能之this.$refs的详解
May 05 #Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
May 05 #Javascript
You might like
需要发散思维学习PHP
2009/06/29 PHP
PHP中的traits简单使用实例
2015/05/13 PHP
使用URL传输SESSION信息
2015/07/14 PHP
PHP常用正则表达式精选(推荐)
2019/05/28 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
Prototype的Class.create函数解析
2011/09/22 Javascript
firefox下jquery iframe刷新页面提示会导致重复之前动作
2012/12/17 Javascript
杨氏矩阵查找的JS代码
2013/03/21 Javascript
jquery 定位input元素的几种方法小结
2013/07/28 Javascript
JS动态增删表格行的方法
2016/03/03 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
2017/03/02 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
Python单元测试框架unittest简明使用实例
2015/04/13 Python
Python字符串特性及常用字符串方法的简单笔记
2016/01/04 Python
Python自动化开发学习之三级菜单制作
2017/07/14 Python
Python实现查看系统启动项功能示例
2018/05/10 Python
Python数据结构之图的应用示例
2018/05/11 Python
Python中修改字符串的四种方法
2018/11/02 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
使用python实现回文数的四种方法小结
2019/11/24 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
python学生管理系统的实现
2020/04/05 Python
在Python中字典按值排序的实现方法
2020/11/12 Python
Myprotein瑞士官方网站:运动营养和健身网上商店
2019/09/25 全球购物
西安当代医院管理研究院笔试题
2015/12/11 面试题
集体备课反思
2014/02/12 职场文书
国际经济与贸易专业大学生职业规划书
2014/03/01 职场文书
店面销售职位的职责
2014/03/09 职场文书
设计顾问服务计划书
2014/05/04 职场文书
节约用水演讲稿
2014/05/21 职场文书
民事二审代理词
2015/05/25 职场文书
电影焦裕禄观后感
2015/06/09 职场文书
PHP对接阿里云虚拟号的实现(号码隐私保护)
2021/04/06 PHP
图文详解nginx日志切割的实现
2022/01/18 Servers