拖旺项目:聊城公交辅助决策系统
master
2022-04-27 493930a42a2ea3e13905ffd8772cdb945baa7bcf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<template>
 <div class="c-animation-roll-list" :style="{height}">
     <div class="_rool-box" ref="rollList" :style="{height}">
          <div 
              v-for="(item, index) in data" 
              :key="index" 
              class="_rool-item"
              ref="rollItem"
              :style="styleFormatter(index)"
            >
            <slot :row="item" :index="index" :select-column="moveColumn" />
        </div>
     </div>
    
 
 </div>
</template> 
 
<script>
export default {
    name: 'vueName',
    props: {
        data: Array, // 数据列表
        height: String, // 容器高度
        rollHeight: [Number, String], // 每次滚动高度
        columnHeight: { // 每行高度
            type: [Number, String],
            default: 30
        },
        minLenght: { // 每行高度
            type: [Number, String],
            default: 3
        }, // 最小滚动行数
        waitTime: [Number, String], // 滚动间隔时间
    },
    data () {
        return {
            rollIndex: 0,
            moveColumn: 0, // 需要改变第几个的top
            isLoading: true
        }
    },
    mounted() {
        if(this.isLoading) {
            this.startScroll();
        }
    },
    activated() {
        if(!this.isLoading) {
            this.startScroll();
        }
        
    },
    methods: {
        styleFormatter (index) {
            return {
                top: this.columnHeight*index + 'px',
            }
        },
        startScroll() {
            this.$nextTick(() => {
                const element = this.$refs.rollItem;
                const len = this.data.length;
                let totalHeight = len*this.columnHeight;
                let rollHeight = this.rollHeight ? this.rollHeight : this.columnHeight;
                if (!element || len < Number(this.minLenght)) return;
                this.scrollTimer = setInterval(() => {
                    for(let i = 0; i<element.length; i++) {
                        let elTop = element[i].style.top.split('px')[0];
                        element[i].style.top = +elTop - rollHeight +'px';
                        element[i].style.transition = '1s ease';
                    }
                    let moveHeight = this.rollIndex*rollHeight; // 移动高度
                    let moveNum = Math.floor(moveHeight/this.columnHeight) % len; // 移动了几个单元列表
                    // 记录上一次的循环并更改top值
                    if(this.rollIndex && (moveNum > this.moveColumn || (moveNum == 0 && this.moveColumn == len - 1))) {
                        element[this.moveColumn].style.transition = 'none';
                        element[this.moveColumn].style.top = totalHeight - 2*this.columnHeight + 'px';
                        this.moveColumn++;
                        if(this.moveColumn > len - 1) {
                            this.moveColumn = 0 
                        }
                    }
                    this.rollIndex++
                },  this.waitTime || 1000);
            });
        }
    },
    deactivated() {
        this.isLoading = false;
        clearInterval(this.scrollTimer);
    },
    beforeDestroy() {
        clearInterval(this.scrollTimer);
    }
}
</script>
 
<style scoped lang="less">
.c-animation-roll-list {
    color: #fff;
    width: 100%;
    overflow: hidden;
    position: relative;
    ._rool-box {
        position: relative;
        width: 100%;
        ._rool-item {
            position: absolute;
            width: 100%;
            transition: none;
            // transition: 1s ease;
 
        }
    }
}
 
 
</style>