vue使用better-scroll做轮播图(1.X版本 比较简单)
首先布局界面
<template> <div class="slider" ref="slider"> <div class="sliderGroup" ref="sliderGroup"> <img v-for="(item,index) of items" :src="item.icon" @click="$emit('itemClick',index)"> </div> <div class="dots"> <span class="dot" v-for="(item,index) of items" :class="{active: currentIndex === index}" :key="index"></span> </div> </div> </template>
布局的样式
.slider { position: relative; width: 100%; overflow: hidden; } .sliderGroup { overflow: hidden; } .sliderGroup img { display: inline-block; float: left; height: 100%; } .dots { position: absolute; right: 5px; bottom: 0; } .dot { display: inline-block; margin: 2px; width: 6px; height: 6px; border-radius: 3px; background-color: darkgrey; } .dot.active { background-color: #2aca76; }
js代码
import BScroll from 'better-scroll' export default { name: "RotationView", props: { //带图片的数据 只要数据含有icon字段存储的是图片地址即可 items: { type: Array, default() { return [] } }, //是否循环播放 loop: { type: Boolean, default: true }, //是否自动播放 autoPlay: { type: Boolean, default: true }, //播放间隔 interval: { type: Number, default: 3000 }, //宽高比例 ratio: { type: Number, default: 0.25 } }, data() { return { slider: null, width: 300, height: 100, currentIndex: 0, timer: null } }, computed: {}, watch: { items: { handler(newValue, oldValue){ //数据可能是网络加载的比较慢 这里监听数据变化再去初始化轮播组件 this.$nextTick(() => { this.initSlider() }) //慎用setTimeout 极大可能造成卡顿 //setTimeout(() => { //this.initSlider() //},20) } } }, mounted() { this.$nextTick(() => { this.initLayout() }) //setTimeout(() => { //this.initLayout() //}, 20) }, methods: { initLayout() { this.width = this.$refs.slider.clientWidth this.height = this.width * this.ratio this.$refs.slider.style.height = this.height this.$refs.sliderGroup.style.height = this.height this.initSlider() }, initSlider() { if(this.items.length <= 0) return let contentWidth = this.width * this.items.length if (this.loop) contentWidth += this.width * 2 let childItems = this.$refs.sliderGroup.children for (let i = 0; i < childItems.length; i++) { let child = childItems[i] child.style.width = this.width + 'px' child.style.height = this.height + 'px' } this.$refs.sliderGroup.style.width = contentWidth + 'px' this.slider = new BScroll(this.$refs.slider, { scrollX: true, //当设置为 true 的时候,可以开启横向滚动 scrollY: false, //当 probeType 为 1 的时候,会非实时(屏幕滑动超过一定时间后)派发scroll 事件; //当 probeType 为 2 的时候,会在屏幕滑动的过程中实时的派发 scroll 事件; //当 probeType 为 3 的时候,不仅在屏幕滑动的过程中,而且在 momentum 滚动动画运行过程中实时派发 scroll 事件。 //如果没有设置该值,其默认值为 0,即不派发 scroll 事件。 //probeType: 1, //eventPassthrough: 'vertical',//竖向保持原生滚动 momentum: false, snap: { loop: this.loop, threshold: 0.1, speed: 400, //easing 表示滚动的缓动函数 先记录下来 不清楚有什么用 easing: { style: 'cubic-bezier(0.25, 0.46, 0.45, 0.94)', fn: function (t) { return t * (2 - t) } } } }) this.slider.on('scrollEnd', () => { this.currentIndex = this.slider.getCurrentPage().pageX clearTimeout(this.timer) if (this.autoPlay) this.play() }) if (this.autoPlay) this.play() }, play() { let playPage = this.currentIndex + 1 if (playPage === this.items.length) { playPage = 0 } this.timer = setTimeout(() => { this.slider.goToPage(playPage) }, this.interval) } }, created() { } }
注意better-scroll options配置 不需要配置click:true 如果配置了,内部控件点击事件会触发多次
没啥太大难度(轮播的实现 better-scroll基本都替我们实现好了) better-scroll 配置好snap就能手动轮播了,主要处理一些自动播放和计算图片宽高 包裹图片的sliderGroup控件的宽度 ,配置了一些props 参数,使用时可以根据需要更改
threshold 滑动可滚动到下一页的阈值
speed 滚动速率
better-scroll 主要处理页面的滑动 ,做轮播图可以使用vue-awesome-swiper
vue-awesome-swiper轮播图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
2019-07-01 iOS MJRefresh的使用 (列表上拉加载更多)