Vue-使用动画库Animate及解决谷歌浏览器不支持的问题

2019-07-18  本文已影响0人  月上秦少

1. Demo1:使用Vue组件transition并自定义简单动画

const vm = new Vue({
    data: {
        msg: '赤橙黄绿青蓝紫',
        flag: true,
    },
    methods: {
        // 定义动画生命周期钩子对应执行函数
        beforeEnter(el) {
            console.log('动画进入之前!');
            this.msg = "赤";
            el.style.background = 'red';
        },
        enter(el) {
            console.log('动画进入!');
            this.msg = "橙";
            el.style.background = 'orange';
        },
        afterEnter(el) {
            console.log('动画进入之后!');
            this.msg = "黄";
            el.style.background = 'yellow';
        },
        beforeLeave(el) {
            console.log('动画离开之前!');
            this.msg = "绿";
            el.style.background = 'green';
        },
        leave(el) {
            console.log('动画离开!');
            this.msg = "青";
            el.style.background = 'cyan';
        },
        afterLeave(el) {
            console.log('动画离开之后!');
            this.msg = "蓝";
            el.style.background = 'blue';
}
    }
}).$mount('#app'); 

2.在html中将需要加动画的元素放在transiton标签中,并且给该标签定义一个name属性

<div id="app" class="container text-center">
    <button @click="flag=!flag" class="btn btn-warning">展示动画效果</button>

    <!--    transition生命周期钩子 -->
    <transition name="v"
                            @before-enter="beforeEnter" 
                            @enter="enter" 
                            @after-enter="afterEnter" 
                            @before-leave="beforeLeave" 
                            @leave="leave" 
                            @after-leave="afterLeave">
        <!-- <transition>标签有name属性,在设置css时,要加上'.name属性值-。。。' -->
        <!-- 必须将需要动画操作的元素放在<transiton>标签里面 -->
        <p v-show="flag" class="h3 text-muted">{{msg}}</p>
    </transition>
</div>
/* 定义动画:.name属性-。。。*/
.v-enter-active,
.v-leave-active {
    transition: all 3s ease;
}

.v-enter-active {
    opacity: 1;
    width: 200px;
    height: 200px;
}

.v-leave-active {
    opacity: .5;
    width: 50px;
    height: 50px;
}

/* .-enter需要放在.-enter-active的后面 */
.v-enter {
    opacity: .5;
    width: 50px;
    height: 50px;
}

查看代码效果:Demo1

这里的v-...中的v<transition name="v"里面的name属性值。

Learn More:
官方:Vue内置组件-transition
官方:进入/离开 & 列表过渡

2. Demo2:使用Vue组件transition并结合第三方库Animate.css

Demo2
 npm install animate.css --save
// 或者:
<head>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.7.2/animate.min.css">
</head>
<div class="animation" v-for="(value, index) in animations">
        <div class="wrap"> 
<!--            div.wrap使这一块区域形成BFC,与其他区域互不影响。 -->
            <transition :enter-active-class="'animated delay-1s ' + value" :leave-active-class="'animated ' + value">
            <p v-show="flags[index].show" :style="{background: colors[index % colors.length]}" @mouseenter="enter(index)" @mouseout="out(index)" :title="value">{{value}}</p>
        </transition>
    </div>

查看代码及效果: Demo2

3.遇到的坑

问题原因详细解释:

  1. vue中遇到的坑 --- 变化检测问题(数组相关)

  2. 官方解释:深入响应式原理

解决方式:

上一篇下一篇

猜你喜欢

热点阅读