Vue简短代码实现文字首尾无缝跑马灯效果

news/2024/7/9 23:41:59 标签: 前端, Vue

Vue简短代码实现文字首尾无缝跑马灯效果

    • 写在前面
    • 效果图
    • 跑马灯子组件代码
    • 父组件代码

写在前面

由于HTML自带的marquee标签无法做到上一条文本和下一条文本无缝衔接,并且HTML标准已将其废弃,所以结合网上的资源自己写了一个,代码不多,仅能横向滚动,可滚动重复滚动一条或多条文本,字数不限制,若想要实现纵向滚动可使用vux组件库的marquee组件。

效果图

gif动图展示出来看起来很卡,实际效果并不卡哦😁
实际不卡

跑马灯子组件代码

<template>
  <div class="marquee-wrap">
  	<!-- 滚动内容 -->
    <div class="scroll">
      <p class="marquee">{{text}}</p>
      <!-- 文字副本 -->
      <p class="copy"></p>
    </div>
    <!-- 为了计算总文本宽度,通过css在页面中隐藏 -->
    <p class="getWidth">{{text}}</p>
  </div>
</template>

<script>
export default {
  props: ['lists'], // 父组件传过来的数组
  data () {
    return {
      timer: null,
      text: ''
    }
  },
  created () {
    // 进入页面等一秒才开始滑动
    let timer = setTimeout(() => {
      this.move()
      clearTimeout(timer)
    }, 1000)
  },
  // 把父组件传入的arr转化成字符串
  mounted () {
    for (let item of this.lists) {
      this.text += ' ' + item
    }
  },
  methods: {
    move () {
      let maxWidth = document.querySelector('.marquee-wrap').clientWidth
      // 获取文字text 的计算后宽度 (由于overflow的存在,直接获取不到,需要独立的node计算)
      let width = document.querySelector('.getWidth').scrollWidth
      // 如果文本内容的宽度小于页面宽度,则表示文字小于等于一行,则不需要滚动
      if (width <= maxWidth) return
      let scroll = document.querySelector('.scroll')
      let copy = document.querySelector('.copy')
      copy.innerText = this.text // 文字副本填充
      let distance = 0 // 位移距离
      // 设置位移
      this.timer = setInterval(() => {
        distance -= 1
        // 如果位移超过文字宽度,则回到起点
        if (-distance >= width) {
          distance = 16 // 距离必须与marquee的margin宽度相同
        }
        scroll.style.transform = 'translateX(' + distance + 'px)'
      }, 20)
    }
  },
  beforeDestroy () {
  	// 清除计时器
    clearInterval(this.timer)
  }
}
</script>
<style scoped lang='less'>
  .marquee-wrap {
    width: 100%;
    overflow: hidden;
    position: relative;
    .scroll {
      display: flex;
      p{
        word-break:keep-all; // 不换行
        white-space:nowrap;
        /* 设置前后间隔 */
        &.marquee {
          margin-right: 16px;
        }
      }
    }
    /* 仅为了获取宽度,故隐藏掉 */
    .getWidth {
      word-break:keep-all; // 不换行
      white-space:nowrap;
      position: absolute;
      opacity: 0;
      top: 0;
    }
  }
</style>

父组件代码

<template>
 <div class="notice">
   <!-- 喇叭图片,可删除 -->
   <img class="icon-notice" src="./image/喇叭.png"/>
   <marquee :lists="lists"></marquee>
 </div>
</template>

<script>
// 引入跑马灯组件
import marquee from './marquee'

export default {
  data () {
    return {
      // 要展示的数据,以数组的形式
      lists: ['未认证用户不能报名,每人每次只能预约一个时段的健身项目,快来健身吧!!!']
    }
  },
  components: {
    marquee
  }
}
</script>

<style lang="less" scoped>
  .notice{
    padding: 16/75rem 28/75rem;
    font-size:24/75rem;
    color:#929292;
    line-height:38/75rem;
    display: flex;
    align-items: center;
    .icon-notice {
      width: 25/75rem;
      height: 21/75rem;
      margin-right: 14/75rem;
    }
  }
</style>

若有错误,请指正,谢谢?


http://www.niftyadmin.cn/n/1410442.html

相关文章

KVM增加硬盘

本文首发于烂泥行天下。 Linux虚拟机在使用过程中&#xff0c;硬盘空间不够使用。由于前期没有做LVM&#xff0c;所以只能手动添加新的硬盘。 给虚拟机添加硬盘有两种方法&#xff1a; 1、通过virsh attach-disk命令添加一块硬盘到系统中&#xff0c;即时生效&#xff0c;但系统…

ios移动端JS获取指定日期时间戳出现NAN的问题

问题 在做移动端项目时&#xff0c;发现获取将指定日期通过new Date().getTime()转换成时间戳时&#xff0c;在电脑和安卓机上显示正常&#xff0c;ios上显示NAN let date 2019-05-16 12:00 console.log(new Date().getTime(date)) // 电脑上&#xff1a;1557979200000 // 安…

Vue封装mescroll组件

写在前面 搜罗全网&#xff0c;终于找到一个好用的Vue滑动组件&#xff0c;包括上拉加载&#xff0c;下拉刷新等一大堆好用的方法&#xff0c;他就是mescroll组件&#xff0c;由于很多个页面都需要用到mescroll组件&#xff0c;所以自己把他封装成了一个组件&#xff0c;方便自…

tnsnames.ora配置

方法一&#xff1a;jingtai (DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL TCP)(HOST 192.168.6.111)(PORT 1523)))(CONNECT_DATA (SERVER DEDICATED)(SERVICE_NAME prod.enmoedu.com)——取自global_name&#xff0c;可以理解为service_name等同于global_name))global…

Vue自定义全局弹窗组件

写在前面 页面中会有很多时候需要弹窗提示&#xff0c;我们可以写一个弹窗组件&#xff0c;但是如果每个页面都引入这个组件&#xff0c;太麻烦了&#xff0c;所以我们将它变成全局组件&#xff0c;需要用的时候直接通过JS调用即可&#xff0c;不需要在每个页面引入了 效果图…

循环识别的C++/Java/Go/Scala实现比较

摘要 - 在这个经验报告中&#xff0c;我们用四种编程语言C/Java/Go/Scala&#xff0c;编写了满足规范的、紧凑的性能测试基准程序。实现中&#xff0c;我们都是使用的实现语言的惯用的容器类&#xff0c;循环结构&#xff0c;以及内存/对象分配方案。它并不试图利用特定的语言和…

css修改自带滚动条样式

写在前面 浏览器自带的滚动条不太好看&#xff0c;短粗短粗的&#xff0c;我们可以通过css来更改它的样式 显示效果 代码实现 ::-webkit-scrollbar{width: 4px;height: 10px; } ::-webkit-scrollbar-button{width: 0;height: 0; } ::-webkit-scrollbar-track{ } ::-webkit-s…

细说 Java 的深拷贝和浅拷贝

一、前言 任何变成语言中&#xff0c;其实都有浅拷贝和深拷贝的概念&#xff0c;Java 中也不例外。在对一个现有的对象进行拷贝操作的时候&#xff0c;是有浅拷贝和深拷贝之分的&#xff0c;他们在实际使用中&#xff0c;区别很大&#xff0c;如果对其进行混淆&#xff0c;可能…