Vue 实现简易多行滚动"弹幕"效果


Posted in Javascript onJanuary 02, 2020

看一下效果:

Vue 实现简易多行滚动"弹幕"效果 

实现任意行数的定时翻滚效果,不使用重复标签的方式,而是根据展示个数判断是否缺省,并添加对应展示个数的重复项来实现。

Vue 的演示代码如下:

<template>
 <div class="demo-comment-container">
 <div
  class="scroll-container"
  :style="{height: `${height/100}rem`}"
 >
  <ul
  class="scroll-ul"
  :style="{transform: `translate3d(0, ${y/100}rem, 0)`, transition: `${transition}`}"
  >
  <div
   v-for="(item, index) in list"
   :key="index"
   v-bind="baseStyle.style"
   :bgColor="baseStyle.style.bgColor__bg"
   :style="{ color: rgba(baseStyle.color__nf) }"
   :class="['c-item-bg', 'c-item', !item.content && 'empty']"
  >
   <li
   class="c-item"
   >
   <div class="avatar">
    <img
    v-if="item.content"
    class="avatar-item"
    :src="item.photo"
    >
   </div>
   <div
    v-if="item.content"
    class="c-content"
    v-html="item.content"
   />
   </li>
  </div>
  </ul>
 </div>
 <div class="comment-entry">
  <div class="f">
  <div class="text-c">
   <span
   v-if="entry.type === 1"
   class="text"
   v-text="entry.text"
   />
   <div
   v-else
   class="img-container"
   >
   <img :src="entry.image">
   </div>
   <i
   v-if="count"
   class="c-c"
   >{{ count }}</i>
  </div>
  <div>
   <span class="fake-input">来发表你的看法吧~</span>
  </div>
  </div>
 </div>
 </div>
</template>
<script>
export default {
 inject: ['rgba'],
 props: {
 urlConfig: {
  type: Object,
  default: function () {
  return {}
  }
 },
 type: {
  type: String,
  default: 'hot'
 },
 pageSize: {
  type: Number,
  default: 50
 },
 open: {
  type: Boolean,
  default: true
 },
 entry: {
  type: Object,
  default: function () {
  return {
   type: 1, // 1 文字 2 自定义
   text: '',
   image: ''
  }
  }
 },
 number: {
  type: Number,
  default: 2
 },
 },
 data () {
 return {
  count: 2334,
  dom: null,
  height: 0, // 单项高度
  y: 0, // 每次移动距离
  list: [], // 接口列表
  originLength: 0, // 原始数组长度
  transition: 'ease all .4s',
  round: 0 // 需要滚动多少轮
 }
 },
 created () {
 this.getCommentList()
 },
 mounted () {
 this.dom = document.querySelector('.c-item')
 // 计算可视区域高度
 this.height = 64 * this.number + (12 * (this.number - 1))
 },
 methods: {
 getCommentList () {
  // 接口数据
  const _list = []
  this.originLength = _list.length
  const mod = this.originLength % this.number
  let need = this.originLength < this.number ? (this.number - this.originLength) : mod > 0 ? this.number - mod : 0 // 计算出要添加的空白元素个数
  this.list = _list

  // set empty item
  const empty = JSON.parse(JSON.stringify(_list[0]))
  empty.content = ''

  // 补齐空白元素
  while (need) {
  this.list.push(empty)
  need--
  }

  // 填充重复元素
  let repeat = this.number
  let index = 0
  while (repeat) {
  this.list.push(_list[index])
  index++
  repeat--
  }

  this.round = this.list.length / this.number

  this.scroll()
 },
 scroll () {
  let count = 1
  setInterval(() => {
  count++
  this.y -= this.height + 12 // 移动可视区域高度 + 最后一个 item 的 margin-bottom
  this.transition = '.4s ease all'
  setTimeout(() => {
   if (count === this.round) {
   count = 1
   this.transition = ''
   this.y = 0
   }
  }, 800)
  }, 2000)
 }
 }
}
</script>

总结

以上所述是小编给大家介绍的Vue 实现简易多行滚动"弹幕",希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
用JavaScript显示随机图像或引用
Apr 21 Javascript
javascript eval和JSON之间的联系
Dec 31 Javascript
JS中confirm,alert,prompt函数区别分析
Jan 17 Javascript
jquery设置css样式的多种方法(总结)
Feb 21 Javascript
Bootstrap模态框插入视频的实现代码
Jun 25 Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
Nov 17 Javascript
json对象及数组键值的深度大小写转换问题详解
Mar 30 Javascript
通过一次报错详细谈谈Point事件
May 17 Javascript
详解vue中移动端自适应方案
May 05 Javascript
vue使用nprogress加载路由进度条的方法
Jun 04 Javascript
记一次vue跨域的解决
Oct 21 Javascript
微信小程序canvas实现签名功能
Jan 19 Javascript
JS实现秒杀倒计时特效
Jan 02 #Javascript
在weex中愉快的使用scss的方法步骤
Jan 02 #Javascript
JS实现导航栏楼层特效
Jan 01 #Javascript
JS实现旋转木马轮播图
Jan 01 #Javascript
JS实现普通轮播图特效
Jan 01 #Javascript
javascript实现超好看的3D烟花特效
Jan 01 #Javascript
JavaScript工具库MyTools详解
Jan 01 #Javascript
You might like
LotusPhp笔记之:Logger组件的使用方法
2013/05/06 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
2015/01/22 PHP
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
2016/04/04 PHP
Laravel框架实现超简单的分页效果示例
2019/02/08 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
Array.prototype 的泛型应用分析
2010/04/30 Javascript
js中各浏览器中鼠标按键值的差异
2011/04/07 Javascript
13 个JavaScript 性能提升技巧分享
2012/07/26 Javascript
浏览器打开层自动缓慢展开收缩实例代码
2013/07/04 Javascript
网页右侧悬浮滚动在线qq客服代码示例
2014/04/28 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
2015/06/09 Javascript
学习JavaScript设计模式(代理模式)
2015/12/03 Javascript
新手学习前端之js模仿淘宝主页网站
2016/10/31 Javascript
Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法
2016/12/31 Javascript
xmlplus组件设计系列之分隔框(DividedBox)(8)
2017/05/02 Javascript
原生JS实现的双色球功能示例
2018/02/02 Javascript
[01:09:13]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第三场 1月19日
2021/03/11 DOTA
python读csv文件时指定行为表头或无表头的方法
2019/06/26 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
2019/07/22 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
Python urlopen()参数代码示例解析
2020/12/10 Python
简洁自适应404页面HTML好看的404源码
2020/12/16 HTML / CSS
美国排名第一的在线葡萄酒商店:Wine.com
2016/09/07 全球购物
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
美容师的职业规划书
2013/12/27 职场文书
死亡证明书样本说明
2014/10/18 职场文书
2014年财务部工作总结
2014/11/11 职场文书
党校学习党性分析材料
2014/12/19 职场文书
小学生光盘行动倡议书
2015/04/28 职场文书
农民工工资保障承诺书
2015/05/04 职场文书
环保宣传语大全
2015/07/13 职场文书
python 破解加密zip文件的密码
2021/04/22 Python
Python实现查询剪贴板自动匹配信息的思路详解
2021/07/09 Python
Python 快速验证代理IP是否有效的方法实现
2021/07/15 Python
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle
MySQL主从切换的超详细步骤
2022/06/28 MySQL