vue使用requestAnimationFrame实现轮询公告

17 篇文章 0 订阅

1.要求:实现轮询公告,鼠标放上停止轮询,鼠标移开继续轮询

2.实现效果如下:
在这里插入图片描述
3.思考:文本从最右侧开始滚动,因此开始start为容器宽度500,滚动到最左侧时为-(滚动文本宽度),超出宽度从新滚动

4.代码如下:

<template>
    <div>
        <div class="box" @mouseenter="stopDone" @mouseleave="startLL">
            <div class="new" ref="new" :style="{left:start+'px'}">
                <div class="new_item"><a href="#">7:10 商务部:前五个月使用外资同比增长15%</a></div>
                <div class="new_item"><a href="#">7:15 中国成功实现基中反拦截导弹</a></div>
                <div class="new_item"><a href="#">7:20 珠江疫情分控,居民拖箱子逃离</a></div>
                <div class="new_item"><a href="#">7:30 东南地区及沿海有特大暴雨</a></div>
            </div>
        </div>
    </div>
</template>
<script>
export default {
    data(){
        return{
            maxWidth:0,
            start:'500',
            interval:{},
            flag:0,//1:开启,0介绍
        }
    },
    mounted(){
         let newObj = this.$refs.new;
         console.log('new',newObj.clientWidth);
         this.maxWidth = '-'+newObj.clientWidth;
         //this.startDone();   
         //setInterval(()=>{this.startDone();},100);//setInterval刷新不流畅会有断续问题,改用requestAnimationFrame
         this.flag = 1;
         this.interval = this.startDone;
         window.requestAnimationFrame(this.interval);

    },
    methods:{
        startLL(){
            console.log('start');
            this.flag = 1;
            window.requestAnimationFrame(this.interval);
        },
        startDone(){
             this.start = Number(this.start)-1;
                if(Number(this.start)<Number(this.maxWidth)){//到底重新循环
                    this.start = '500'
                }
                if(this.flag){//关闭跳出轮询
                    window.requestAnimationFrame(this.interval);
                }
            // this.interval = window.requestAnimationFrame(()=>{
            //     this.start = Number(this.start)-4;
            //     if(Number(this.start)<Number(this.maxWidth)){//到底重新循环
            //         this.start = '500'
            //     }
            // });

        },
        stopDone(){
            console.log('stop');
            this.flag = 0;
            //window.cancelAnimationFrame(this.interval);
        },
        
    },
    
}
</script>
<style scoped>
.box{
    width: 500px;
    overflow-x: hidden;
    border: 1px solid #333;
    position: relative;
    line-height: 24px;
    height: 24px;
    
}
.new{
    display: flex;
    flex-wrap: nowrap;
    position: absolute;
    top: 0;
}

.new_item{
    font-size: 13px;
    margin-right: 40px;
    white-space: nowrap;   
}
</style>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值