vueVue技术前端开发那些事儿

Vue动画实现

2021-07-15  本文已影响0人  大佬教我写程序

单个元素使用内置组件transition(添加和删除的时候)

  1. 嗅探是否用了CSS过度或动画,若有,那就在恰当时机添加删除CSS类名

  2. 若transition组件提供JS钩子函数,这些钩子函数会在恰当时机调用

  3. 若没js和CSS,DOM插入和删除会立即执行

组件之间的动画

image.png

animate.css第三方库

transition提供的钩子函数

image.png

gsap库(js实现动画)

gsap小案例,数字增加动画

image.png

渲染一个列表

    <transition-group tag="span" name="gqb">
        <span v-for="value in numbers" :key="value">{{value}}</span>
    </transition-group>
.gqb-enter-from,
.gqb-leave-to {
    opacity: 0;
    transform: translateY(30px);
}
.gqb-enter-to,
.gqb-leave-from {
    opacity: 1;
    transform: translateY(0);
}
.gqb-enter-active,
.gqb-leave-active {
    transition: all 1s ease;
}
.gqb-leave-active{
    position: absolute;
}
.gqb-move {
    transition: transform 1s ease;
}
<template>
    <div>
<input  v-model="keyvalue">
<transition-group tag="ul" name="gqb" :css="false" 
                                @before-enter="beforeEnter"
                                                                @enter="enter"
                                                                @leave="leave"
                                                                >
<li v-for="(value,index) in showNumber" :key="value" :data-index="index">{{value}}</li>
</transition-group>
    </div>
</template>

<script>
    import gsap from "gsap"
    export default {
        data(){
            return{
                numbers:['abf','gsv','rfs','abg','mma','hga','nnb'],
                keyvalue:""
            }
        },
        methods:{
            beforeEnter(el){
                el.style.opacity=0;
                el.style.hight=0;
            },
            enter(el,done){
                gsap.to(el,{
                    opacity:1,
                    height:"1.5em",
                    delay:el.dataset.index * 0.5,
                    onComplete:done
                })
            },
            leave(el,done){
                gsap.to(el, {
                    opacity:0,
                    height:0,
                    delay:el.dataset.index * 0.2,
                    onComplete:done
    })
            }
        },
        computed:{
            showNumber(){
                return this.numbers.filter(item=>{return item.indexOf(this.keyvalue)!==-1})
            }
        }
    }
</script>

<style scoped>

</style>

上一篇下一篇

猜你喜欢

热点阅读