scroll-view 横向滚动失效主因是未设 width 和 white-space: nowrap;吸顶需用 scroll 监听+占位元素实现,禁用 position: sticky;二级联动应在 scrollend 查 dom 定位;真机调试须关闭“启用滚动区域优化”。

scroll-view 必须设 width 和 white-space: nowrap
横向滚动失效,90% 是因为没给 scroll-view 显式设置宽度和强制不换行。iOS 和部分安卓 WebView 下,scroll-x="true" 单独存在根本不会触发滚动——它连滚动条都不会渲染。
正确写法是:scroll-view 容器加 width: 750rpx(或 100%)+ white-space: nowrap;子项统一用 display: inline-block,禁用 flex 或默认 block——否则在低端安卓上会自动换行、错位、宽度塌缩。
每个分类项建议固定宽度,比如 width: 160rpx,避免文字长短不一导致点击区域偏移或居中逻辑失准。
吸顶不能靠 position: sticky
微信/支付宝/百度等小程序平台压根不支持 position: sticky,H5 端虽支持,但要求父容器有明确高度且不能带 overflow: hidden,实际项目里几乎没法满足。
稳定方案是监听 scroll-view 的 @scroll 事件,读取 detail.scrollTop,与吸顶元素原始 offsetTop 比较,用 data 控制 is-sticky class 切换:
-
offsetTop必须在onReady或this.$nextTick后查,否则 Vue 节点还没挂载,返回0 - 吸顶后内容会上跳?加一个同高占位
<view v-if="isSticky" class="placeholder" :style="{ height: headerHeight + 'px' }"></view>,headerHeight用uni.createSelectorQuery()一次性获取并缓存 - 别用
padding-top补高——滚动区域高度变化会引发滚动条跳动
二级分类联动别实时反推 current
监听 scroll 事件,靠 scrollTop 实时计算当前高亮项,是典型性能陷阱:快速滑动时值抖动,加上 padding、字体渲染差异、iOS 微信的 scroll 延迟,很容易判定错项。
真正靠谱的做法是:为每个内容区块设唯一 id(如 section-0),滚动停止后(bindscrollend)用 createSelectorQuery 查各区块 boundingClientRect,取 top 0 的那个作为 active。注意:
-
exec()只调一次,多次调用会重复查询、拖慢帧率 - 查到的位置要减去吸顶栏高度(
statusBarHeight + navBarHeight),否则 iOS 上容易误判 - 不要在每次
scroll中都查 DOM,只在scrollend时查一次
真机调试必须关掉「启用滚动区域优化」
HBuilderX 真机调试时,默认开启的「启用滚动区域优化」会在 iOS 下拦截 touch 事件,导致横向滚动卡顿、吸顶响应延迟、甚至点击无反应。
关闭路径:运行 → 运行到手机或模拟器 → 运行参数 → 取消勾选「启用滚动区域优化」。
另外,如果吸顶区域含 input 或 picker,在 iOS 微信小程序中 fixed 元素可能被键盘顶起——此时需监听 keyboardheight 动态调整 top 值,而不是硬写死 top: 0。










