vue元素实现动画过渡效果


Posted in Javascript onJuly 01, 2017

1 在 vue 中,使用 <transition> 标签包含着的单个子元素在使用 v-show v-if 切换显示隐藏前,会先判断是否有对应的 class 样式能匹配到该子元素上:

<script src="/public/javascripts/vuejs"></script>
<style>
  red {background-color: red; width: 100px; height: 100px;}
  redv-leave { margin-top: 50px; }
  redv-leave-active { transition: all 3s;}
  redv-leave-to { margin-top: 100px; opacity: 0;}
  redv-enter { margin-top: 50px; }
  redv-enter-active { transition: all 3s;}
  redv-enter-to { margin-top: 10px; opacity: 0;}
</style>
<body>
<div id="app">
  <transition>
    <div class="red" v-show="show"></div>
  </transition>
  <button v-on:click="change">button</button>
</div>
<script>
new Vue({
  el: '#app',
  data: {
    show: true
  },
  methods: {
    change: function(){
      thisshow = !thisshow;
    }
  }
});
</script>
</script>
</body>

vue元素实现动画过渡效果

  1. v-leave 当前元素准备从显示转变成隐藏,在动画开始前添加到元素上,动画一旦开始会立即删除;
  2. v-leave-active 在动画过渡过程中,元素一直拥有该样式,直到动画结束则自动删除,用于设置过渡的效果;
  3. v-leave-to 在动画过渡过程中,元素一直拥有该样式,直到动画结束则自动删除,用于设置动画最终的效果;

事例中,当点击 button,div 并不会马上 display: none, 而是首先设置 v-leave ,下一刻即删除 v-leave ,同时添加 v-leave-active v-leave-to,当 v-leave-active 中的过渡时间执行完成,则删除 v-leave-active v-leave-to,同时添加 display: none。

  1. v-enter 当前元素准备从隐藏转变成显示,在动画开始前添加到元素上,动画一旦开始会立即删除;
  2. v-enter-active 在动画过渡过程中,元素一直拥有该样式,直到动画结束则自动删除,用于设置过渡的效果;
  3. v-enter-to 在动画过渡过程中,元素一直拥有该样式,直到动画结束则自动删除,用于设置动画最终的效果;

事例中,当点击 button,div 马上清除 display: none, 然后设置 v-enter ,下一刻即删除 v-enter ,同时添加 v-enter-active v-enter-to,当 v-enter-active 中的过渡时间执行完成,则删除 v-enter-active v-enter-to。

2 自定义动画类名:

<script src="/public/javascripts/vuejs"></script>
<style>
  red {background-color: red; width: 100px; height: 100px;}
  redslide-leave { margin-top: 50px; }
  redslide-leave-active { transition: all 3s;}
  redslide-leave-to { margin-top: 100px; opacity: 0;}
  redslide-enter { margin-top: 50px; }
  redslide-enter-active { transition: all 3s;}
  redslide-enter-to { margin-top: 10px; opacity: 0;}
</style>
<body>
<div id="app">
  <transition name="slide">
    <div class="red" v-show="show"></div>
  </transition>
  <button v-on:click="change">button</button>
</div>
<script>
new Vue({
  el: '#app',
  data: {
    show: true
  },
  methods: {
    change: function(){
      thisshow = !thisshow;
    }
  }
});
</script>

该效果与上一例效果完全一致的,transition 元素可以使用 name 属性来指定使用的类名前缀,从而代替 v-字段,例如事例中的 name="slide" 使本来的 v-enter 变成了 slide-enter

3 transition 与 animation 同时使用时

<script src="/public/javascripts/vuejs"></script>
<style>
@keyframes aslide {
  0% {
    margin-left: 10px;
  }
  100% {
    margin-left: 100px;
  }
}
  red {background-color: red; width: 100px; height: 100px;}
  blue {background-color: blue; width: 100px; height: 100px;}
  v-leave { margin-top: 50px; }
  v-leave-active { transition: all 3s; animation: aslide 5s;}
  v-leave-to { margin-top: 100px;}
</style>
<body>
<div id="app">
  <transition type="transition" >
    <div class="red" v-show="show"></div>
  </transition>
  <br>
  <transition type="animation" >
    <div class="blue" v-show="show"></div>
  </transition>
  <button v-on:click="change">button</button>
</div>
<script>
new Vue({
  el: '#app',
  data: {
    show: true
  },
  methods: {
    change: function(){
      thisshow = !thisshow;
    }
  }
});
</script>

vue元素实现动画过渡效果

事例中,动画同时指定了 transition 和 animation 动画, transition 元素的 type 属性可以指定以哪种动画的时间为元素的结束时间,如果不指定动画监控的方式,则会以最长时间的为准。

4 javascript 监听动画

<script src="/public/javascripts/vuejs"></script>
<style>
  red {background-color: red; width: 100px; height: 100px;}
  v-leave { margin-top: 50px; }
  v-leave-active { transition: all 3s;}
  v-leave-to { margin-top: 100px;}
</style>
<body>
<div id="app">
  <transition
    v-on:before-enter="beforeEnter"
    v-on:enter="enter"
    v-on:after-enter="afterEnter"
    v-on:enter-cancelled="enterCancelled"
    v-on:before-leave="beforeLeave"
    v-on:leave="leave"
    v-on:after-leave="afterLeave"
    v-on:leave-cancelled="leaveCancelled"
    >
    <div class="red" v-show="show"></div>
  </transition>
  <button v-on:click="change">button</button>
</div>
<script>
new Vue({
  el: '#app',
  data: {
    show: true
  },
  methods: {
    change: function() {
      thisshow = !thisshow; 
      consolelog('-----------click---------');
    },
    beforeEnter: function (el) {
      consolelog('beforeEnter:');
    },
    enter: function (el, done) {
      consolelog('enter:');
      // done()
    },
    afterEnter: function (el) {
      consolelog('afterEnter:');
    },
    enterCancelled: function (el) {
      consolelog('enterCancelled:');
    },
    beforeLeave: function (el) {
      consolelog('beforeLeave:');
    },
    leave: function (el, done) {
      consolelog('leave:');
      done()
    },
    afterLeave: function (el) {
      consolelog('afterLeave:');
    },
    leaveCancelled: function (el) {
      consolelog('leaveCancelled:');
    }
  }
});
</script>

vue元素实现动画过渡效果

  1. 一旦使用 js 事件,原 css 动画过渡效果就会无效,官方推荐在 <div class="red" v-show="show"></div> 上设置 v-bind:css="false" 可令 vue 内部机制免去监测 css 动画事件回调,提高性能。
  2. enter 和 leave 事件需手动调用 done 方法,不然事件一直不会调用后续的 after 事件,没有调用 after 事件但是又有其他事件开始了,则被视为动画被 cancel 了。

5 页面初始化时的动画:

<script src="/public/javascripts/vuejs"></script>
<style>
@keyframes aslide {
  0% {
    margin-left: 10px;
  }
  100% {
    margin-left: 100px;
  }
}
  red {background-color: red; width: 100px; height: 100px;}
  apper { margin-top: 50px; }
  apper-active { margin-top: 100px; animation: aslide 4s; transition: all 3s;}
</style>
<body>
<div id="app">
  <transition
    appear 
    appear-class="apper" 
    appear-active-class="apper-active" 
    v-on:before-appear="customBeforeAppearHook"
    v-on:appear="customAppearHook"
    v-on:after-appear="customAfterAppearHook" >
    <div class="red" ></div>
  </transition>
  <button v-on:click="change">button</button>
</div>
<script>
new Vue({
  el: '#app',
  data: {
    show: true
  },
  methods: {
    change: function() {
      thisshow = !thisshow; 
      consolelog('-----------click---------');
    },
    customBeforeAppearHook: function (el) {
      consolelog('customBeforeAppearHook:');
    },
    customAppearHook: function (el) {
      consolelog('customAppearHook:');
      // done()
    },
    customAfterAppearHook: function (el) {
      consolelog('customAfterAppearHook:');
    }
  }
});
</script>

vue元素实现动画过渡效果

  1. appear 属性表示开启初始化动画,appear-class 属性指定初始化前的样式,appear-active-class 属性指定初始化动画过程的样式;
  2. transition 动画无法在初始化动画中起效,而 animation 动画则可以;
  3. before-appear appear after-appear 是事件回调,看事例相当清晰。

6 动画元素的 key :

<script src="/public/javascripts/vuejs"></script>
<style>
  v-enter-active { transition: all 15s;}
  v-enter-to { margin-top: 100px;}
  v-leave-active { transition: all 15s;}
  v-leave-to { margin-top: 10px;}
</style>
<body>
<div id="app">
  <div class="show1">
    <transition>
      <button v-if="show1" @click="show1 = false">on</button>
      <button v-else @click="show1 = true">off</button>
    </transition>
  </div>
  <div class="show2">
    <transition>
      <button v-if="show2" key="on" @click="show2 = false">on</button>
      <button v-else key="off" @click="show2 = true">off</button>
    </transition>
  </div>
</div>
<script>
var app = new Vue({
  el: '#app',
  data: {
    show1: true,
    show2: true
  }
});
</script>

vue元素实现动画过渡效果

show1 为什么没有动画效果呢?因为 vue 会把切换中的两个 button 识别成同一个元素,只是修改了 button 中的不同内容,所以实际上页面并没有发生 DOM 元素的切换;

如果要让 vue 明确识别出这是2个不同的 button 元素,则为每个元素指定不同的 key 属性的值。

7 元素切换的动画模式:

<script src="/public/javascripts/vuejs"></script>
<style>
  v-enter { margin-left: 100px;}
  v-enter-active { transition: all 5s;}
  v-enter-to { margin-left: 10px;}
  v-leave { margin-left: 10px;}
  v-leave-active { transition: all 5s;}
  v-leave-to { margin-left: 100px;}
</style>
<body>
<div id="app">
  <div class="default">
    <transition>
      <button v-if="show" key="on" @click="show = false">on</button>
      <button v-else key="off" @click="show = true">off</button>
    </transition>
  </div>
  <div class="inout">
    <transition mode="in-out">
      <button v-if="show" key="on" @click="show = false">on</button>
      <button v-else key="off" @click="show = true">off</button>
    </transition>
  </div>
  <div class="outin">
    <transition mode="out-in">
      <button v-if="show" key="on" @click="show = false">on</button>
      <button v-else key="off" @click="show = true">off</button>
    </transition>
  </div>
</div>
<script>
var app = new Vue({
  el: '#app',
  data: {
    show: true
  }
});
</script>

vue元素实现动画过渡效果

  1. transition 默认是同时执行2个元素的切换动画的,案例中红色的 off 按钮其实是会同时向左移动的,只是因为布局上没有脱离布局流,被 on 按钮顶住,无法移动;
  2. mode="in-out" 可以使切换元素先执行将要显示元素的动画,再执行将要隐藏元素的动画;
  3. mode="out-in" 可以使切换元素先执行将要隐藏元素的动画,再执行将要显示元素的动画;

8 多元素动画:

<script src="/public/javascripts/vuejs"></script>
<style>
  v-enter { margin-left: 100px;}
  v-enter-active { transition: all 2s;}
  v-enter-to { margin-left: 10px;}
</style>
<body>
<div id="app">
  <transition-group>
    <li v-for="item in items" :key="item">{{item}}</li>
  </transition-group>
  <transition-group tag="ul">
    <li v-for="item in items" :key="item">{{item}}</li>
  </transition-group>
  <button @click="itemspush(itemslength)">add</button>
</div>
<script>
var app = new Vue({
  el: '#app',
  data: {
    items: [0,1]
  }
});
</script>

vue元素实现动画过渡效果

  1. transition 里面只能放置单个元素或使用 v-if v-show 切换的单个元素,要想使用多个元素的动画,必须使用 transition-group;
  2. transition-group 默认会在 DOM 里渲染成 span 标签,可使用 tag="ul" 指定渲染成其他标签;
  3. transition-group 必须为每一个子元素指定 key;

8 多元素的位移动画:

<script src="/public/javascripts/vuejs"></script>
<style>
  v-move { transition: all 1s; }
</style>
<body>
<div id="app">
  <transition-group tag="ul" >
    <li v-for="item in items" :key="item">{{item}}</li>
  </transition-group>
  <button @click="itemsreverse()">reverse</button>
</div>
<script>
var app = new Vue({
  el: '#app',
  data: {
    items: [0,1,2,3]
  }
});
</script>

vue元素实现动画过渡效果

  1. transition-group 允许在每个元素移动时,添加 v-move 的样式,移动完成后自动清除该样式;
  2. transition 的属性, transition-group 都有,包括 name enter leave;

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

Javascript 相关文章推荐
firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
Apr 12 Javascript
js arguments对象应用介绍
Nov 28 Javascript
Jquery $when done then的用法详解
May 20 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
Jun 08 Javascript
jQuery on()方法绑定动态元素的点击事件无响应的解决办法
Jul 07 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
Jan 24 Javascript
超全面的vue.js使用总结
Feb 12 Javascript
微信小程序中实现一对多发消息详解及实例代码
Feb 14 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
Aug 19 Javascript
详解bootstrap用dropdown-menu实现上下文菜单
Sep 22 Javascript
在vscode中统一vue编码风格的方法
Feb 22 Javascript
详解Node.js amqplib 连接 Rabbit MQ最佳实践
Jan 24 Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
Jun 30 #Javascript
node.js + socket.io 实现点对点随机匹配聊天
Jun 30 #Javascript
详解vue中computed 和 watch的异同
Jun 30 #Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
Jun 30 #Javascript
vue2.0 axios前后端数据处理实例代码
Jun 30 #Javascript
JS 组件系列之Bootstrap Table的冻结列功能彻底解决高度问题
Jun 30 #Javascript
MUI实现上拉加载和下拉刷新效果
Jun 30 #Javascript
You might like
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
2014/11/18 PHP
php调用自己java程序的方法详解
2016/05/13 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
php设计模式之装饰模式应用案例详解
2019/06/17 PHP
JavaScript 直接操作本地文件的实现代码
2009/12/01 Javascript
JavaScript建立一个语法高亮输入框实现思路
2013/02/26 Javascript
js取消单选按钮选中示例代码
2013/11/14 Javascript
jquery禁用右键单击功能屏蔽F5刷新
2014/03/17 Javascript
js实现超酷的照片墙展示效果图附源码下载
2015/10/08 Javascript
JavaScript实现点击单元格改变背景色的方法
2016/02/12 Javascript
理解javascript中Map代替循环
2016/02/26 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
2016/06/12 Javascript
深入分析javascript中console命令
2016/08/14 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
jQuery选择器实例应用
2017/01/05 Javascript
jQuery日程管理控件glDatePicker用法详解
2017/03/29 jQuery
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
iview中Select 选择器多选校验方法
2018/03/15 Javascript
实例详解Node.js 函数
2018/06/10 Javascript
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
2019/03/27 Javascript
基于js实现判断浏览器类型代码实例
2020/07/17 Javascript
简单介绍Python中的JSON模块
2015/04/08 Python
python爬虫库scrapy简单使用实例详解
2020/02/10 Python
python中关于数据类型的学习笔记
2020/07/19 Python
Python 添加文件注释和函数注释操作
2020/08/09 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
会计专业推荐信
2013/10/29 职场文书
宪法宣传周工作方案
2014/05/26 职场文书
商场开业庆典策划方案
2014/06/02 职场文书
贷款委托书怎么写
2014/08/02 职场文书
药店采购员岗位职责
2014/09/30 职场文书
社区三八妇女节活动总结
2015/02/06 职场文书
综合办公室岗位职责
2015/04/11 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
在校学生证明格式
2015/06/24 职场文书