应使用 scroll-view + scroll-into-view + 节流 dom 查询,禁用 onpagescroll;右侧滚动左侧高亮不准主因是 offsettop 计算过早或基准偏移,需在 onready 后延时查询并减去固定头部像素值,分类区块须设 position: relative 且 id 合法扁平,ios 下需关闭 bounce 并缓存高度、节流回调。
直接用 scroll-view + scroll-into-view + 节流 dom 查询,别碰 onpagescroll,它在 scroll-view 里根本不会触发。
右侧滚动时左侧高亮不准?检查 offsetTop 计算时机和基准
高亮错位最常见原因不是逻辑错,而是 uni.createSelectorQuery() 查得太早或基准偏了。节点还没渲染完、顶部有 uni-nav-bar、父容器用了 transform,都会让 boundingClientRect().top 失真。
- 所有分类区块(如
<view id="category-0"></view>)必须加position: relative,防 transform 干扰 - 查询必须在
onReady后延时执行:setTimeout(() => { this.queryCategoryHeights() }, 100),比单纯this.$nextTick更稳 - 如果页面有固定头部(比如 88rpx 高的导航栏),要从每个
top值里减去它的实际像素值(非 rpx) - 判断当前高亮项时,别只比
scrollTop ,用 <code>scrollTop + window.innerHeight * 0.3 > offsetTop[i]找“可视区中心所属项”,能大幅减少临界抖动
左侧点击后右侧没滚到目标位置?id 合法性与渲染顺序是关键
scroll-into-view 在 App 和小程序端极其脆弱:id 不合法、目标不在第一层子节点、id 对应节点还没挂载,都会静默失败,不报错也不滚动。
- 右侧每个分类区块的
id必须是纯字母/数字/下划线组合(如category-food),禁用中文、空格、短横线开头 - 结构必须扁平:
<scroll-view><view id="category-0">...</view><view id="category-1">...</view></scroll-view>,嵌套一层就找不到 - 点击跳转函数里必须包一层
this.$nextTick(() => { this.scrollInto = 'category-0' }),确保 DOM 已更新 - H5 端可额外加
scrollIntoView({ block: 'start' })兜底,但 App 和小程序只认字符串 id 绑定
iOS 下滚动卡顿、联动延迟?关 bounce + 缓存高度 + 节流
iOS 的 scroll-view bounce 效果会放大 JS 回调频率,加上每帧都查 DOM,主线程直接过载。
- 右侧
scroll-view加属性:bounce="false"和show-scrollbar="false" - 把所有分类区块的
offsetTop缓存在 data 里(如this.categoryOffsets = [0, 420, 860, ...]),只在初始化时查一次,滚动中直接数组比对 -
@scroll回调必须节流,50ms 是实测安全阈值:if (this.throttleTimer) return; this.throttleTimer = setTimeout(() => { /* 主逻辑 */ this.throttleTimer = null; }, 50) - 避免在滚动回调里调
uni.createSelectorQuery()或大量setData,只更新leftActiveIndex这类轻量数据
最易被忽略的点是:两个 scroll-view 都必须显式设 scroll-y,且左侧也得设固定高度(不能靠内容撑开),否则 iOS 下滚动事件压根不触发——这和直觉相反,但就是现状。










