onpagescroll比bindscroll更适合详情页视差,因它获取真实scrolltop更稳定且不依赖scroll-view;需确保pages.json中disablescroll为false,避免在tabbar/subnvue容器中使用,并注意ios增强滚动与安卓硬件加速优化。

onPageScroll 比 bindscroll 更适合详情页视差
商品详情页通常是整页滚动,不是局部区域滚动,用 onPageScroll 拿到真实 scrollTop(单位 px)更稳,且不依赖嵌套 scroll-view。前提是 pages.json 里对应页面不能配 "disableScroll": true,否则事件根本不会触发。
常见错误是把 scroll-view 当成唯一选择——它默认禁用原生滚动,即使开了 scroll-y="true",在部分安卓 WebView 中仍拿不到准确 scrollTop,甚至 bindscroll 完全不触发。
- 必须在 pages.json 中确保该页面配置为
"disableScroll": false(默认就是 false,但显式写出来更保险) - 如果页面被包在 tabBar 或 subNVue 容器里,
onPageScroll可能收不到,得换回scroll-view+bindscroll - iOS 真机建议加
enhanced="true"到scroll-view(仅当你被迫用它时),否则滚动抖动、延迟明显
视差位移别硬乘系数,要限幅+防抖
直接用 scrollTop * 0.5 算背景图位移,会导致滑动时“飘”、回弹时“抽搐”。视差不是简单线性缩放,而是视觉层级的错觉模拟,关键在于控制幅度和节奏。
推荐做法:用 Math.min 和 Math.max 限制位移范围(比如 -80px 到 0),再配合节流(30ms 一次)避免频繁重绘。
- 安卓低端机上
onPageScroll容易丢帧,别在回调里直接写transform: translateY(...) - 位移值建议用
px单位,别混用rpx,否则不同屏幕表现不一致 - 加
style="transform: translateZ(0); will-change: transform;"能缓解安卓闪屏,尤其在图片多的详情页
scroll-view 做视差必须满足三个硬条件
如果非要用 scroll-view(比如需要局部滚动或兼容老项目),它不是设了 scroll-y="true" 就能动,缺一不可:
- 父容器必须有**固定高度**(不能靠内容撑开),例如
height: calc(100vh - 120px);height: 100vh在部分安卓 WebView 中失效 -
scroll-view必须显式绑定@scroll="handleScroll",且bindscroll属性名已弃用,要用小写scroll - 内部内容需设
position: relative,视差元素用position: absolute并配合top或transform动态调整
常见现象:scrollTop 始终为 0、bindscroll 不触发、滚动卡顿——基本都是这三个条件没同时满足。
iOS 和安卓渲染差异必须手动兜底
同一个视差逻辑,在 iOS 和安卓上表现可能完全不同:iOS 渲染平滑但 onPageScroll 延迟高;安卓容易闪屏、低端机掉帧,但滚动响应更及时。
- iOS 真机建议启用增强滚动:
<scroll-view enhanced="true"></scroll-view>,否则视差动画会“卡顿感”明显 - 安卓端务必加
translateZ(0)和will-change: transform,否则图片层可能撕裂或闪烁 - 不要依赖 CSS
transition做视差动画,它和滚动事件冲突,容易导致回弹异常
最麻烦的其实是设计稿里那种“渐进式模糊+位移+缩放”三重叠加视差——这种必须拆成独立 layer 控制,且每层节流间隔要错开,否则所有设备都会卡。实际项目中,优先保位移,模糊和缩放能省则省。











