integrated_traffic_uniapp/components/mao-scroll/mao-scroll.vue

94 lines
2.1 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<view>
<view class="maoScroll-main" :style="'height:'+(lineHeight*showLine)+'rpx;'">
<view :style="'margin-top:-'+marginTop+'rpx;'">
<view v-for="(item,index) in showdata" :key="'maoScroll'+index" :style="'height:'+lineHeight+'rpx;'">
<slot :line="item" />
</view>
</view>
</view>
</view>
</template>
<script>
export default {
name: 'maoScroll',
data() {
return {
showdata: [],
marginTop: 0,
showLine: 0,
}
},
props:{
data: {
type: Array,
default: []
},
showNum: {
type: Number,
default: 3,
},
lineHeight: {
type: Number,
default: 60,
},
animationScroll: {
type: Number,
default: 500,
},
animation: {
type: Number,
default: 2000,
}
},
watch: {
data(list) {
this.init();
},
},
methods: {
init: function(){
if(this.data != null && this.data != undefined && this.data != 'undefined' && this.data != ''
&& this.data.length > 0){
this.showLine = this.showNum < this.data.length ? this.showNum : this.data.length;
for(let i = 0; i < this.data.length; i++){
this.showdata.push(this.data[i]);
}
for(let i = 0; i < this.showLine; i++){
this.showdata.push(this.data[i]);
}
setInterval(this.animationFunc, this.animation);
}
},
animationFunc: function(){
if(this.marginTop >= this.data.length*this.lineHeight){
this.marginTop = 0;
}
let stepTime = this.animationScroll/this.lineHeight;
var step = 0;
let self = this;
var rollContinue = true // 由于下面的计时器不能及时终止会导致有时候滚动像素过多即margintop多加了几个像素所以用这个控制一下。像滚动距离够了之后不再增加margintop值
var index = setInterval(function(){
if(rollContinue){
self.marginTop = self.marginTop + 1;
}
step++;
if (step >= self.lineHeight) {
rollContinue = false;
clearInterval(index);
}
}, stepTime);
}
},
mounted() {
this.init();
}
}
</script>
<style>
.maoScroll-main{width: 100%;overflow: hidden;}
</style>