先上效果图:

(1) 看起来可能有点卡顿,但是实际上页面上看起来挺顺畅的。

(2) 思路就是获取每一个列表的宽度,设置定时器移动列表,当移动的距离达到一个列表的宽度的时候,把这个距离放到数组的最后。这样就能达成无缝循环滚动了。

大致的情况就是下面这样:

接下来就是代码的实现:

index.vue 引入组件

<template><div><marqueeLeft :send-val='send'></marqueeLeft ></div>
</template>
<script>import marqueeLeft from '../components/marquee'export default {data:function(){return{send:[{place: "来自东莞市的", name: "黄女士"},{place: "来自太原市的", name: "吴先生"},{place: "来自常州市的", name: "戚先生"},{place: "来自金华市的", name: "尤先生"},{place: "来自贵阳市的", name: "陈女士"},{place: "来自长春市的", name: "魏女士"},{place: "来自泉州市的", name: "褚先生"},{place: "来自南昌市的", name: "蒋女士"},{place: "来自南京市的", name: "沈先生"},{place: "来自天津市的", name: "韩先生"},{place: "来自宁波市的", name: "邹女士"},{place: "来自嘉兴市的", name: "周女士"},{place: "来自长沙市的", name: "秦先生"},{place: "来自济南市的", name: "孙女士"},{place: "来自杭州市的", name: "杨先生"}]}},components:{ marqueeLeft },}
</script>

marquee.vue 组件页面

<template><div class="my-outbox"><div class="my-inbox" ref='box'><div class="my-list" v-for="(item,index) in sendVal" :key='index' ref='list'>{{item.place}}<span class="my-uname">{{item.name}}</span>刚刚购买了产品</div></div></div>
</template><script>export default {name:'my-marquee-left',props:{        sendVal:Array},data() {return {nowTime:null,//定时器标识disArr:[],//每一个内容的宽度}}, mounted:function(){var that = this;var item = this.$refs.list; var len = this.sendVal.length;var arr = [];var margin = this.getMargin(item[0]) //因为设置的margin值一样,所以取第一个就行。for(var i = 0;i < len;i++){arr.push(item[i].clientWidth + margin)//把宽度和 margin 加起来就是每一个元素需要移动的距离}this.disArr = arr;this.moveLeft();},beforeDestroy:function(){clearInterval(this.nowTime);//页面关闭清除定时器this.nowTime = null;//清除定时器标识},methods:{//获取margin属性getMargin:function(obj){var marg = window.getComputedStyle(obj,null)['margin-right'];marg = marg.replace('px','')return Number(marg) //强制转化成数字},//移动的方法moveLeft:function(){var outbox = this.$refs.box;var that=this;var startDis = 0;//初始位置this.nowTime = setInterval(function(){startDis -= 0.5;if(Math.abs(startDis) > Math.abs(that.disArr[0])){that.disArr.push(that.disArr.shift())//每次移动完一个元素的距离,就把这个元素的宽度that.sendVal.push(that.sendVal.shift())//每次移动完一个元素的距离,就把列表数据的第一项放到最后一项startDis = 0;}outbox.style = 'transform: translateX('+ startDis +'px)'; //每次都让盒子移动指定的距离},1000/60)}}}
</script><style lang="less" scoped>.my-outbox{color: #D7BC8D;overflow: hidden;height: 35px;background: #422b02;.my-inbox{white-space: nowrap;.my-list{margin-right: 25px;display: inline-block;font-size: 13px;height: 35px;line-height: 35px;.my-uname{color: #FF8900;}}}}
</style>

(1) 添加一个获取margin的方法,是为了保证如果是使用 rem em 等单位时,margin值不会出现偏差的情况

(2) 如果引入组件的页面中,send-val的值是异步请求的。那么,在marquee.vue组件页面,多数情况会获取不了 refs 。这时候我自己的解决方法是:

   表示只有当 send 不为空的时候才渲染该组件,不过这种情况会导致如果 请求响应太慢,组件会一直渲染不出来,就可能会影响布局。

(3) 如果不想每次都去设置transform,那么可以把transform放到该元素上,然后修改data中的数据就行了,比如:

如果想实现,上下无缝滚动,这种效果。思路和左右无缝滚动一样,基本上只需要把 transform 改成 Y轴移动 ,每个列表的宽度改成高度就行了。

不清楚这种方式实现是否会有什么问题,FPS一直保持在 接近60左右。暂时没发现什么缺点。。。

文章转载自 https://www.cnblogs.com/zjjDaily/p/10675708.html

vue 自定义marquee横向无缝滚动组件相关推荐

  1. vue 文字上下循环滚动_基于 Vue 无缝滚动组件Vue-Seamless-Scroll

    今天给小伙伴们推荐一款超棒的Vue无缝滚动组件VueSeamlessScroll. vue-seamless-scroll 基于 vue.js 构建的简单实用的无缝滚动组件.满足丰富的配置需求,支持上 ...

  2. 基于vue的无缝滚动组件

    vue-seamless-scroll A simple, Seamless scrolling for Vue.js 在awesome上一直没有发现vue的无缝滚动组件,在工作之余写了个组件,分享出 ...

  3. vue 自定义marquee无缝滚动组件

    今天介绍一下,上下,左右无缝滚动的公告栏信息组件的开发. 首先上效果: 看起来有点卡顿,实际上还是挺顺畅的... 代码: 左右滚动的组件:marqueeX <template><di ...

  4. vue实现列表的无缝滚动

    前言: 在有无缝滚动的需求的时候我第一时间想的是轮播图,但是想弄一个列表那种的效果,轮播图就实现的就只能自己写个表头,这样用户体验不好,这里经过我自己使用,不管是兼容还是跨浏览器(版本较高)都是可以的 ...

  5. vue中实现列表无缝滚动

    1.安装 npm install vue-seamless-scroll --save 2.在需要使用的组件中引入进行配置 import vueSeamlessScroll from "vu ...

  6. vue 自定义marquee无缝滚动组件

    首先上效果: 看起来有点卡顿,实际上还是挺顺畅的... 代码: 左右滚动的组件:marqueeX <template><div class="my-outbox" ...

  7. 加个属性让div成纵向横向无缝滚动(支持IE和FF)

    <!doctype html public "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. JQuery Marquee插件(无缝滚动效果)- marquee.js

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  9. vue自定义全局loading加载组件

    1.实现效果 2.实现原理 Vue.extend:extend 创建的是 Vue 构造器,可通过 new Profile().$mount('#mount-point') 来挂载到指定的元素上. vu ...

  10. Vue 自定义一个全局弹框组件

    前文:其实element ui有提供this.$mesage和this.$notify弹框组件可供使用,但是我们的ui设计的样式以及布局还是不完全一样的,为了达到100%的呈现效果,所以自己写了一个全 ...

最新文章

  1. 大家都收藏了的最新开源项目Top12!CV、NLP、机器学习一应俱全
  2. 数据库还原失败System.Data.SqlClient.SqlError: 无法执行 BACKUP LOG,因为当前没有数据库备份...
  3. python程序设计语言是什么类型的语言-Python 是弱类型的语言 强类型和弱类型的语言区别...
  4. DataTable 转 Entity
  5. 【Linux】一步一步学Linux——last命令(98)
  6. mysql数据库二进制_Mysql数据库简单安装(二进制)
  7. java第六次作业 计科1501班 张鹏
  8. 两道挺有意思的思考题
  9. Registry新建以及版本
  10. mysql安装开始报错_MYSQL安装报错 -- 出现Failed to find valid data directory.
  11. 使用ServletContextListener关闭Redisson连接
  12. NA-NP-IE系列实验2
  13. Libra客户端使用
  14. 7款ui设计开发初学者必学的设计软件
  15. 用画图工具制作背景透明的图片总结
  16. 关于蓝牙无线通信与AOA定位技术
  17. iOS基础:Xcode 添加PCH文件、常用预处理指令(移除程序中的identifier、发布模式关闭NSLog、导出和隐藏符号)
  18. 在Java中如何跳出当前的多重嵌套循环?
  19. day04 【Map】
  20. matlab 画图像频谱图

热门文章

  1. 华为路由设置虚拟服务器命令,华为路由器配置ip命令
  2. mysql varchar 不设长度_Mysql varchar长度问题
  3. 你理解大话西游片尾那句“他好像一条狗”吗?
  4. 快乐数Python解法
  5. 颠覆你的思维,探寻人类发展史
  6. 马斯克是全人类的?他旗下有9家公司,特斯拉被评为最没技术含量
  7. face_recognition库的使用
  8. 量化金融笔记1-股票量化基础
  9. Anycubic Vyper 3D打印机串口屏改造开源项目之QT温度曲线显示(二)
  10. 图灵机器人源码php,使用图灵机器人api搭建微信聊天机器人php实现-后台/架构/数据库-敏捷大拇指-一个敢保留真话的IT精英社区...