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中使用mockjs代码实例
Nov 25 Vue.js
vue3.0自定义指令(drectives)知识点总结
Dec 27 Vue.js
vue导入.md文件的步骤(markdown转HTML)
Dec 31 Vue.js
Vue 修改网站图标的方法
Dec 31 Vue.js
手写Vue源码之数据劫持示例详解
Jan 04 Vue.js
vue实现防抖的实例代码
Jan 11 Vue.js
基于VUE实现简单的学生信息管理系统
Jan 13 Vue.js
Vue3 Composition API的使用简介
Mar 29 Vue.js
详解Vue中$props、$attrs和$listeners的使用方法
Feb 18 Vue.js
vue打包时去掉所有的console.log
Apr 10 Vue.js
分享一个vue实现的记事本功能案例
Apr 11 Vue.js
使用vue判断当前环境是安卓还是IOS
Apr 12 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+ajax做仿百度搜索下拉自动提示框(有实例)
2012/08/21 PHP
基于php iconv函数的使用详解
2013/06/09 PHP
PHP抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
用js实现的检测浏览器和系统的函数
2009/04/09 Javascript
基于JQuery的浮动DIV显示提示信息并自动隐藏
2011/02/11 Javascript
jquery easyui滚动条部分设置介绍
2013/09/12 Javascript
javascript中简单的进制转换代码实例
2013/10/26 Javascript
React组件的三种写法总结
2017/01/12 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
解决vue props 拿不到值的问题
2018/09/11 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
2019/12/07 Javascript
JS常用排序方法实例代码解析
2020/03/03 Javascript
[33:23]VG vs Pain 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python3 正在毁灭 Python的原因分析
2014/11/28 Python
Python利用IPython提高开发效率
2016/08/10 Python
Python 中迭代器与生成器实例详解
2017/03/29 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
2017/12/14 Python
通过pykafka接收Kafka消息队列的方法
2018/12/27 Python
python实现列表中最大最小值输出的示例
2019/07/09 Python
Django模板Templates使用方法详解
2019/07/19 Python
Python+OpenCV实现实时眼动追踪的示例代码
2019/11/11 Python
基于TensorFlow中自定义梯度的2种方式
2020/02/04 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
2020/02/27 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
2020/08/04 Python
详解css3中dispaly的Grid布局与Flex布局
2020/09/11 HTML / CSS
英文简历中的自我评价
2013/10/06 职场文书
毕业生的自我评价分享
2013/12/18 职场文书
学习十八大精神心得体会
2013/12/31 职场文书
学生抄袭作业的检讨书
2014/10/02 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
2015教师年度思想工作总结
2015/04/30 职场文书
美丽心灵观后感
2015/06/01 职场文书
雷锋电影观后感
2015/06/10 职场文书
无房证明样本
2015/06/17 职场文书
Python Pandas数据分析之iloc和loc的用法详解
2021/11/11 Python