vue 上实现无缝滚动播放文字系统公告

在这里插入图片描述
首先实现效果,当时的需求做的系统公告框设定一个宽度,超宽滚动播放,没超宽则静态展示,
有了需求,想了下实现原理,最开始打算js更改字体内容的方式,但是想了下感觉会有点麻烦,想起之前做了表格的左侧边固定,是利用了将表格分层两部分,滚动的时候通过translate来移动了表格的位置,实现的半边滚动,半边移动,这种办法可以用在我们这里,这样就实现了代码的横向滚动,这下就剩下无缝链接。
既然是用translate实现的滚动,我们可以在滚动前做好排版,将一个内容一样的div块紧贴在内容块后面一起滚动,并且在当前条滚动完后,恢复初始位置,且此位置必须与刚开始滚动前的位置像重合,看起效果就是滚动的无缝链接,
废话不多说下面直接贴代码,我尽量在代码注释里写进各部分功能,这里就不详细介绍
显示html部分

<template>
  <div id="mar">
    <!--主div分三部分,图标,系统公告名字,展示区域-->
    <div class="header">
      <!--图标-->
      <img src="../../../static/img/notification.png">&nbsp;&nbsp;
      <!--名字-->
      <span class="announcement">系统公告:</span>&nbsp;</div>
    <!--公告展示块-->
    <div class="PackagingShell" id="PackagingShell">
      <!--主题内容,展示内容区域-->
      <div id="viewBox">
        <!--文本主体-->
        <span id="marquee">{{text}}</span>
        <!--文本副本,实现无缝滚动-->
        <span id="transcript" ></span>
      </div>
      <!--隐藏块,用于获取展示文本宽度-->
      <div id="hide">{{text}}</div>
    </div>
  </div>
</template>

主要结构我都用注释写清清楚了,再用图片给大家解释下

在这里插入图片描述
这个4个框分别是在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
还有个是滚动块,是跟在内容块后面
在这里插入图片描述
接下来是各块的样式

<style scoped lang="scss">
  #mar {
    /*系统公告字体颜色*/
    .announcement{
      color:#ff4786;
    }
    height:40px;
    line-height: 40px;
    /*公告滚动盒子样式*/
    .PackagingShell {
      width: 89%;        /*滚动部分宽度*/
      overflow: hidden;  /*超出部分隐藏*/
      font-size: 12px;
      color: #111;
    }
    /*主题内容块设置*/
    #viewBox {
      /*设置内容框不可换行,确保两个div块始终在同一行*/
      white-space: nowrap;
    }
    /*内容块设置*/
    #marquee {
      /*设置内容块不可换行*/
      white-space: nowrap;
    }
    /*获取宽度的块,用z-index隐藏*/
    #hide {
      position: absolute;
      z-index: -999;
      top: -9999px;
      white-space: nowrap;
    }
    /*浮动设置和图片设置*/
    .header {
      float: left;
      font-size:12px;
      >img{
        vertical-align: middle;
      }
    }
  }
</style>

接下来是比较关键的js 部分,主要的位移对比代码都在这里

<script>
import {getHomepageMessage} from '@/api/getdata'
export default {
  name: 'Marquee',
  data () {
    return {
      text: '', // 内容
      textWidth: 0, // 字符长度
      isScroll: false // 是否滚动
    }
  },
  methods: {
    init () { // 初始化函数
      getHomepageMessage().then((response) => { // 接口请求
        if (response.body.code !== '0000') {
          return
        }
        // this.text = response.body.data[0].messageContent
        // 滚动内容赋值
        this.text = '滚动无缝链接测试滚动无缝链接测试滚动无缝链接测试滚动无缝链接测试滚动无缝链接测试滚动无缝链接测试滚动无缝链接测试滚动无缝链接测试滚动无缝链接测试滚动无缝链接测试'
      })
        .catch((response) => {
          console.log(response, 'error')
        })
    },
    move () {
      // 首先获取整个内容的宽度,(展示内容会超出隐藏,无法通过获取盒子宽度取到实际的内容宽度)
      // 所以专门造了一个 div 块来放内容,隐藏起来 (无法用根据字体内容来计算宽度的方法,存在误差,当内容较多
      // 的时候误差会相对较大)
      let width = document.getElementById('hide').getBoundingClientRect().width
      // 获取展示块盒模型宽度
      let BoxWidth = document.getElementById('PackagingShell').offsetWidth
      // 获取内容展示宽
      let viewBox = document.getElementById('viewBox')
      // 判断内容是否超长
      if ((BoxWidth - width) < 0) {
        // 内容超长,则获取抄本元素
        let transcript = document.getElementById('transcript')
        // 抄本元素内容填充
        transcript.innerText = this.text
        // 设定抄本和主题之间的间距
        transcript.style.marginLeft = '200px'
      } else {
        // 没有超长则return,不做任何操作
        return
      }
      // 设置初始位移距离
      let distance = 0
      // 移动函数,通过定时器实现
      setInterval(function () {
        // 位移内用记录是是递减,此处的 1 控制移动变量 s
        distance = distance - 1
        // 判断是否整个内容移动完
        if (-distance >= width) {
          // 若移动完,则重新设定位移值,此处赋值200是正好把 上面设置的块间距  200px 也加入移动范围,实现移动完无缝跳转
          distance = 200
        }
        // 实时设置位移距离
        viewBox.style.transform = 'translateX(' + distance + 'px)'
      }, 27) // 移动时间间隔t   s和t 共同决定移动速度
    }
  },
  mounted () {
    // 初始化
    this.init()
  },
  // 更新的时候运动
  updated: function () {
    this.move()
  }
}
</script>

因为项目把所有api独立出去了,所以若果你直接复制是无法使用,
但是只需要在init 初始化函数里将其它内容删除,只留 给this.text 赋值的内容就行!
js部分的描述我全写在了注释里,这里就不单独讲一遍了

经验分享给大家共同成长~~原创作品,转载记得著名出处哟~
作者:高数定积分

Vue.js是一种流行的JavaScript框架,用于构建用户界面。要实现无缝滚动效果,可以使用Vue.js的transition组件和CSS动画来实现。 首先,你需要在Vue组件中定义一个包含滚动内容的容器,并设置其样式为`overflow: hidden`,以隐藏超出容器的内容。然后,在容器内部创建一个滚动元素,设置其样式为`white-space: nowrap`,以使内容水平排列。 接下来,你可以使用Vue的transition组件来添加过渡效果。在滚动元素上添加一个`v-if`指令,根据条件来决定是否显示滚动元素。当需要滚动时,将滚动元素的内容复制一份,并将其追加到滚动元素的末尾,形成一个无限循环的效果。 然后,你可以使用CSS动画来实现滚动效果。通过给滚动元素添加一个`transform`属性,并使用`translateX`函数来实现水平位移。同时,使用`animation`属性来定义动画的持续时间、缓动函数等。 最后,在Vue组件中使用定时器或者其他方式来触发滚动效果。可以通过改滚动元素的`transform`属性的值来实现滚动效果。 下面是一个简单的示例代码: ```html <template> <div class="scroll-container"> <div class="scroll-content" v-if="isScrolling"> {{ content }} </div> </div> </template> <script> export default { data() { return { content: '这是滚动的内容', isScrolling: true }; }, mounted() { setInterval(() => { // 每隔一段时间改变滚动元素的transform属性值,实现滚动效果 }, 3000); } }; </script> <style> .scroll-container { width: 300px; height: 200px; overflow: hidden; } .scroll-content { white-space: nowrap; animation: scrollAnimation 10s linear infinite; } @keyframes scrollAnimation { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } } </style> ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值