美文网首页
vue写一个简单的弹幕动效

vue写一个简单的弹幕动效

作者: 梦想_Dream | 来源:发表于2019-04-17 14:15 被阅读0次

    因为有很多地方公用这个弹幕效果,所以做成了组件,方便引用。
    该功能需要掌握vue的组件和动画。

    template部分

    <template>
        <div>
            <transition name="bullet"  @after-enter="afterEnter" @after-leave="afterLeave">
                <div v-show="isShowBullet" class="bullet-screen" v-bind:style="{'top': top,'left': left}">
                    <span>{{bulletList[0]}}</span>
                </div>
            </transition>
        </div>
    </template>
    

    js部分

    <script>
        export default {
            data(){
                return {
                    isShowBullet: !1,
                    bulletInterval: 1,
                    bulletList: [],
                    timer: null,
                    afterTimer: null
                }
            },
            props:{
                bullets: {
                    type: Object
                },
                paused: {
                    type: Boolean,
                    default: !1
          },
          top:{  type: String },
          left:{  type: String }
            },
            methods: {
                bulletEnter(el, done){
                    el.classList.add('bullet-enter-active');
                    setTimeout(()=>{
                        this.isShowBullet = !1;
                        el.classList.remove('bullet-enter-active');
                        setTimeout(()=>{
                            this.isShowBullet = !0;
                        },500);
                    },2000);
                },
                bulletComplete(el){
                    console.log(1)
                },
                afterEnter(){
                    this.afterTimer = setTimeout(() => {
                        this.isShowBullet = !1;
                    }, 2000);
                },
                afterLeave(){
                    this.bulletList.shift();
                    if(this.bulletList.length<=0 || this.paused){
                        return;
                    }
                    this.showBullet();
                },
                showBullet(){
                    if(this.timer){
                        clearTimeout(this.timer);
                    }
                    this.timer = setTimeout(() => {
                        this.isShowBullet = !0;
                    }, this.bulletInterval * 1000);
                }
            },
            watch:{
                bullets(val){
                    this.bulletInterval = val.frequency;
                    this.bulletList = val.msglist;
                    if (this.bulletList.length > 0) {
                        this.showBullet();
                    }
                },
                paused(isPaused){
                    if(isPaused){
                        this.isShowBullet = !1;
                        clearTimeout(this.timer);
                        clearTimeout(this.afterTimer);
                    }else{
                        this.showBullet();
                    }
                }
            }
        }
    </script>
    

    css部分

    <style scoped>
        .bullet-screen{
            position: absolute;
            left: 0.32rem;
            top: 0.6rem;
            height: 0.54rem;
            line-height: 0.56rem;
            max-width: 4rem;
            padding: 0 0.3rem;
            border-radius: 0.06rem;
            color: #fff;
            font-size: 0.24rem;
            text-align: center;
            background-image: linear-gradient(90deg, #FF8C00 0, #FF5400 100% );
            z-index: 2000;
            box-sizing: border-box;
            overflow: hidden;
            text-overflow: ellipsis;
            white-space: nowrap;
            opacity: 0.8;
        }
        .bullet-enter-active{
            opacity: 0.8;
            transform: translate3d(0, 0, 0);
            transition: all .5s ease-in-out;
        }
        .bullet-enter{
            opacity: 0;
            transform: translate3d(0, 150%, 0);
        }
        .bullet-leave-active {
            transition: all .8s cubic-bezier(1.0, 0.5, 0.8, 1.0);
        }
        .bullet-leave-to{
            opacity: 0;
            transform: translate3d(0, -100%, 0);
        }
        @keyframes bullet{
            0%{
                opacity: 0;
                transform: translate3d(0, 150%, 0);
            }
            25%{
                opacity: 1;
                transform: translate3d(0, 0, 0);
            }
            75%{
                opacity: 1;
                transform: translate3d(0, 0, 0);
            }
            100%{
                opacity: 0;
                transform: translate3d(0, -100%, 0);
            }
        }
    </style>
    

    相关文章

      网友评论

          本文标题:vue写一个简单的弹幕动效

          本文链接:https://www.haomeiwen.com/subject/mmfnwqtx.html