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 是一款免费以及 ...
随机推荐
- AWVS14破解docker一键安装
先上个图 2021最新版 1.使用docker查看是否有awvs: [root@hadoop-01 awvs13-linux]# docker search awvs NAME ...
- [prometheus]配置alertmanager和钉钉告警
目录 prometheus发起告警的逻辑 节点 配置alertmanager 配置钉钉告警插件 配置supervisor守护进程 关联prometheus和alertmanager prometheu ...
- WPF实现类似ChatGPT的逐字打印效果
背景 前一段时间ChatGPT类的应用十分火爆,这类应用在回答用户的问题时逐字打印输出,像极了真人打字回复消息.出于对这个效果的兴趣,决定用WPF模拟这个效果. 真实的ChatGPT逐字输出效果涉及其 ...
- 如何在工作中利用Prompt高效使用ChatGPT?
导读 AI 不是来替代你的,是来帮助你更好工作.用better prompt使用chatgpt,替换搜索引擎,让你了解如何在工作中利用Prompt高效使用ChatGPT. 01背景 现在 GPT 已经 ...
- 论文解读(MCADA)《Multicomponent Adversarial Domain Adaptation: A General Framework》
Note:[ wechat:Y466551 | 可加勿骚扰,付费咨询 ] 论文信息 论文标题:Multicomponent Adversarial Domain Adaptation: A Gener ...
- WPF 入门笔记 - 08 - 动画
感谢大家对上篇博文的支持 回到正题,今天和大家分享下学习动画过程中的内容.动画对我来讲还是蛮新鲜的,大家知道在接触WPF之前我只用过Winform,而Winform中并没有动画的概念,当想要实现某些& ...
- linux cat查看文件使用grep实现多条件多场景过滤
转载请注明出处: 在实际应用过程中,我们查看日志文件时,经常会根据一定自定义的词语过滤,查看所有相关的数据行.最近遇到用cat查看文件,需要根据多关键词进行不同的场景过滤,在这里进行一个简单的总结: ...
- 「Tricks」整体DP
不太了解这个东西的具体定义是什么,总之应该是一个用数据结构维护 DP 状态的某几个维度的 trick 吧. 事实上你可以把这篇 post 理解为三个题的解集. 先直接来看 noi2020 - Dest ...
- 5.go语言函数提纲
1 本篇前瞻 前端时间的繁忙,未曾更新go语言系列.由于函数非常重要,为此将本篇往前提一提,另外补充一些有关go新版本前面遗漏的部分. 需要恭喜你的事情是本篇学完,go语言中基础部分已经学完一半,这意 ...
- 教学法学期末考试MOOC01
期末考试 返回 期末考试试卷为客观题,总分为100分,占课程成绩的40%.其中包含16道单选题,2道多选题.共18道题.单选题每道5分,多选题每道10分,限时90分钟完成. 倒计时: 01:13:4 ...