摘要:實(shí)現(xiàn)公告消息滾動(dòng)因?yàn)橐m配前端,所以在想最簡(jiǎn)實(shí)現(xiàn)一個(gè)靜態(tài)數(shù)據(jù)的抽獎(jiǎng)滾動(dòng)欄,研究時(shí)直接用了當(dāng)前運(yùn)行的框架實(shí)現(xiàn),于是昨天先打了個(gè)草稿。經(jīng)測(cè)試在上顯示正常。
JS實(shí)現(xiàn)公告消息滾動(dòng)
因?yàn)橐m配iOS前端,所以在想最簡(jiǎn)實(shí)現(xiàn)一個(gè)靜態(tài)數(shù)據(jù)的抽獎(jiǎng)滾動(dòng)欄,研究時(shí)直接用了當(dāng)前運(yùn)行的ReactJS框架實(shí)現(xiàn),于是昨天先打了個(gè)草稿。經(jīng)測(cè)試在iPhone6S Plus A1699 Version 12.1.2上顯示正常。
import React from "react" class ScrollMessagePage { componentDidMount() { //消息關(guān)鍵字?jǐn)?shù)據(jù) const loanUserList = ["趙", "錢(qián)", "孫", "宋", "王", "徐", "丘", "駱", "高", "夏", "蔡", "田", "樊", "胡", "陳", "霍", "潘", "萬(wàn)", "李", "洪", "莫", "王"] 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 = text box.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 () } } export default ScrollMessagePage
經(jīng)過(guò)今天的測(cè)試發(fā)現(xiàn),在第一次加載計(jì)時(shí)器的時(shí)候滾動(dòng)條會(huì)將滾動(dòng)數(shù)據(jù)第二條數(shù)據(jù)快速跳過(guò),造成不好的用戶(hù)體驗(yàn),另外頻繁的操作DOM也會(huì)造成性能損耗,于是使用了文檔碎片對(duì)滾動(dòng)條進(jìn)行優(yōu)化
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 = text ele.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)
【如何修復(fù)數(shù)據(jù)跳過(guò)BUG】此次更新修復(fù)了滾動(dòng)條在第一次計(jì)時(shí)器運(yùn)行時(shí)跳過(guò)第二條數(shù)據(jù)的問(wèn)題,發(fā)生問(wèn)題的原因是因?yàn)槌跏蓟鏅跀?shù)據(jù)的時(shí)候并未添加marginTop,在計(jì)時(shí)器執(zhí)行之后第二條數(shù)據(jù)原本會(huì)替換第一條數(shù)據(jù)的位置,然而因?yàn)榈谝粭l數(shù)據(jù)被刪除所以跑到第一條數(shù)據(jù)位置上面,我通過(guò)直接將第二條數(shù)據(jù)初始化到第一條數(shù)據(jù)的位置解決了該問(wèn)題。
【處理性能損耗】使用計(jì)時(shí)器頻繁對(duì)dom進(jìn)行操作,會(huì)使整個(gè)頁(yè)面頻繁進(jìn)行DOM渲染,解決性能損耗的問(wèn)題我參考 createDocumentFragment();方法實(shí)現(xiàn),將該公告欄DOM插入到該方法創(chuàng)建的文檔碎片,將子元素插入到文檔片段時(shí)不會(huì)引起頁(yè)面回流。
小結(jié)
初次向大家分享我的想法,有更好的實(shí)現(xiàn)方法可以評(píng)論留言,關(guān)于性能損耗的問(wèn)題我認(rèn)識(shí)有些不足,請(qǐng)大家多多指教。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/101438.html
摘要:由命名路由與子路由構(gòu)成整體結(jié)構(gòu),我們用它構(gòu)建如下頁(yè)面。以下兩張圖說(shuō)明路由和子路由是如何工作的。繼續(xù)修改好友信息的路由部分添加好友信息為組件添加動(dòng)態(tài)路由為動(dòng)態(tài)路由添加為路徑參數(shù)添加數(shù)據(jù)下發(fā)為組件添加,并使用它。 不使用vue-router的情況 代碼官方給出下面的例子在不使用vue-router的情況下來(lái)實(shí)現(xiàn)一個(gè)路由。該示例結(jié)合了H5歷史管理API、單文件組件、JS模塊相關(guān)內(nèi)容來(lái)實(shí)現(xiàn)路由...
摘要:先初始化一下默認(rèn)樣式單行顯示,超出隱藏固定公告欄顯示區(qū)域的高度以下為了單行顯示,超出隱藏封裝函數(shù)使用方法改變列表的值來(lái)實(shí)現(xiàn)滾動(dòng)效果知識(shí)點(diǎn)回調(diào)函數(shù)函數(shù)執(zhí)行完之后,要執(zhí)行的函數(shù)。 需求 最近項(xiàng)目中需要實(shí)現(xiàn)公告欄滾動(dòng)顯示效果如下 showImg(https://segmentfault.com/img/bVZJSE?w=400&h=53); 解決方案 1、 HTML 先建一個(gè)div層作為公告...
摘要:先初始化一下默認(rèn)樣式單行顯示,超出隱藏固定公告欄顯示區(qū)域的高度以下為了單行顯示,超出隱藏封裝函數(shù)使用方法改變列表的值來(lái)實(shí)現(xiàn)滾動(dòng)效果知識(shí)點(diǎn)回調(diào)函數(shù)函數(shù)執(zhí)行完之后,要執(zhí)行的函數(shù)。 需求 最近項(xiàng)目中需要實(shí)現(xiàn)公告欄滾動(dòng)顯示效果如下 showImg(https://segmentfault.com/img/bVZJSE?w=400&h=53); 解決方案 1、 HTML 先建一個(gè)div層作為公告...
摘要:先初始化一下默認(rèn)樣式單行顯示,超出隱藏固定公告欄顯示區(qū)域的高度以下為了單行顯示,超出隱藏封裝函數(shù)使用方法改變列表的值來(lái)實(shí)現(xiàn)滾動(dòng)效果知識(shí)點(diǎn)回調(diào)函數(shù)函數(shù)執(zhí)行完之后,要執(zhí)行的函數(shù)。 需求 最近項(xiàng)目中需要實(shí)現(xiàn)公告欄滾動(dòng)顯示效果如下 showImg(https://segmentfault.com/img/bVZJSE?w=400&h=53); 解決方案 1、 HTML 先建一個(gè)div層作為公告...
閱讀 1768·2021-11-11 16:55
閱讀 2571·2021-08-27 13:11
閱讀 3631·2019-08-30 15:53
閱讀 2305·2019-08-30 15:44
閱讀 1394·2019-08-30 11:20
閱讀 1042·2019-08-30 10:55
閱讀 949·2019-08-29 18:40
閱讀 3037·2019-08-29 16:13