JS实现公告消息滚动

因为要适配iOS前端,所以在想最简实现一个静态数据的抽奖滚动栏,研究时直接用了当前运行的ReactJS框架实现,于是昨天先打了个草稿。经测试在iPhone6S Plus A1699 Version 12.1.2上显示正常。

import React from 'react'class ScrollMessagePage {componentDidMount() {//消息关键字数据const loanUserList = ['赵', '钱', '孙', '宋', '王', '徐', '丘', '骆', '高', '夏', '蔡', '田', '樊', '胡', '陈', '霍', '潘', '万', '李', '洪', '莫', '王']const loanMoneyList = [10, 12, 8, 5, 8, 7, 6, 23, 18, 10, 2, 1]const loanSexList = ['先生', '先生', '先生', '女士', '女士']function getText() {const randomSex = loanSexList[parseInt(Math.random() * loanSexList.length)]const randomName = loanUserList[parseInt(Math.random() * loanUserList.length)]const randomMoney = loanMoneyList[parseInt(Math.random() * loanMoneyList.length)]return randomName + randomSex + '获得' + randomMoney + '元红包'}let messageList = []for (let i = 0; i < 3; i++) {messageList.push(getText())}let box = document.getElementById('scroll-message')box.style.height = '30px'box.style.overflow = 'hidden'function createElement(text) {let Text = document.createElement('div')Text.style.height = '30px'Text.style.transition = 'margin-top 1s'Text.innerText = textbox.appendChild(Text)}messageList.map(text => {createElement(text)})this.timer = setInterval(() => {createElement(getText())box.childNodes[1].style.marginTop = '-30px'box.removeChild(box.childNodes[0])}, 3000)}componentWillUnMount() {clearInterval(this.timer)}render() {return (<div className="match"><div id="scroll-message"/></div>)}}export default ScrollMessagePage

经过今天的测试发现,在第一次加载计时器的时候滚动条会将滚动数据第二条数据快速跳过,造成不好的用户体验,另外频繁的操作DOM也会造成性能损耗,于是使用了文档碎片对滚动条进行优化

        let box = document.getElementById('scroll-message')let fragement = document.createDocumentFragment('div')let message = document.createElement('div')message.style.height = '30px'message.style.overflow = 'hidden'fragement.appendChild(message)function createElement(text, style, ele = message) {let Text = document.createElement('div')Text.style.height = '30px'Text.style.lineHeight = '30px'Text.style.transition = 'margin-top 1s'style && Object.keys(style).map(key => Text.style[key] = style[key])Text.innerText = textele.appendChild(Text)}let messageList = []for (let i = 0; i < 2; i++) {messageList.push(getText())}messageList.map((text, index) => createElement(text, index===0?{marginTop:'-30px'}:null))this.timer = setInterval(() => {createElement(getText())message.childNodes[1].style.marginTop = '-30px'message.removeChild(message.childNodes[0])}, 3000)box.appendChild(fragement)

【如何修复数据跳过BUG】此次更新修复了滚动条在第一次计时器运行时跳过第二条数据的问题,发生问题的原因是因为初始化公告栏数据的时候并未添加marginTop,在计时器执行之后第二条数据原本会替换第一条数据的位置,然而因为第一条数据被删除所以跑到第一条数据位置上面,我通过直接将第二条数据初始化到第一条数据的位置解决了该问题。

【处理性能损耗】使用计时器频繁对dom进行操作,会使整个页面频繁进行DOM渲染,解决性能损耗的问题我参考 createDocumentFragment();方法实现,将该公告栏DOM插入到该方法创建的文档碎片,将子元素插入到文档片段时不会引起页面回流。

小结

初次向大家分享我的想法,有更好的实现方法可以评论留言,关于性能损耗的问题我认识有些不足,请大家多多指教。

JS 简单实现公告消息自动逐条切换相关推荐

  1. pc端html轮播带滑块,swiper.js简单快速实现轮播滑动(兼容PC端、移动端)

    swiper是一款免费以及轻量级轮播滑动的js框架,适用于PC端跟移动端,官方地址:(https://www.swiper.com.cn/) 效果演示: PC端 移动端(在浏览器将设备切换为手机,这里 ...

  2. js 简单的滑动教程(四)

    作者:Lellansin 转载请标明出处,谢谢 在大概的了解滑动的基本原理和怎么去实现之后,现在我们将更深入的去讨论js的滑动. 相信细心的朋友应该已经发现了,在本教程前几篇中的代码,还存在着bug, ...

  3. IME2_AHK输入法自动/智能切换 v1.05

    IME2_AHK输入法自动/智能切换 v1.05 分享一个自用的AHK输入法切换方案,目前用着还挺不错的,很可能会继续更新 1 /* 2 # 特别注意: 3 1, "监控消息回调" ...

  4. EChart.js 简单入门

    EChart.js 简单入门 最近有一个统计的项目要做,在前端的数据需要用图表的形式展示.网上搜索了一下,发现有几种统计图库. MSChart   这个是Visual Studio里的自带控件,使用比 ...

  5. C++中消息自动派发之一 About JSON

    1. 闲序 游戏服务器之间通信大多采用异步消息通信.而消息打包常用格式有:google protobuff,facebook thrift, 千千万万种自定义二进制格式,和JSON.前三种都是二进制格 ...

  6. 用 JS 点击左右按钮 使图片切换 - 最精简版-ljx2380000-ChinaUnix博客

    用 JS 点击左右按钮 使图片切换 - 最精简版-ljx2380000-ChinaUnix博客 代码部分: 点击(此处)折叠或打开 <!DOCTYPE html PUBLIC "-// ...

  7. Mac 自动代理切换

    Mac 自动代理切换 背景: 工作有时需要用goole搜索,所以会配置一下公司提供的HTTP和HTTPS代理,但是下班之后回到家,只有公司内网才能访问代理,所以还需要把代理关掉.每次都要点呀点,有点麻 ...

  8. Js简单实现音乐播放器

    Js简单实现音乐播放器 HTML部分 CSS部分 js代码部分 这段时间正好是寒假,闲来无事把大二学的web再温习了一遍,在学习到Js时,想找一些小玩意来练练手,于是我就用原生Js做了一个简单音乐播放 ...

  9. web直播+聊天室功能(阿里云播放器和即时通信IM聊天、消息自动滚动)

    左边为视频直播,右边为聊天 解决问题: 1.直播的时候,播放器可以点击,并且可以暂停,解决办法是在播放器上加一次遮罩 2.tim聊天功能要注册阿里云的账号,下载自己的sdk和js插件 3.直播功能下载 ...

最新文章

  1. JVM内存调优原则及几种JVM内存调优方法
  2. 《动手学深度学习》中文第二版预览版发布
  3. python爬取下拉列表数据_Python怎么爬取下拉式的网页?
  4. 谈谈你对摩尔定律的理解,摩尔定律当前还是继续有效的吗?
  5. 述信科技创始人 CEO 彭圣才:传统行业如何实现数字化转型(附 PPT 下载)
  6. 树形DP求树的最小支配集,最小点覆盖,最大独立集
  7. Spring自学日志07(整合Mybatis)
  8. 听说有62%的人口嫌体直想卖隐私?
  9. 基于Android中实现定时器的3种解决方法
  10. python工资高还是java-python为什么叫爬虫 python工资高还是java的高
  11. jni开发-java调用c函数,c调用java函数实现
  12. eclipse中Java EE 与Java 区别
  13. 3D VR卡镜的使用方法
  14. UI设计师需要熟记的45个快捷键Windows、Mac
  15. WinForm开发(36)——WinForm开发微软官方最全综合详解指南(包括bug出现的可能原因分析及解决方法)
  16. 安全狗又拿下一场重保胜战 第22届投洽会顺利谢幕
  17. 会员积分消费系统 php,会员消费管理系统充值营销系统会员积分消费系统.net源码...
  18. linux 内存碎片信息查看
  19. 如何将新手引导模块化?答案在此
  20. 第十一章 初窥天机之数据类型为我所用

热门文章

  1. vins 解读_代码解读 | VINS 视觉前端
  2. python学习笔记(六)——函数的作用域和装饰器
  3. node.js 没有转发_如何用Nodejs编写一个定时消息提醒应用?
  4. 核磁共振波谱分析_实验室各种仪器原理动图剖析,这么多分析仪器原理,1次搞清楚了...
  5. mysql如果索引为uid间隙锁_mysql 开发进阶篇系列 10 锁问题 (使用“索引或间隙锁”的锁冲突)...
  6. 快速复制快捷键_复制粘贴额效率之王Ctrl+D都不掌握,那就真的Out了
  7. fluentd mysql_使用Fluentd + MongoDB构建实时日志收集系统
  8. 电话号码中间四位用****代替
  9. 加载pdf_Java 插入附件到PDF文档
  10. php json java_php 解析java传过来的json数据