当前位置: 首页 > article >正文

VUE 实现公告无缝循环滚动

功能说明:

VUE 实现公告无缝向左滚动,当公告的宽度大于当前视图宽度的时候再向左滚动,否则不滚动,当鼠标移入时停止滚动,移开时继续滚动,公告获取后台返回的一个数组,将链接转换为HTML

<style lang="scss">
.notice{ margin-top:24px; height:50px; overflow: hidden; position: relative;
   .notice-con{  white-space:nowrap; flex:1; height:50px; overflow: hidden; margin-left:10px; box-sizing: border-box;
     ul{ height:50px; line-height:50px; display: inline-block; white-space: nowrap; } 
   }
}
</style>

<template>
<div class="notice">
    <div class="notice-con" id="box1" :scrollLeft="scrollLeft" @mouseenter="noticeStop" @mouseleave="startScroll">            
             <ul id="item1" v-html="noticeText"></ul>
             <ul id="item2" v-html="noticeText" v-if="isScroll"></ul>
   </div>    
</div>

</template>

<script>
import { getNotice } from '@/api/index'
export default {
    data(){
        return{
          noticeList:[],
          timer:null,
          scrollLeft:0,        
          noticeText:'',
          isScroll:false,
        }
    },

    mounted() { 
       this.getNotice();  
    },
    
    methods: {       
        

        startScroll(){
          this.noticeScroll('box1','item1', 20, this.scrollLeft);   
        },

        //获取公告
        getNotice(){
                this.noticeList = [
                  {id:1, content:'公告内容公告内容公告[链接|https://www.baidu.com]内容公告内容公告内容公告内容公告内容'},
                  {id:1, content:'公告内容公告内容公告内容公告内容公告内容公告内容公告内容'},
                  {id:1, content:'公告内容公告内容公告内容公告内容公告内容公告内容公告内容'}   
                ]
                var regex = /\[(.*?)\|(https?:\/\/.*?)\]/g;
                this.noticeList.forEach(res=>{
                    let content = res.content.replace(regex, function(match, text, url) {
                        return '<a href="' + url + '" target="_blank" style="color:#2F80ED; text-decoration: underline;">' + text + '</a>';
                    });
                    this.noticeText += content + ';';
                })             
                this.$nextTick(()=>{
                    var box = document.getElementById('box1');	
                    var ul1 = document.getElementById('item1');
                    this.isScroll = ul1.offsetWidth > box.offsetWidth;
                    if(this.isScroll){ 
                      this.noticeScroll('box1','item1', 20); 
                    }
                })
        },

        //滚动公告
        noticeScroll(box1, item1, time, scrollLeft=0){
            var box = document.getElementById(box1);	
            var ul1 = document.getElementById(item1);          
            if(box==null||ul1==null){ return; }           
            box.scrollLeft = scrollLeft;    
            this.scrollLeft = 0;           
            this.timer = setInterval(()=>{
                if (box.scrollLeft >= ul1.scrollWidth) {
                    box.scrollLeft = 0;
                    this.scrollLeft = 0;
                } else {
                    box.scrollLeft++;
                    this.scrollLeft = box.scrollLeft 
                }                       
            }, time);	
        },

        noticeStop(){
           clearInterval(this.timer);
        },
    },
}
</script>


http://www.kler.cn/a/400658.html

相关文章:

  • 搭建MC服务器
  • 【算法】【优选算法】前缀和(下)
  • Redis知识分享(三)
  • SpringSecurity+jwt+captcha登录认证授权总结
  • 【深度学习】使用硬件加速模型训练速度
  • 几何合理的分片段感知的3D分子生成 FragGen - 评测
  • 供应链管理、一件代发系统功能及源码分享 PHP+Mysql
  • Briefly unavailable for scheduled maintenance. Check back in a minute.
  • LINUX sysfs的使用方法举例
  • Cesium 相机系统
  • 10、标签的 ref 属性
  • springboot上传下载文件
  • 十六.SpringCloudAlibaba极简入门-整合Grpc代替OpenFeign
  • 跨平台WPF框架Avalonia教程 十五
  • 使⽤MATLAB进⾏⽬标检测
  • 数字化转型的三个阶段:信息化、数字化、数智化
  • 软考-信息安全-网络安全体系与网络安全模型
  • 高级java面试---spring.factories文件的解析源码API机制
  • Vue基础(2)_el和data的两种写法
  • uni-ui自动化导入
  • element ui 走马灯一页展示多个数据实现
  • MATLAB绘制克莱因瓶
  • QT6学习第三天
  • 驰骋资讯高速:Spring Boot汽车新闻网站
  • Idea中创建和联系MySQL等数据库
  • C#中的方法