本文实例为大家分享了Vue跑马灯marquee组件的具体代码,供大家参考,具体内容如下

一、实现效果

二、实现过程

前言:最开始用间隔器方案制作了一个跑马灯,但是放在移动端中会出现严重的掉帧卡顿现象,于是整理思路后采用transition方案制作一个从右到左的动画处理问题

思路整理:

1. 过渡是需要设定时间的,但是跑马灯中的文本可能是长短不一的

解决方案:根据文本的总宽度(即文本总长)设定过渡时间,假设文本宽度500px,我们将其除以50,即过渡时间为10s

原生js表示如下:

const text = document.getElementsByClassName("text")[0]  // 文本
const textWidth = text.clientWidth  // 文本的总宽度
const tranTime = textWidth / 50  // 根据文本宽度设置过渡时间
text.style.transition = "left "   tranTime   "s linear"  // 滚动前绑定过渡属性

2. 要想持续滚动需要重复触发滚动的事件

解决方案:通过上文的过渡时间设定一个重复时间

原生js表示如下:

const againTime = tranTime * 1000   1000  // 重新开始滚动时间计算(动态)
// 开始滚动
    function textRoll() {
      // 滚动操作
      // ``````
      setTimeout(() => {
        textRoll()
      }, againTime);
    }

3. 接下来实现文本滚动效果

1) 先将文本设定在容器最右侧

2) 为文本绑定设定好的过渡属性,例:transition: left 10s linear

3) 因为有过渡属性,此时再将文本设定到容器最左侧,就会产生一个从右向左的移动的过渡

原生js表示如下:

function textRoll() {
      text.style.transition = "left "   tranTime   "s linear"  // 滚动前绑定过渡属性
      text.style.left = -textWidth   "px"  // 向容器最左移动
      setTimeout(() => {
        setTimeout(() => {
          textRoll()
        }, 0);
      }, againTime);
    }

4.到目前就能有一次完整的滚动了,接下来是定义重新滚动

让文本回到容器最右侧,但是目前文本已经有过渡属性了,如果改变其left会导致他从左向右滚动,所以要先清除过渡属性,再改变其left到容器最右侧,然后用一开始设定的再次滚动时间绑定定时器

function textRoll() {
      text.style.transition = "left "   tranTime   "s linear"  // 滚动前绑定过渡属性
 
      text.style.left = -textWidth   "px"  // 向容器最左移动
 
      setTimeout(() => {
        // 还原文本位置
        text.style.transition = ""  // 还原前需清除过渡
        text.style.left = wrapperWidth   "px"
        setTimeout(() => {
          textRoll()
        }, 0);
      }, againTime);
    }

三、js版本源码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>跑马灯</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }
 
    body {
      height: 100vh;
      display: flex;
      justify-content: center;
      align-items: center;
    }
 
    .wrapper {
      width: 60%;
      height: 30px;
      background-color: #000;
      overflow: hidden;
      position: relative;
    }
 
    .text {
      color: #fff;
      white-space: nowrap;
      line-height: 30px;
      position: absolute;
    }
  </style>
</head>
<body>
  <div class="wrapper">
    <div class="text">如何四纪为天子,不及卢家有莫愁。</div>
  </div>
 
  <script>
    const wrapper = document.getElementsByClassName("wrapper")[0]  // 容器
    const text = document.getElementsByClassName("text")[0]  // 文本
 
    const wrapperWidth = wrapper.clientWidth  // 容器的总宽度
    const textWidth = text.clientWidth  // 文本的总宽度
 
    text.style.left = wrapperWidth   "px"  // 开始滚动前设定文本在容器最右侧以外
    const tranTime = textWidth / 50  // 根据文本宽度设置过渡时间
    const againTime = tranTime * 1000   1000  // 重新开始滚动时间计算(动态)
 
    setTimeout(() => {
      textRoll()
    }, 0);
 
    // 开始滚动
    function textRoll() {
      text.style.transition = "left "   tranTime   "s linear"  // 滚动前绑定过渡属性
 
      text.style.left = -textWidth   "px"  // 向容器最左移动
 
      setTimeout(() => {
        // 还原文本位置
        text.style.transition = ""  // 还原前需清除过渡
        text.style.left = wrapperWidth   "px"
        setTimeout(() => {
          textRoll()
        }, 0);
      }, againTime);
    }
  </script>
</body>
</html>

四、Vue组件源码

<template>
  <div class="mobile-marquee">
    <img src="~assets/img/home/notice/notice.png" alt="" />
    <div class="mobile-marquee-wrapper" ref="wrapper">
      <div
        class="mobile-marquee-text"
        ref="text"
        :style="{ 'left': textLeft, 'transition': textTransition }"
      >
        {{ text }}
      </div>
    </div>
  </div>
</template>
 
<script>
export default {
  data() {
    return {
      text:
        "海外徒闻更九州,他生未卜此生休。 空闻虎旅传宵柝,无复鸡人报晓筹。 此日六军同驻马,当时七夕笑牵牛。 如何四纪为天子,不及卢家有莫愁。",
      url: "",
      textLeft: "",
      textTransition: ""
    };
  },
  methods: {
    // 跑马灯运作
    marquee() {
      const _this = this
      const wrapperWidth = this.$refs.wrapper.clientWidth; // 容器的总宽度
      const textWidth = this.$refs.text.clientWidth; // 文本的总宽度
      const transTime = textWidth / 50; // 根据文本宽度设置过渡时间
      const againTime = transTime * 1000   1000; // 重新开始滚动时间计算(动态)
 
      this.textLeft = wrapperWidth   "px"; // 开始滚动前设定文本在容器最右侧以外
      
      setTimeout(() => {
        textRoll()
      }, 0);
 
      function textRoll() {
        _this.textTransition = "left "   transTime   "s linear"; // 滚动前绑定过渡属性
        _this.textLeft = -textWidth   "px"; // 向容器最左移动
        setTimeout(() => {
          // 还原文本位置
          _this.textTransition = "none"; // 还原前需清除过渡
          _this.textLeft = wrapperWidth   "px";
          setTimeout(() => {
            textRoll();
          }, 0);
        }, againTime);
      }
    },
  },
  mounted() {
    this.marquee();
  }
};
</script>
 
<style>
.mobile-marquee {
  display: flex;
  align-items: center;
  height: 40px;
  margin: 0 16px;
}
 
.mobile-marquee-wrapper {
  flex: 1;
  height: 40px;
  overflow: hidden;
  position: relative;
}
 
.mobile-marquee img {
  width: 14px;
  height: 12px;
  margin-right: 7px;
}
 
.mobile-marquee-text {
  color: #333;
  white-space: nowrap;
  line-height: 40px;
  position: absolute;
}
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持Devmax。

Vue跑马灯marquee组件使用方法详解的更多相关文章

  1. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  2. 跑马灯动画点击事件

    代码块

  3. android – 使用marquee ellipsize在TextView上设置textIsSelectable会添加椭圆

    我的应用程序中的屏幕可能会将非常长的字符串发布到TextView中.对于这种情况,我有android:ellipsize=“marquee”设置,因此文本将在TextView上进行选取.但是,我已经决定我也希望这个文本可以选择.在大多数情况下,这没有问题.文本小于TextView,用户可以选择它.但是,如果我有textIsSelectable属性,并且文本大于TextView,则文本将拾取椭圆而不是完整字符串.它仍然是大帐篷,但它不再显示全文.它切断它并显示一个椭圆.有没有办法让文本可选并仍然保持整个字符

  4. 如何修复文本溢出TextView与填充android:ellipsize =“marquee”

    在某些Android设备上,带有android:ellipsize=“marquee”的文本视图和填充会导致文本溢出textview.它发生在右侧但不在TextView的左侧,而填充应用于左侧和右侧.三星galaxyS3和S6分别不会出现在AndroidK和L上.我该怎么做才能解决或解决这个问题?

  5. vue自定义加载指令v-loading占位图指令v-showimg

    这篇文章主要为大家介绍了vue自定义加载指令和v-loading占位图指令v-showimg的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  6. vue使用动画实现滚动表格效果

    这篇文章主要为大家详细介绍了vue使用动画实现滚动表格效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  7. 关于Vue 监控数组的问题

    这篇文章主要介绍了Vue 监控数组的示例,主要包括Vue 是如何追踪数据发生变化,Vue 如何更新数组以及为什么有些数组的数据变更不能被 Vue 监测到,对vue监控数组知识是面试比较常见的问题,感兴趣的朋友一起看看吧

  8. Vue子组件props从父组件接收数据并存入data

    这篇文章主要介绍了Vue子组件props从父组件接收数据并存入data的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  9. Vue h函数的使用详解

    本文主要介绍了Vue h函数的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. VUE响应式原理的实现详解

    这篇文章主要为大家详细介绍了VUE响应式原理的实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部