Swiper默认不自动轮播,需显式设置autoplay为true且配合interval(毫秒)才能生效;常见失效原因包括未动态绑定、interval单位错误、circular在少数据时出bug、高度未适配等。

swiper 组件默认不自动轮播,必须显式设置 autoplay 为 true 才会动;光开这个还不够,很多实际项目里轮播“不动”或“卡住”,问题往往出在参数组合或平台兼容性上。
autoplay 和 interval 必须成对配置才生效
只写 :autoplay="true" 是不够的——如果没设 interval,部分平台(尤其是微信小程序)会 fallback 到默认值(通常是 5000ms),但某些低版本基础库可能直接忽略 autoplay。更常见的是:你写了 :interval="3000",但忘了加冒号绑定,写成 interval="3000",这就变成字符串字面量,uni-app 不会转成数字,导致轮播失效。
- 务必使用带冒号的动态绑定:
:autoplay="true"、:interval="3000" -
interval单位是毫秒,电商类建议 3000–5000,内容类可放宽到 5000–8000 - H5 平台对
interval更敏感,小于 2000ms 可能触发浏览器节流,轮播跳帧
circular=true 在数据少于 3 条时容易出视觉 bug
启用循环模式后,swiper 会在首尾各插入一个“幻影项”来实现无缝衔接。但当 items.length 时,这些幻影项可能和真实项重叠、错位,尤其在 Android 或旧版微信客户端上,会出现白屏、闪退或指示点错位。
- 推荐做法:用计算属性动态控制
circular,例如:circular="items.length >= 3" - 如果必须支持 1–2 条数据的循环,得手动补足数据(如
[...items, ...items]),但要注意@change回调里的current值要映射回真实索引 - 小程序真机调试时,务必在 iOS 和 Android 各测一遍,circular 行为差异比 H5 明显
previous-margin / next-margin 控制卡片式轮播的露出宽度
这两个参数不是“边距”,而是“相邻滑块在当前视口内显示的像素宽度”。比如设 previous-margin="60rpx",意味着上一张图右边会露出 60rpx 宽度,常用于实现「堆叠卡片」效果。但它们只在 display-multiple-items > 1 时才起作用,且必须配合样式微调。
-
previous-margin和next-margin的值必须带单位(rpx或px),写成"60"无效 - 安卓端对
rpx解析不稳定,建议统一用px+uni.upx2px()转换 - 开启多卡片显示后,
indicator-dots指示点数量不会变,仍按真实 item 数渲染,这点容易误判当前页码
高度不固定时 swiper 内容被截断?别硬设 height
swiper 必须有明确高度才能正常布局和滑动,但设死 height: 400rpx 会导致内容溢出或留白。真正可靠的解法是:监听 @change,用 uni.createSelectorQuery() 主动查当前 swiper-item 的真实高度并更新容器 style。
- 不要在
mounted里一次性查高——此时 DOM 可能未渲染完成,查到的是 0 - 应在
@change回调中延时一小会儿再查,例如setTimeout(() => { query.exec(...) }, 60) - 注意:H5 端可用
getBoundingClientRect(),但小程序端必须走uni.createSelectorQuery() - 频繁触发高度重设会影响性能,建议加防抖(
clearTimeout+ 新 timer)
轮播图看着简单,但每个参数背后都连着平台差异、渲染时机和 DOM 生命周期。最常被忽略的是:你以为改了 interval 就能调快慢,其实它和 duration、设备刷新率共同决定是否卡顿;你以为开了 circular 就万事大吉,结果用户只有两条数据,首页直接白屏。动手前,先想清楚你的最低数据量和目标平台。











