Vue day11 Vue过渡&动画


过渡&动画

vue 动画的理解

  1. 操作css 的trasition 或animation
  2. vue 会给目标元素添加/移除特定的class
  3. 过渡的相关类名
    xxx-enter-active: 指定显示的transition;进入过渡的结束状态,元素被插入时就生效,在过渡过程完成后移除
    xxx-leave-active: 指定隐藏的transition ;离开过渡的结束状态,元素被删除时生效,离开过渡完成后被删除*
    xxx-enter:进入过渡的开始状态,元素被插入时生效,只应用一帧后立刻删除
    xxx-leave: 离开过渡的开始状态,元素被删除时触发,只应用一帧后立刻删除

image-20210203130902220

过渡模式mode

  • in-out:新元素先进入过渡,完成之后当前元素过渡离开,默认模式。
  • out-in:当前元素先进行过渡离开,离开完成后新元素过渡进入。

基本过渡动画的编码

  1. 在目标元素外包裹<transition name="xxx">
  2. 定义class 样式
    指定过渡样式: transition
    指定隐藏时的样式: opacity/其它
<style>
/* 定义进入和离开时候的过渡状态 */
.fade-enter-active, .fade-leave-active {
    /*transition: opacity 2s*/
     transition: all 0.2s ease;
   position: absolute;
}
/* 定义进入过渡的开始状态 和 离开过渡的结束状态 */
.fade-enter, .fade-leave-to /* .fade-leave-active, 2.1.8 版本以下 */ {
   /* opacity: 0*/
    opacity: 0;
   transform: translateX(100px);
}
</style>

<div id = "databinding">
<button v-on:click = "show = !show">点我</button>
<transition name = "fade">
    <p v-show = "show" v-bind:style = "styleobj">动画实例</p>
</transition>
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#databinding',
    data: {
        show:true,
        styleobj :{
            fontSize:'30px',
            color:'red'
        }
    },
    methods : {
    }
});
</script>

使用第三方 CSS 动画库

https://animate.style/

https://cn.vuejs.org/v2/guide/transitions.html 自定义过渡类名

  1. 导入动画类库:
  • npm安装npm install animate.css –save

    // in main.js
    import animated from 'animate.css' 
    Vue.use(animated)
  • 使用cdn引入

    // in index.html 
    <link href="https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.0/animate.min.css" rel="stylesheet">
  1. 定义 transition 及属性:

    <div id = "test2">
            <input type="button" value="戳我进入" @click="flag=!flag">
            <!--duration表示进出场时间,可以分别设置和独立设计-->
            <transition enter-active-class="animate__animated animate__backInDown" leave-active-class="animate__animated animate__backOutUp" :duration="{ enter: 500, leave: 800 }"
            >
                <!--需求:点击按钮,让p显示,再点击,让p隐藏-->
                <p v-if="flag">{{msg}}</p>
            </transition>
        </div>
    <script>
    var app = new Vue({
            el: '#test2',
            data: {
                msg: 'hellfo  vue.js.',
                flag: false
            }
    </script>

注意事项

  1. 不要在对行内元素使用dispplay:inline需要的话你可以设置该元素为行内块元素display: inline-block
  2. Animate.css v4的升级带来了破坏性的影响(这样翻译怪),所有类要加前缀animate__

使用动画钩子函数

  1. 定义 transition 组件以及三个钩子函数:

    <div id="test3">
                <!-- 钩子函数 -->
                <input type="button" value="切换动画" @click="isshow = !isshow">
                <transition
                @before-enter="beforeEnter"
                @enter="enter"
                @after-enter="afterEnter">
                  <div v-if="isshow" class="show">OK</div>
                </transition>
        </div>
  2. 定义三个 methods 钩子方法:

    var app2 = new Vue({
            el: '#test3',
            data: { 
                isshow: false
            },
            methods: {
                beforeEnter(el) { // 动画进入之前的回调
                el.style.transform = 'translateX(100px)';
                },
                enter(el, done) { // 定义了动画的终止状态 这里的done其实等于下面的afterEnter函数
                el.offsetWidth;
                el.style.transform = 'translateX(600px)';
                done();//函数结束调用下面afterEnter函数 直接comment掉的话,就不执行afterEnter
                },
                afterEnter(el) { // 定义了动画完成之后的回调函数
                this.isshow = !this.isshow;
                }
            }
    })
  3. 定义动画过渡时长和样式:

    .show{
       transition: all 4s ease;
     }

v-for 的列表过渡

https://cn.vuejs.org/v2/guide/transitions.html#列表的进入和离开过渡

  1. 定义过渡样式:

    <style>
     /* 列表过渡 */
        .list-enter,
        .list-leave-to {
            opacity: 0;
            transform: translateY(10px);
        }
    
        .list-enter-active,
        .list-leave-active {
            transition: all 0.3s ease;
            position:absolute/*为了保持位置的相对稳定*/
        }
    
        /* 元素改变定位的缓动效果 */
        .list-move{
            transition: all 0.3s ease;
        } 
    </style>
  2. 定义DOM结构,其中,需要使用 transition-group 组件把v-for循环的列表包裹起来:

    <div id="test4"> 
            <!-- 这里的transition-group会被渲染成为span 所以要用tag 让浏览器知道它要被渲染成为ul -->
            <input type="text" v-model="txt" @keyup.enter="add"><transition-group tag="ul" name="list">   
                <li v-for="(item, i) in list" :key="i">{{item}}</li> 
            </transition-group>
            <button v-on:click="remove">Remove</button>
        </div>
  3. 定义 VM中的结构:

     // 创建 Vue 实例,得到 ViewModel
      var app3 = new Vue({
       el: '#test4',
       data: {
         txt: '',
         list: [1, 2, 3, 4]
       },
       methods: {
         add() {
           this.list.push(this.txt);
           this.txt = '';
         },
         randomIndex: function () {
          return Math.floor(Math.random() * this.list.length)
        },
         remove: function () {
          this.list.splice(this.randomIndex(), 1)
        },
       }
     });

列表的排序过渡

​ 没练习 看官网吧~

Reference

  1. https://cn.vuejs.org/v2/guide/transitions.html

  2. 贝塞尔在线生成器

  3. Vue 动画:CSS 动画原理 & animate.css 库的使用 & 同时使用过渡和动画 & Js 动画与 Velocity.js 的结合 & 多个元素或组件的过渡 & 动画封装


Author: Savannah
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Savannah !
  TOC