swiper轮播图出现疯狂抖动(小程序)
swiper轮播图息屏一段时间或快速滑动切换时出现疯狂抖动
以前做小程序项目的时候,没专门测试人员,都是开发者自测,可能我的手机性能比较不错(哈哈)或时机不对,总之没发掘到这个bug;近期做项目,测试了不同的手机,发现在一些手机上会出现这个bug,尤其是对于性能差的一些手机,出现的概率尤其的大。由于本次项目是基于uni-app的,直接就用uni-app进行操作说明;
说明:uni-app编写小程序:采用的是微信小程序的API,Vue的语法,所以,他们很相似,只是在写法上有一点稍微的区别,小程序的那套东西也是适用于uni-app的。
在微信小程序的官方文档中,有这样个提示, 如果在 bindchange 的事件回调函数中使用 setData 改变 current 值,则有可能导致 setData 被不停地调用。
最终产生的后果是如果快速滑动或者息屏一段时间打开后,就出现轮播图的疯狂抖动。
一、解决方法是:
在动画播放结束后(@animationfinish)改变current的值,而不是一滑动(@change)就改变current的值。即用@animationfinish代替 @change。
二、@change与@animationfinish对比说明
1、相同点:都会改变current的值,current代表当前所在滑块的index
2、不同点:改变current的时机不同,@change滑动时立即改变,@animationfinish动画结束后改变!
三、说明:
如果想要自定义面板指示点,不建议与swiper共用一个索引值,最好将swiper与指示点的索引区分开,即用不同的变量,然后两者同步变化就可以了!
下面直接来展示一个自定义指示面板,又可以解决抖动问题的案例!
1、逻辑梳理
1>先解决抖动问题,用@animationfinish改变当前滑块的值;
<template>
<view class="swipers-wrap">
<swiper @animationfinish="swiperChange" :current="currentSwiper" circular="true" class="swipers-view"
:autoplay="autoplay" @change="dotChange">
<block v-for="(item,index) in swiperList" :key="index">
<swiper-item>
<view class="swipers-best-hot-video">
美景展示~
</view>
<view class="swipers-image-view">
<image :src="item.imgUrl" mode="aspectFill" class="swipers-image"></image>
<view class="swipers-title">
{{item.title}}
</view>
</view>
</swiper-item>
</block>
</swiper> <!--重置指示面板(小圆点)的样式 -->
<view class="swipers-dots">
<block v-for="(item,index) in swiperList" :key="index">
<view class="dot" :class="{active: currentDot == index}"></view>
</block>
</view>
</view>
</template>
2>改变指示面板的索引,用@change;
<template>
<view class="swipers-wrap">
<swiper @animationfinish="swiperChange" :current="currentSwiper" circular="true" class="swipers-view"
:autoplay="autoplay" @change="dotChange">
<block v-for="(item,index) in swiperList" :key="index">
<swiper-item>
<view class="swipers-best-hot-video">
美景展示~
</view>
<view class="swipers-image-view">
<image :src="item.imgUrl" mode="aspectFill" class="swipers-image"></image>
<view class="swipers-title">
{{item.title}}
</view>
</view>
</swiper-item>
</block>
</swiper> <!--重置指示面板(小圆点)的样式 -->
<view class="swipers-dots">
<block v-for="(item,index) in swiperList" :key="index">
<view class="dot" :class="{active: currentDot == index}"></view>
</block>
</view>
</view>
</template>
3>同步:对两者赋值e.detail.current;
dotChange: function(e) {
this.currentDot = e.detail.current
},
swiperChange: function(e) {
this.currentSwiper = e.detail.current
},
2、完整代码展示
<template>
<view class="swipers-wrap">
<swiper @animationfinish="swiperChange" :current="currentSwiper" circular="true" class="swipers-view"
:autoplay="autoplay" @change="dotChange">
<block v-for="(item,index) in swiperList" :key="index">
<swiper-item>
<view class="swipers-best-hot-video">
美景展示~
</view>
<view class="swipers-image-view">
<image :src="item.imgUrl" mode="aspectFill" class="swipers-image"></image>
<view class="swipers-title">
{{item.title}}
</view>
</view>
</swiper-item>
</block>
</swiper> <!--重置指示面板(小圆点)的样式 -->
<view class="swipers-dots">
<block v-for="(item,index) in swiperList" :key="index">
<view class="dot" :class="{active: currentDot == index}"></view>
</block>
</view>
</view>
</template> <script>
export default {
data() {
return {
currentDot: 0, //指示面板对应的索引
currentSwiper: 0, //用来记录当前swiper对应的索引
autoplay: true,
swiperList:[
{
'imgUrl':'../../static/swiper.jpg',
'title':'白云朵朵!'
},
{
'imgUrl':'../../static/list.jpg',
'title':'蓝天绿树!'
},
{
'imgUrl':'../../static/user.jpg',
'title':'boy!'
}
]
}
}, methods: {
dotChange: function(e) {
this.currentDot = e.detail.current
},
swiperChange: function(e) {
this.currentSwiper = e.detail.current
},
}
}
</script> <style>
.swipers-wrap {
height: auto;
position: relative;
background-color: blue;
padding: 0 15upx;
padding-bottom: 54upx; } .swipers-view {
height: 420upx;
} .swipers-best-hot-video {
height: 90upx;
line-height: 90upx;
color: #f8f3bf;
font-size: 36upx;
text-align: center;
} .swipers-image-view {
height: 100%;
position: relative;
z-index: 1;
} .swipers-image {
width: 100%;
height: 100%;
} .swipers-image-view .swipers-title {
position: absolute;
z-index: 99;
left: 25upx;
bottom: 105upx;
font-size: 24upx;
font-weight: bold; color: #fff;
font-size: 36upx;
} /*用来包裹所有的小圆点 */
.swipers-dots {
width: 100%;
height: 50upx;
display: flex;
flex-direction: row;
position: absolute;
left: 0;
bottom: 0upx;
/* border:1upx solid red; */
display: flex;
justify-content: center;
align-items: center;
/* border:1rpx solid green; */
} /*未选中时的小圆点样式 */
.dot {
width: 6px;
height: 2upx;
width: 55upx;
background-color: #999;
margin: 0 10upx;
/* border:1upx solid red; */
} /*选中以后的小圆点样式 */
.dot.active {
height: 2upx;
width: 80upx;
background-color: #fff;
margin: 0 10upx;
}
</style>
swiper轮播图出现疯狂抖动(小程序)的更多相关文章
- 微信小程序_(组件)swiper轮播图
微信小程序swiper轮播图组件官方文档 传送门 Learn: swiper组件 一.swiper组件 indicator-dots:是否显示面板指示点[默认值false] autoplay:是否自动 ...
- Swiper轮播图
今天咱们来说一下.Swiper轮播图. 超级简单的: 翠花,上代码: <!DOCTYPE html> <html lang="en"> < ...
- 【Vue项目】尚品汇(三)Home模块+Floor模块+Swiper轮播图
写在前面 今天是7.23,这一篇内容主要完成了Home模块和部分Search模块的开发,主要是使用了swiper轮播图插件获取vuex仓库数据展示组件以及其他信息. 1 Search模块 1.1 Se ...
- 微信小程序之swiper轮播图中的图片自适应高度
小程序中的轮播图很简单,官方都有例子的,但是唯一的缺陷就是swiper是固定死的150px高度,这样如果传入的图片大于这个高度就会被隐藏.辣么,怎样让图片自适应不同分辨率捏. 我的思路是:获取屏幕宽度 ...
- 如何自定义微信小程序swiper轮播图面板指示点的样式
https://www.cnblogs.com/myboogle/p/6278163.html 微信小程序的swiper组件是滑块视图容器,也就是说平常我们看到的轮播图就可以用它来做,不过这个组件有很 ...
- 自定义微信小程序swiper轮播图面板指示点的样式
微信小程序的swiper组件是滑块视图容器,也就是说平常我们看到的轮播图就可以用它来做,不过这个组件有很多样式是固定的,但是,有时候我们的设计稿的面板指示点是需要个性化的,那么如何去修改swiper组 ...
- swiper轮播图--兼容IE8
//引入idangerous.swiper.min.js var mySwiper = new Swiper ('.swiper-container', { loop: true, paginatio ...
- swiper 轮播图,拖动之后继续轮播
在此贴出swiper官网地址:https://www.swiper.com.cn/api/index.html 示例如下(官网示例): <script> var mySwiper = ne ...
- swiper轮播图(逆向自动切换类似于无限循环)
swiper插件轮播图,默认的轮播循序是会从右向左,第一张,第二张,第三张,然后肉眼可见是的从第三张从左到右倒回第一张,这样就会有些视觉体验不高, ,不过还是能够用swiper本身的特性更改成无限循环 ...
- swiper轮播图插件
一.简介 ①Swiper是纯javascript打造的滑动特效插件,面向手机.平板电脑等移动终端.Swiper能实现触屏焦点图.触屏Tab切换.触屏多图切换等常用效果. ②Swiper 是一款免费以及 ...
随机推荐
- vs code 上传代码到码云
git init //初始化git仓库 git add . //添加所有文件到git暂存区 git add README.md(如果项目中没有这个文件,会在后面几个操作中报错,解决方法是通过命令合并: ...
- 《深入理解Java虚拟机》读书笔记:垃圾收集算法
由于垃圾收集算法的实现涉及大量的程序细节,而且各个平台的虚拟机操作内存的方法又各不相同,因此本节不打算过多地讨论算法的实现,只是介绍几种算法的思想及其发展过程. 垃圾收集算法概要 1. 标记-清除算法 ...
- Gin中间件开发
Gin是一个用Go语言编写的Web框架,它提供了一种简单的方式来创建HTTP路由和处理HTTP请求.中间件是Gin框架中的一个重要概念,它可以用来处理HTTP请求和响应,或者在处理请求之前和之后执行一 ...
- GitHub Deskhub使用
(适合已经知道git是啥但是还不太熟到同学看-) GitHub deskhub就是一个图形化的github管理工具啦,比起来命令行使用舒服100倍哈哈哈- 链接:https://desktop.git ...
- 52条SQL语句,性能优化!
52条SQL语句,性能优化! SQL语句性能优化 1, 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2,应尽量避免在 where 子句中对 ...
- QEMU tap数据接收流程
QEMU直接从tap/tun取数据 QEMU tap数据接收步骤: qemu从tun取数据包 qemu将数据包放入virtio硬件网卡. qemu触发中断. 虚拟机收到中断,从virtio读取数据. ...
- pythonapi接口怎么对接?
Python API接口对接是使用Python语言开发应用程序时,与外部API接口进行交互的一种方式.API(应用程序接口)是一种定义了程序或系统如何与另一个程序或系统进行交互的协议.通过使用Py ...
- 原来你是这样的JAVA[06]-反射
1.JVM为每个加载的class及interface创建了对应的Class实例来保存class及interface的所有信息: 获取一个class对应的Class实例后,就可以获取该class的所有信 ...
- 如何把网页打包成苹果原生APP并上架TF(TestFlight)
打包网页APP并上架到TestFlight流程 需要准备的材料: 1. GDB苹果网页打包软件1.6.0或者以上版本: https://www.cnblogs.com/reachteam/p/1229 ...
- 音频格式轻松转 - foobar2000
一.foobar2000简介 foobar2000 是一款免费的专业级别音频解码播放器,支持的诸多音频格式,可加载附加组件扩展更多支持. 除了解码以外,可轻松实现对音频格式的转换,支持几乎所有主流格式 ...