详解Vue中过度动画效果应用


Posted in Javascript onMay 25, 2017

一、实现动画过渡效果的几种方式

实现动画必须要将要进行动画的元素利用<transition>标签进行包裹

1、利用CSS样式实现过渡效果

<transition name="fade"></transition>

1.v-enter: 定义进入过渡的开始状态。在元素被插入时生效,在下一个帧移除。

2.v-enter-active: 定义进入过渡的结束状态。在元素被插入时生效,在 transition/animation 完成之后移除。

3.v-leave: 定义离开过渡的开始状态。在离开过渡被触发时生效,在下一个帧移除。

4.v-leave-active: 定义离开过渡的结束状态。在离开过渡被触发时生效,在 transition/animation 完成之后

详解Vue中过度动画效果应用

通过name的名称进行重命名,在样式文件中进行.fade-enter-active设置动画的效果即transition属性,需要注意的是动画结束后样式将会移除,所以如果想要动画实现之后元素保持有某个样式,则需要transition标签里面的元素的样式表中进行设置,此情况是针对元需要通过改变元素的属性来显示元素,如定位top,left以及通过transform将显示的元素的位置改变从而让元素出现在当前的视图窗口中时,但是如果元素v-show为true之后元素已经在视图中央显示了,不需要位置的移动将元素移动到视图中,只是想要显示的时候显示有动画效果的,则直接将动画结束的属性设置在v-enter-active/v-leave-active中即可。也就是说动画的属性如果只是产生效果,不对元素的任何属性进行修改,也就是动画中的属性样式不需要永久添加到dom元素中,则直接按后者的方式定义,如果说动画的属性同时相对元素进行样式设计,属性样式需要被添加到dom元素上,则需要按照前者的方式。

<transition name="fold">
    <div class="shopcart-list" v-show="listShow">
     <div class="list-header">
      <h1 class="title">购物车</h1>
      <span class="empty" @click="empty">清空</span>
     </div>
     <div class="list-content" ref="list">
      <ul>
       <li class="food border-1px" v-for="(food,index) in selectFoods" v-show="food.count>0">
        <span class="name">{{selectName[index]}}</span>
        <div class="price">
         <span>¥{{food.price*food.count}}</span>
        </div>
        <div class="cartcontrol-wrapper">
         <v-cartcontrol :food="food"></v-cartcontrol>
        </div>
       </li>
      </ul>
     </div>
    </div>
   </transition>
.fold-enter-active,.fold-leave-active
   transition:all 0.5s
  .fold-enter,.fold-leave
   transform :translate3d(0,0,0)
  .shopcart-list
   position:absolute
   transform:translate3d(0,-100%,0)//动画结束后的效果需要在此处进行设置,设置在.fold-enter-active中,元素动画结束后该样式属性会被移除掉,将会看不到想要的效果
   top: 100%//元素即使显示也不再视图窗口中,通过transform实现显示
   z-index:-1
   width:100%

2、利用animation或者是动画库实现动画效果

<div id="example-2">
 <button @click="show = !show">Toggle show</button>
 <transition name="bounce">
  <p v-if="show">Look at me!</p>
 </transition>
</div>
new Vue({
 el: '#example-2',
 data: {
  show: true
 }
})
.bounce-enter-active {
 animation: bounce-in 0.5s linear;
}
.bounce-leave-active {
 animation: bounce-out 0.5s linear;
}
@keyframes bounce-in {
 0% {
  transform: scale(0);
 }
 50% {
  transform: scale(1.5);
 }
 100% {
  transform: scale(1);
 }
}
@keyframes bounce-out {
 0% {
  transform: scale(1);
 }
 50% {
  transform: scale(1.5);
 }
 100% {
  transform: scale(0);
 }
}

3、自定义过度类名

  1. enter-class
  2. enter-active-class
  3. leave-class
  4. leave-active-class

 他们的优先级高于普通的类名,这对于 Vue 的过渡系统和其他第三方 CSS 动画库,如 Animate.css 结合使用十分有用。

<link href="https://unpkg.com/animate.css@3.5.1/animate.min.css" rel="external nofollow" rel="stylesheet" type="text/css">

<div id="example-3">

 <button @click="show = !show">

  Toggle render

 </button>

 <transition

  name="custom-classes-transition"

  enter-active-class="animated tada"

  leave-active-class="animated bounceOutRight"

 >

  <p v-if="show">hello</p>

 </transition>

</div>
new Vue({
 el: '#example-3',
 data: {
  show: true
 }
})

可以在样式中同时使用transition和animation

4、利用JavaScript钩子函数实现过渡效果

<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"
>
 <!-- ... -->
</transition>
methods: {
 // --------
 // 进入中
 // --------
 beforeEnter: function (el) {
  // ...
 },
 // 此回调函数是可选项的设置
 // 与 CSS 结合时使用
 enter: function (el, done) {
  // ...
  done()
 },
 afterEnter: function (el) {
  // ...
 },
 enterCancelled: function (el) {
  // ...
 },
 // --------
 // 离开时
 // --------
 beforeLeave: function (el) {
  // ...
 },
 // 此回调函数是可选项的设置
 // 与 CSS 结合时使用
 leave: function (el, done) {
  // ...
  done()
 },
 afterLeave: function (el) {
  // ...
 },
 // leaveCancelled 只用于 v-show 中
 leaveCancelled: function (el) {
  // ...
 }
}

在使用钩子函数实现动画的时候注意dom的异步刷新,需要结合this.$nextTick(),同时在leave和enter中设置样式前最好迫使dom进行回流(reflow)使dom重新渲染,如获取元素的offsetHeight等,然后在this.$nextTick()中设置新的样式,不然又可能实现不了动画的效果

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

Javascript 相关文章推荐
不同浏览器的怪癖小结
Jul 11 Javascript
qTip2 精致的基于jQuery提示信息插件
Feb 17 Javascript
Javascript 实现的数独解题算法网页实例
Oct 15 Javascript
js 事件截取enter按键页面提交事件示例代码
Mar 04 Javascript
jquery淡入淡出效果简单实例
Jan 14 Javascript
利用JS生成博文目录及CSS定制博客
Feb 10 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
Mar 25 Javascript
JavaScript使用键盘输入控制实现数字验证功能
Aug 19 Javascript
js实现本地时间同步功能
Aug 26 Javascript
webpack4简单入门实例
Sep 06 Javascript
JavaScript链式调用实例浅析
Dec 19 Javascript
JQuery插件tablesorter表格排序实现过程解析
May 28 jQuery
基于vue实现swipe轮播组件实例代码
May 24 #Javascript
js实现分页功能
May 24 #Javascript
基于Vue的文字跑马灯组件(npm 组件包)
May 24 #Javascript
React简单介绍
May 24 #Javascript
bootstrap3使用bootstrap datetimepicker日期插件
May 24 #Javascript
微信小程序本地缓存数据增删改查实例详解
May 24 #Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
May 24 #Javascript
You might like
php之Smarty模板使用方法示例详解
2014/07/08 PHP
ThinkPHP模板替换与系统常量及应用实例教程
2014/08/22 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
Yii2配置Nginx伪静态的方法
2017/05/05 PHP
PHP使用PDO访问oracle数据库的步骤详解
2017/09/29 PHP
Yii2框架数据验证操作实例详解
2018/05/02 PHP
详解PHP中的8个魔术常量
2020/07/06 PHP
跨浏览器的设置innerHTML方法
2006/09/18 Javascript
ExtJS 2.0 GridPanel基本表格简明教程
2010/05/25 Javascript
js当一个变量为函数时 应该注意的一点细节小结
2011/12/29 Javascript
javascript题目,重写函数让其无限相加
2012/02/15 Javascript
jquery动态增加text元素以及删除文本内容实例代码
2013/07/01 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
Jquery 实现弹出层插件
2015/01/28 Javascript
JavaScript中消除闭包的一般方法介绍
2015/03/16 Javascript
JS数组array元素的添加和删除方法代码实例
2015/06/01 Javascript
JS+CSS实现六级网站导航主菜单效果
2015/09/28 Javascript
AngularJS 服务详细讲解及示例代码
2016/08/17 Javascript
轻松掌握JavaScript策略模式
2016/08/25 Javascript
JavaScript原型式继承实现方法
2019/11/06 Javascript
跟老齐学Python之从if开始语句的征程
2014/09/14 Python
pygame实现简易飞机大战
2018/09/11 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
python实现最大子序和(分治+动态规划)
2019/07/05 Python
python计算导数并绘图的实例
2020/02/29 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
2020/04/24 Python
详解pytorch tensor和ndarray转换相关总结
2020/09/03 Python
jupyter notebook远程访问不了的问题解决方法
2021/01/11 Python
目前不被任何主流浏览器支持的CSS3属性汇总
2014/07/21 HTML / CSS
趣天网日本站:Qoo10 JP
2019/09/18 全球购物
亲戚结婚的请假条
2014/02/11 职场文书
2015年学校关工委工作总结
2015/04/03 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
小学教师教学随笔
2015/08/14 职场文书
小学数学新课改心得体会
2016/01/22 职场文书
使用opencv-python如何打开USB或者笔记本前置摄像头
2022/06/21 Python