scroll-view 必须显式设置 width 和 white-space: nowrap,子项用 display: inline-block 且固定宽度;滚动定位优先用 scroll-into-view + 动态 id 与 :key,避免手动计算 offsetleft;滑动校准应在 scroll-end 时通过 createselectorquery 获取位置;各端隐藏滚动条需差异化处理。

scroll-view 必须设 width 和 white-space: nowrap
不设宽高,scroll-view 在 iOS 和部分安卓 WebView 里根本不会滚动;只开 scroll-x="true" 不顶用。常见翻车是子项用 flex 或默认 block,导致换行、横向失效。
正确写法:父容器(scroll-view)显式设 width: 100% 或具体值(如 width: 750rpx),并加 white-space: nowrap;子项统一用 display: inline-block,别用 flex —— 否则在低端安卓上会压缩错位。
- 每个分类项建议固定
width(如160rpx),避免文字长短不一造成居中偏移 - HBuilderX 真机调试时记得关闭「启用滚动区域优化」,否则 iOS 下可能拦截 touch 事件
- 不要把
scroll-view当普通view嵌套一堆未设样式的子view,那只是“看起来能滚”
点击居中滚动别直接算 offsetLeft
用 target.offsetLeft 手动算 scroll-left 值,在 H5 和小程序返回结果不一致,尤其有 padding/margin 时偏差明显。iOS 上还容易因渲染时机问题取到旧值。
真正稳定的做法是用 scroll-into-view + 动态 id,但必须满足两个前提:id 静态可预测(如 cate-0)、且带 :key 防 Vue 节点复用。
- 模板中每个分类
view写成<view :id="'cate-'+index" :key="item.id"></view> - 点击时赋值
this.scrollIntoView = 'cate-' + index,而不是手动改scroll-left - H5 端如果仍跳位,加
this.$nextTick(() => { ... })等 DOM 渲染完成再触发
二级分类联动滚动不能靠 scroll 实时推 current
监听 scroll 事件实时反推当前高亮项,性能差、误判率高——快速滑动时 scrollTop 取值抖动,加上 padding、字体渲染差异,很容易判定错项。
闲鱼式体验的可靠逻辑是:点击驱动 current,滑动仅作视觉反馈;唯一可信的校准时机是 scroll-end 事件,此时再用 uni.createSelectorQuery 查目标元素位置做兜底。
-
current必须是Number类型,传字符串会导致v-if判断失效 - 左侧一级分类滚动后,右侧二级列表用
scroll-into-view定位首个对应项,而非靠 scrollTop 计算 - 避免在
scroll中频繁调用节点查询,低端机易丢帧;节流至少300ms
隐藏滚动条但保留拖拽能力要分端处理
show-scrollbar="false" 只在 App 端生效,H5 和微信小程序完全忽略。强行用 overflow: hidden 包裹再嵌一层可滚动容器,会导致 iOS touch 事件穿透异常。
各端写法必须分开:
- H5:用 CSS
.scroll-view ::-webkit-scrollbar { display: none; }(仅 Safari/Chrome) - 微信小程序:
scroll-view默认无滚动条,只要不设show-scrollbar就行 - App 端(Vue2):在
pages.json对应页面加"scrollIndicator": "none"
最易被忽略的是:iOS 上若同时用了 scroll-with-animation="true" 和动态 scroll-into-view,可能触发回弹 bug,建议只留一个动效控制点。











