详解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 相关文章推荐
ExtJS判断IE浏览器类型的方法
Feb 10 Javascript
关于session和cookie的简单理解
Jun 08 Javascript
Html中 IFrame的用法及注意点
Dec 22 Javascript
EsLint入门学习教程
Feb 17 Javascript
Angular实现购物车计算示例代码
Feb 21 Javascript
react.js CMS 删除功能的实现方法
Apr 17 Javascript
利用HBuilder打包前端开发webapp为apk的方法
Nov 13 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
May 02 Javascript
用react-redux实现react组件之间数据共享的方法
Jun 08 Javascript
基于Vue-cli快速搭建项目的完整步骤
Nov 03 Javascript
JavaScript实现单英文金山打字通
Jul 24 Javascript
vuex(vue状态管理)的特殊应用案例分享
Mar 03 Javascript
基于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+java实现自动新闻滚动窗口
2006/10/09 PHP
php array_intersect()函数使用代码
2009/01/14 PHP
PHP实现的sqlite数据库连接类
2014/12/12 PHP
phpcms的分类名称和类别名称的调用
2017/01/05 PHP
php获取文件名称和扩展名的方法
2017/02/07 PHP
form自动提交实例讲解
2017/07/10 PHP
thinkPHP5项目中实现QQ第三方登录功能
2017/10/20 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
2017/12/14 PHP
seajs1.3.0源码解析之module依赖有序加载
2012/11/07 Javascript
基于JavaScript实现继承机制之原型链(prototype chaining)的详解
2013/05/07 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
2014/06/23 Javascript
关于iframe跨域POST提交的方法示例
2017/01/15 Javascript
基于vue2.0实现简单轮播图
2017/11/27 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
2018/12/11 jQuery
微信小程序基于高德地图查找位置并显示文字
2019/10/30 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
快速入门python学习笔记
2017/12/06 Python
Python3处理HTTP请求的实例
2018/05/10 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
2018/06/22 Python
keras实现VGG16方式(预测一张图片)
2020/07/07 Python
如何用Python提取10000份log中的产品信息
2021/01/14 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
皇家道尔顿官网:Royal Doulton
2017/12/06 全球购物
捷克鲜花配送:Florea.cz
2018/10/29 全球购物
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
通信工程毕业生自荐信
2013/11/01 职场文书
20岁生日感言
2014/01/13 职场文书
小学新教师培训方案
2014/02/03 职场文书
公司门卫工作职责
2014/06/28 职场文书
社团个人总结范文
2015/03/05 职场文书
关于远足的感想
2015/08/10 职场文书
80后创业总结的9条职场用人思想,记得收藏
2019/08/13 职场文书
Python控制台输出俄罗斯方块的方法实例
2021/04/17 Python
python 判断文件或文件夹是否存在
2022/03/18 Python
python图像处理 PIL Image操作实例
2022/04/09 Python