vue实现可以快进后退的跑马灯组件


Posted in Vue.js onApril 08, 2022

本文实例为大家分享了vue开发实现跑马灯效果组件的具体代码,供大家参考,具体内容如下

用vue编写一个可以快进后退的跑马灯组件

由于业务需求,要实现一个会可以控制速度的跑马灯,初开始用js的setinterval每隔几毫秒来减取一个字符拼接到后面,效果不理想就放弃了。后查询用js的animate这个api改造大功告成!

效果图

vue实现可以快进后退的跑马灯组件

组件代码

<template>
  <div class="marquee" @mouseover="pause(true)" @mouseleave="pause()">
    <i
      class="marquee-btn btn-left el-icon-d-arrow-left"
      @mousedown="speedUp(true)"
      @mouseup="speedStop()"
    ></i>
    <div ref="marqueeText" class="marquee-text">
      <div v-if="itemClick">
        <span
          v-for="item in text.split(splitSymbol)"
          :key="item"
          @click="$emit('itemClickEvent', item)"
        >{{item + ' 、'}}</span>
      </div>
      <div v-else>{{text}}</div>
    </div>
    <i
      class="marquee-btn btn-right el-icon-d-arrow-right"
      @mousedown="speedUp()"
      @mouseup="speedStop()"
    ></i>
  </div>
</template>

<script>
export default {
  name: "marquee",
  props: {
    text: {
      type: String,
      required: true
    },
    speed: {
      type: Number,
      required: false,
      default: 110
    },
    // 是否每个都可以点击触发事件
    itemClick: {
      type: Boolean,
      required: false,
      default: false
    },
    // 每个触发事件元素的分割符号
    splitSymbol: {
      type: String,
      required: false,
      default: ''
    }
  },
  data() {
    return {
      aniInstance: null,
      speedTimer: null
    };
  },
  methods: {
    setAnimate() {
      const contentWidth = this.$refs.marqueeText.scrollWidth;
      const keyframes = [
        { transform: "translateX(100%)" },
        { transform: `translateX(-${contentWidth}px)` }
      ];
      const animateOptions = {
        duration: (contentWidth / this.speed) * 1000,
        iterations: Infinity,
        easing: "linear"
      };
      this.aniInstance = document.querySelector(".marquee-text").animate(keyframes, animateOptions);
    },
    /**
     * 快进
     * @param { Boolean } isLeft 是否为左方向
     */
    speedUp(isLeft = false) {
      const set = () => {
        if (this.aniInstance.currentTime > 0) {
          this.aniInstance.currentTime = this.aniInstance.currentTime + (isLeft ? 2000 : -2000);
          this.aniInstance.currentTime <= 0 && (this.aniInstance.currentTime = 0);
        }
      }
      // 鼠标单击
      set();
      // 鼠标长按
      this.speedTimer = setInterval(() => {
        set()
      }, 100);
    },
    // 快进停止
    speedStop() {
      clearInterval(this.speedTimer);
      this.speedTimer = null;
    },
    /**
     * 暂停、播放
     * @param { Boolean } isPause 是否暂停
     */
    pause(isPause = false) {
      this.aniInstance[["play", "pause"][Number(isPause)]]();
    }
  },
  mounted() {
    this.$nextTick(() => {
      this.setAnimate();
    });
  }
};
</script>

<style lang="less" scoped>
.marquee {
  position: relative;
  padding: 10px 0;
  overflow: hidden;
  width: 100%;
  font-size: 16px;
  color: #fff;
  background-image: linear-gradient(
    to left,
    #b9565e,
    #cb655a,
    #da7655,
    #e58a50,
    #eb9f4b
  );
  &:hover .marquee-btn {
    opacity: 1;
  }
}
.marquee-btn {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  padding: 15px;
  color: #fff;
  background: rgba(1, 1, 1, 0.4);
  z-index: 999;
  cursor: pointer;
  opacity: 0;
  transition: all 0.2s linear;
}
.btn-left {
  left: 0;
}
.btn-right {
  right: 0;
}
.marquee-text {
  white-space: nowrap;
  span {
    &:hover {
      cursor: pointer;
      color: #2c3e50;
    }
  }
}
</style>

父组件代码

<Marquee
  :text="overdueInfo.content"
  :itemClick="true"
  :speed="120"
  splitSymbol="、"
  @itemClickEvent="marqueeSearch"
  class="marquee-box__container"
></Marquee>

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

Vue.js 相关文章推荐
vue调用微信JSDK 扫一扫,相册等需要注意的事项
Jan 03 Vue.js
Vue项目中使用mock.js的完整步骤
Jan 12 Vue.js
vue element el-transfer增加拖拽功能
Jan 15 Vue.js
使用vue3重构拼图游戏的实现示例
Jan 25 Vue.js
如何封装Vue Element的table表格组件
Feb 06 Vue.js
vue-router路由懒加载及实现的3种方式
Feb 28 Vue.js
vue前端工程的搭建
Mar 31 Vue.js
Vue.js中v-bind指令的用法介绍
Mar 13 Vue.js
vue封装数字翻牌器
Apr 20 Vue.js
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
Apr 24 Vue.js
如何vue使用el-table遍历循环表头和表体数据
Apr 26 Vue.js
vue3 自定义图片放大器效果的示例代码
Jul 23 Vue.js
Axios代理配置及封装响应拦截处理方式
vue-cil之axios的二次封装与proxy反向代理使用说明
Apr 07 #Vue.js
vue实现拖拽交换位置
Apr 07 #Vue.js
Vue.Draggable实现交换位置
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
vue cli4中mockjs在dev环境和build环境的配置详情
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 #Vue.js
You might like
php 清除网页病毒的方法
2008/12/05 PHP
php不用内置函数对数组排序的两个算法代码
2010/02/08 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
2014/06/12 PHP
跟我学Laravel之请求(Request)的生命周期
2014/10/15 PHP
优化JavaScript脚本的性能的几个注意事项
2006/12/22 Javascript
JS模拟多线程
2007/02/07 Javascript
几个常用的JavaScript字符串处理函数 - split()、join()、substring()和indexOf()
2009/06/02 Javascript
iframe 父窗口和子窗口相互的调用方法集锦
2010/12/15 Javascript
node.js中的fs.ftruncate方法使用说明
2014/12/15 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
2015/05/13 Javascript
require.js的用法详解
2015/10/20 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
2016/08/23 Javascript
vue.js将unix时间戳转换为自定义时间格式
2017/01/03 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
node通过express搭建自己的服务器
2017/09/30 Javascript
一种angular的方法级的缓存注解(装饰器)
2018/03/13 Javascript
10分钟上手vue-cli 3.0 入门介绍
2018/04/04 Javascript
angularjs 动态从后台获取下拉框的值方法
2018/08/13 Javascript
JavaScript之解构赋值的理解
2019/01/30 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
2019/09/28 Javascript
electron+vue实现div contenteditable截图功能
2020/01/07 Javascript
深入了解JS之作用域和闭包
2020/06/16 Javascript
Javascript数组及类数组相关原理详解
2020/10/29 Javascript
在nodejs中创建child process的方法
2021/01/26 NodeJs
Python松散正则表达式用法分析
2016/04/29 Python
Python Selenium 之数据驱动测试的实现
2019/08/01 Python
Python递归及尾递归优化操作实例分析
2020/02/01 Python
酒店司机岗位职责
2013/12/14 职场文书
房屋租赁协议书
2014/04/10 职场文书
法律专业自荐信
2014/06/03 职场文书
经验交流材料格式
2014/12/30 职场文书
2019年作为一名实习生的述职报告
2019/09/29 职场文书
HTML速写之Emmet语法规则的实现
2021/04/07 HTML / CSS
Redis实现订单自动过期功能的示例代码
2021/05/08 Redis
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电
VUE递归树形实现多级列表
2022/07/15 Vue.js