vue實(shí)現(xiàn)列表無縫循環(huán)滾動(dòng)
本文實(shí)例為大家分享了vue實(shí)現(xiàn)列表無縫循環(huán)滾動(dòng)的具體代碼,供大家參考,具體內(nèi)容如下
功能介紹:
在PC端網(wǎng)頁,包括大數(shù)據(jù)、官網(wǎng)、后臺管理平臺開發(fā)中,可能會(huì)用到這種列表循環(huán)滾動(dòng)的展示。
大致需求:
1、列表可以使用數(shù)組循環(huán)遍歷;
2、每隔幾秒中列表數(shù)據(jù)向上滾動(dòng)一定距離,展示下一條數(shù)據(jù);
3、滾動(dòng)到最后一條數(shù)據(jù)時(shí)重新顯示第一條開始的數(shù)據(jù)(類似走馬燈、banner圖的循環(huán)效果);
整體思路:
1、使用兩個(gè)定時(shí)器嵌套實(shí)現(xiàn);
2、需要兩個(gè)相同容器存放同樣內(nèi)容,實(shí)現(xiàn)無縫銜接效果;
效果展示:

完整代碼:
<!DOCTYPE html>
<html>
?? ?<head>
?? ??? ?<meta charset="utf-8">
?? ??? ?<title></title>
?? ??? ?<script src="https://unpkg.com/vue@2.6.14/dist/vue.min.js"></script>
?? ??? ?<style>
?? ??? ??? ?/* 滾動(dòng)表格最外層 */
?? ??? ??? ?.tableoOut {
?? ??? ??? ??? ?margin: 100px auto;
?? ??? ??? ? ? ?width: 500px;
?? ??? ??? ? ? ?height: 400px;
?? ??? ??? ??? ?background: pink;
?? ??? ??? ? ? ?overflow: hidden;
?? ??? ??? ? ? ?display: flex;
?? ??? ??? ? ? ?align-items: center;
?? ??? ??? ? ? ?justify-content: center;
?? ??? ??? ? ? ?flex-direction: column;
?? ??? ??? ?}
?? ??? ??? ?.tableBox {
?? ??? ??? ? ? ?width: 100%;
?? ??? ??? ??? ?background: #000;
?? ??? ??? ? ? ?overflow: hidden
?? ??? ??? ?}
?? ??? ??? ?.tableTit {
?? ??? ??? ??? ?background: #000;
?? ??? ??? ? ? ?width: 100%;
?? ??? ??? ? ? ?height: 40px;
?? ??? ??? ? ? ?color: #858A84;
?? ??? ??? ? ? ?text-align: center;
?? ??? ??? ? ? ?display: flex;
?? ??? ??? ? ? ?justify-content: center;
?? ??? ??? ? ? ?align-items: center;
?? ??? ??? ?}
?? ??? ??? ?.tableInner {
?? ??? ??? ? ? ?height: auto;
?? ??? ??? ?}
?? ??? ??? ?.box {
?? ??? ??? ? ? ?width: 100%;
?? ??? ??? ? ? ?height: 50px;
?? ??? ??? ? ? ?display: flex;
?? ??? ??? ? ? ?justify-content: center;
?? ??? ??? ? ? ?align-items: center;
?? ??? ??? ? ? ?color: #fff;
?? ??? ??? ?}
?? ??? ??? ?.box .time {
?? ??? ??? ? ? ?color: #858A84;
?? ??? ??? ?}
?? ??? ??? ?.tableoOut .addr, .tableoOut .time, .tableoOut .name {
?? ??? ??? ? ? ?box-sizing: border-box;
?? ??? ??? ? ? ?padding: 0 5px;text-align: center;
?? ??? ??? ? ? ?overflow: hidden;
?? ??? ??? ??? ?white-space: nowrap;
?? ??? ??? ??? ?text-overflow: ellipsis;
?? ??? ??? ?}
?? ??? ??? ?.tableoOut .addr {
?? ??? ??? ? ? ?width: calc(100% - 200px);
?? ??? ??? ? ? ?flex-shrink: 0;
?? ??? ??? ?}
?? ??? ??? ?.tableoOut .name, .tableoOut .time {
?? ??? ??? ? ? ?width: 100px;
?? ??? ??? ? ? ?flex-shrink: 0;
?? ??? ??? ?}
?? ??? ?</style>
?? ?</head>
?? ?<body>
?? ??? ?<div id="app">
?? ??? ??? ?<div class="tableoOut" ref="tableoOut">
?? ??? ??? ??? ?<div class="tableTit">
?? ??? ??? ??? ??? ?<div class="name">姓名</div>
?? ??? ??? ??? ??? ?<div class="addr">地址</div>
?? ??? ??? ??? ??? ?<div class="time">入駐時(shí)間</div>
?? ??? ??? ??? ?</div>
?? ??? ??? ??? ?<div class="tableBox" ref="tableBox"
?? ??? ??? ??? ??? ?:style="{height: tableHei}">
?? ??? ??? ??? ??? ?<div class="tableInner" ref="tableInner">
?? ??? ??? ??? ??? ??? ?<div class="box" v-for="item in 7" :key="item">
?? ??? ??? ??? ??? ??? ??? ?<div class="name">{{item}}</div>
?? ??? ??? ??? ??? ??? ??? ?<div class="addr">山東省山東省山東省山東省山東省山東省山東省山東省
?? ??? ??? ??? ??? ??? ??? ?山東省山東省山東省山東省山東省</div>
?? ??? ??? ??? ??? ??? ??? ?<div class="time">2022-05-26</div>
?? ??? ??? ??? ??? ??? ?</div>
?? ??? ??? ??? ??? ?</div>
?? ??? ??? ??? ??? ?<div class="tableInner" v-if="size < 7">
?? ??? ??? ??? ??? ??? ?<div class="box" v-for="item in 7" :key="item">
?? ??? ??? ??? ??? ??? ??? ?<div class="name">{{item}}</div>
?? ??? ??? ??? ??? ??? ??? ?<div class="addr">山東省山東省山東省山東省山東省山東省山東省山東省
?? ??? ??? ??? ??? ??? ??? ?山東省山東省山東省山東省山東省</div>
?? ??? ??? ??? ??? ??? ??? ?<div class="time">2022-05-26</div>
?? ??? ??? ??? ??? ??? ?</div>
?? ??? ??? ??? ??? ?</div>
?? ??? ??? ??? ?</div>
?? ??? ??? ?</div>
?? ??? ?</div>
?? ?</body>
?? ?<script>
?? ??? ?new Vue({
?? ??? ??? ?el: '#app',
?? ??? ??? ?data: {
?? ??? ??? ??? ?tableHei: 'auto',
?? ??? ??? ??? ?timer: null,
?? ??? ??? ??? ?size: 0
?? ??? ??? ?},
?? ??? ??? ?mounted() {
?? ??? ??? ??? ?this.getTable();
?? ??? ??? ?},
?? ??? ??? ?methods: {
?? ??? ??? ??? ?getTable() {
?? ??? ??? ??? ??? ?const outHei = this.$refs.tableoOut.clientHeight - 60;
?? ??? ??? ??? ??? ?this.size = Math.floor(outHei / 50);
?? ??? ??? ??? ??? ?this.tableHei = this.size * 50 + 'px';
?? ??? ??? ??? ??? ?this.scrolls();
?? ??? ??? ??? ?},
?? ??? ??? ??? ?stepScroll() {
?? ??? ??? ??? ??? ?const step = 50;
?? ??? ??? ??? ??? ?let num = 0;
?? ??? ??? ??? ??? ?const tableBox = this.$refs.tableBox;
?? ??? ??? ??? ??? ?const stepTime = setInterval(function () {
?? ??? ??? ??? ??? ??? ?num += 2;
?? ??? ??? ??? ??? ??? ?if (num > step) {
?? ??? ??? ??? ??? ??? ??? ?num = 0;
?? ??? ??? ??? ??? ??? ??? ?clearInterval(stepTime);
?? ??? ??? ??? ??? ??? ?} else {
?? ??? ??? ??? ??? ??? ??? ?tableBox.scrollTop += 2;
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?}, 20);
?? ??? ??? ??? ?},
?? ??? ??? ??? ?scrolls() {
?? ??? ??? ??? ??? ?const that = this;
?? ??? ??? ??? ??? ?const tableBox = this.$refs.tableBox;
?? ??? ??? ??? ??? ?const tableInner = this.$refs.tableInner;
?? ??? ??? ??? ??? ?clearInterval(this.timer);
?? ??? ??? ??? ??? ?this.timer = setInterval(function () {
?? ??? ??? ??? ??? ??? ?if(tableBox.scrollTop === tableInner.scrollHeight) {
?? ??? ??? ??? ??? ??? ??? ?tableBox.scrollTop = 0;
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ?that.stepScroll();
?? ??? ??? ??? ??? ?}, 2000);
?? ??? ??? ??? ?},
?? ??? ??? ?}
?? ??? ?})
?? ?</script>
</html>setInterval踩坑:
發(fā)現(xiàn)這種方法實(shí)現(xiàn)的定時(shí)輪播,有一陣沒訪問頁面,會(huì)出現(xiàn)卡停的情況,采用下面的解決方法:
<script>
?? ?new Vue({
?? ??? ?el: '#app',
?? ??? ?data: {
?? ??? ??? ?tableHei: 'auto',
?? ??? ??? ?timer: null,
?? ??? ??? ?size: 0,
?? ??? ??? ?stopSign: true, // 判斷定時(shí)器是否停止標(biāo)識
?? ??? ??? ?stepTime: null, // 改為全局定時(shí)器
?? ??? ?},
?? ??? ?mounted() {
?? ??? ??? ?const that = this;
?? ??? ??? ?// 增加瀏覽器激活狀態(tài)判斷。非激活狀態(tài)為onblur
?? ??? ??? ?window.onfocus = function(e) {
?? ??? ??? ??? ?const tableBox = that.$refs.tableBox;
?? ??? ??? ??? ?const sT = tableBox.scrollTop;
?? ??? ??? ??? ?console.log("激活狀態(tài)!")
?? ??? ??? ??? ?if (!that.stopSign) {
?? ??? ??? ??? ??? ?tableBox.scrollTop = Math.round(sT / 50) * 50;
?? ??? ??? ??? ??? ?clearInterval(that.stepTime);
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?this.getTable();
?? ??? ?},
?? ??? ?methods: {
?? ??? ??? ?getTable() {
?? ??? ??? ??? ?const outHei = this.$refs.tableoOut.clientHeight - 60;
?? ??? ??? ??? ?this.size = Math.floor(outHei / 50);
?? ??? ??? ??? ?this.tableHei = this.size * 50 + 'px';
?? ??? ??? ??? ?this.scrolls();
?? ??? ??? ?},
?? ??? ??? ?stepScroll() {
?? ??? ??? ??? ?const that = this;
?? ??? ??? ??? ?const step = 50;
?? ??? ??? ??? ?let num = 0;
?? ??? ??? ??? ?const tableBox = this.$refs.tableBox;
?? ??? ??? ??? ?// 改為全局定時(shí)器,且在調(diào)用前先進(jìn)行清空
?? ??? ??? ??? ?clearInterval(this.stepTime);
?? ??? ??? ??? ?this.stepTime = setInterval(function () {
?? ??? ??? ??? ??? ?that.stopSign = false;
?? ??? ??? ??? ??? ?num += 2;
?? ??? ??? ??? ??? ?if (num > step) {
?? ??? ??? ??? ??? ??? ?num = 0;
?? ??? ??? ??? ??? ??? ?clearInterval(that.stepTime);
?? ??? ??? ??? ??? ??? ?that.stopSign = true;
?? ??? ??? ??? ??? ?} else {
?? ??? ??? ??? ??? ??? ?tableBox.scrollTop += 2;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}, 1000 / 60);
?? ??? ??? ?},
?? ??? ??? ?scrolls() {
?? ??? ??? ??? ?const that = this;
?? ??? ??? ??? ?const tableBox = this.$refs.tableBox;
?? ??? ??? ??? ?const tableInner = this.$refs.tableInner;
?? ??? ??? ??? ?clearInterval(this.timer);
?? ??? ??? ??? ?this.timer = setInterval(function () {
?? ??? ??? ??? ??? ?// 修改定時(shí)器結(jié)束判斷條件
?? ??? ??? ??? ??? ?if(tableBox.scrollTop >= tableInner.scrollHeight) {
?? ??? ??? ??? ??? ??? ?tableBox.scrollTop = 0;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?that.stepScroll();
?? ??? ??? ??? ?}, 2000);
?? ??? ??? ?},
?? ??? ?}
?? ?})
</script>以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue_drf實(shí)現(xiàn)短信驗(yàn)證碼
我們在做網(wǎng)站開發(fā)時(shí),登錄頁面很多情況下是可以用手機(jī)號接收短信驗(yàn)證碼,本文主要介紹了vue_drf實(shí)現(xiàn)短信驗(yàn)證碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
vue中el-date-picker type=daterange日期清空時(shí)不回顯的解決
這篇文章主要介紹了vue中el-date-picker type=daterange日期清空時(shí)不回顯的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
VUE中對object.object和object[object]的使用解讀
這篇文章主要介紹了VUE中對object.object和object[object]的使用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
使用mint-ui實(shí)現(xiàn)省市區(qū)三級聯(lián)動(dòng)效果的示例代碼
下面小編就為大家分享一篇使用mint-ui實(shí)現(xiàn)省市區(qū)三級聯(lián)動(dòng)效果的示例代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02

