<template>
<div class="slider-apply" ref="slider"> <!-- 显示层 -->
<div class="slider-group" ref="group"> <!-- 所有图片包裹层 -->
<slot></slot> <!-- 插槽显示图片内容 -->
</div>
<div class="dots"> <!-- 提示圆点 -->
<div class="dot" v-for="(item, index) in dots" :key="index" :class="currentIndex===index?'active':''"></div>
</div>
</div>
</template>
<script type='text/ecmascript-6'>
import BScroll from 'better-scroll'
export default {
data () {
return {
dots: [],
currentIndex: 0
}
},
props: {
isLoop: {
type: Boolean,
default: true
},
isAutoPlay: {
type: Boolean,
default: true
},
interval: {
type: Number,
default: 2000
}
},
mounted () {
setTimeout(() => {
this.setSliderWidth()
this.initDots()
this.initSlider()
if (this.isAutoPlay) {
this.autoPlay()
}
}, 20)
},
methods: {
setSliderWidth () {
const clientWidth = this.$refs.slider.clientWidth
let sliderWidth = 0
this.children = this.$refs.group.children
for (let i = 0; i < this.children.length; i++) {
this.children[i].style.width = clientWidth + 'px'
sliderWidth += clientWidth
}
if (this.isLoop) {
sliderWidth += clientWidth * 2
}
this.$refs.group.style.width = sliderWidth + 'px'
},
initDots () {
this.dots = new Array(this.children.length)
},
initSlider () {
this.slider = new BScroll(this.$refs.slider, {
scrollX: true,
scrollY: false,
snap: {
loop: this.isLoop,
threshold: 0.3,
speed: 400
}
})
this.slider.on('scrollEnd', () => {
const pageIndex = this.slider.getCurrentPage().pageX
this.currentIndex = pageIndex
if (this.isAutoPlay) {
clearTimeout(this.timer)
this.autoPlay()
}
})
},
autoPlay () {
this.timer = setTimeout(() => {
this.slider.next(400)
}, this.interval)
}
},
destroyed () {
clearTimeout(this.timer)
}
}
</script>
<style lang="stylus" scoped>
.slider-apply
position relative
height 200px
width 100%
overflow hidden
border-radius 5px
.dots
position absolute
bottom 10px
left 50%
transform translate(-50%, 0)
display flex
.dot
margin 0 10px
height 7px
width 7px
background #fff
border-radius 50%
.active
width 15px
border-radius 50% 5px
</style>