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-router中hash模式与history模式的区别详解
Dec 15 Vue.js
详解Vue2的diff算法
Jan 06 Vue.js
Vue页面渲染中key的应用实例教程
Jan 12 Vue.js
Vue 3自定义指令开发的相关总结
Jan 29 Vue.js
Vite和Vue CLI的优劣
Jan 30 Vue.js
手写Vue2.0 数据劫持的示例
Mar 04 Vue.js
Vue CLI中模式与环境变量的深入详解
May 30 Vue.js
深入讲解Vue中父子组件通信与事件触发
Mar 22 Vue.js
vue 实现弹窗关闭后刷新效果
Apr 08 Vue.js
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
Apr 30 Vue.js
Vue ECharts实现机舱座位选择展示功能
May 15 Vue.js
Vue Element plus使用方法梳理
Dec 24 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网页标题中文乱码的有效解决方法
2014/03/05 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
2016/12/24 PHP
深入理解JavaScript系列(11) 执行上下文(Execution Contexts)
2012/01/15 Javascript
一行代码告别document.getElementById
2012/06/01 Javascript
JQuery获取各种宽度、高度(format函数)实例
2013/03/04 Javascript
jQuery阻止同类型事件小结
2013/04/19 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
比例尺、缩略图、平移缩放之百度地图添加控件方法
2015/08/03 Javascript
JS实现响应鼠标点击动画渐变弹出层效果代码
2016/03/25 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
Vue获取DOM元素样式和样式更改示例
2017/03/07 Javascript
详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)
2017/03/21 Javascript
webpack4的迁移的使用方法
2018/05/25 Javascript
vue.extend与vue.component的区别和联系
2018/09/19 Javascript
Vue.js项目实战之多语种网站的功能实现(租车)
2019/08/07 Javascript
Python json模块使用实例
2015/04/11 Python
Python发送email的3种方法
2015/04/28 Python
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
2015/05/05 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
2017/11/23 Python
详解TensorFlow在windows上安装与简单示例
2018/03/05 Python
Python3 中把txt数据文件读入到矩阵中的方法
2018/04/27 Python
python3将变量输入的简单实例
2020/08/19 Python
如何使用Python进行PDF图片识别OCR
2021/01/22 Python
使用CSS媒体查询(Media Queries)和JavaScript判断浏览器设备类型的方法
2014/04/03 HTML / CSS
HTML5中的拖放实现详解
2017/08/23 HTML / CSS
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
英国领先的在线高尔夫商店:Gamola Golf
2019/11/16 全球购物
班班通项目实施方案
2014/02/25 职场文书
激励员工的口号
2014/06/16 职场文书
班级活动总结格式
2014/08/30 职场文书
推广普通话共筑中国梦演讲稿
2014/09/21 职场文书
暑假安全保证书
2015/02/28 职场文书
2016七夕情人节广告语
2016/01/28 职场文书
《蜜蜂引路》教学反思
2016/02/22 职场文书
2016年“5.12”国际护士节活动总结
2016/04/06 职场文书
Three.js实现雪糕地球的使用示例详解
2022/07/07 Javascript