最轻量兼容方案是用原生touch事件+transform实现上下滑动翻页:touchstart记clienty,touchmove调用preventdefault阻断默认滚动,touchend按deltay阈值(50~80px)判断方向,配合transition动画与isanimating状态控制确保丝滑不卡顿。

直接用 touch 事件 + transform 实现上下滑动翻页,是当前最轻量、兼容性最好、也最容易调试的方案。不需要引入 Swiper 或 iScroll,原生 JS 就能稳住微信和主流安卓/iOS WebView。
怎么监听滑动并判断翻页方向
关键不是“滑多远”,而是“起始和结束的 Y 差值是否足够,且未被页面滚动干扰”。很多翻页失效,是因为没阻止默认行为或没限定触发区域。
-
touchstart时只记e.touches[0].clientY,别用pageY(可能含滚动偏移) -
touchmove中必须调用e.preventDefault(),否则 iOS 微信会优先触发页面整体滚动,翻页逻辑被吞掉 -
touchend里计算deltaY = endY - startY,建议阈值设为50~80px:太小易误触,太大难触发 - 只在首屏(
window.scrollY === 0)且当前无动画进行中时才响应上滑翻页;下滑回退则需额外判断是否已在第一页
怎么用 CSS 实现丝滑位移动画
靠 transition + transform: translateY() 是最稳妥的,比 top/margin 更高效,且不触发重排。
- 所有页容器统一高度为
100vh,父容器设overflow: hidden - 翻页容器(如
#pages)用position: relative,子页用position: absolute; top: 0; left: 0; width: 100%; height: 100% - 动画只加在翻页容器上:
transition: transform 0.4s cubic-bezier(0.33, 1, 0.68, 1),这个贝塞尔曲线比ease-out更有“惯性收尾”感 - 避免给每页单独加
transition,否则多页同时动会卡顿
怎么防止翻页过程出错或卡死
常见崩坏点不在动画本身,而在状态同步和边界控制。
- 翻页中禁用所有翻页按钮和 touch 事件监听,用一个
isAnimating标志位控制,动画结束再恢复(transitionend事件比setTimeout更准) - 每次翻页后,立刻重置
transform值为整数倍100vh,避免浮点误差累积导致后续位置偏移 - 不要用
scrollTop或scrollIntoView做翻页——它们不可控、不兼容、且无法配合自定义动画 - 如果页数超 5 页,记得懒加载非可视页的内容(比如只在
active类存在时才插入图片或初始化组件),否则内存暴涨、首屏变慢
真正难的不是让页面动起来,而是让动的过程在各种机型上都“不闪、不卡、不跳、不回弹”。重点盯住 touchmove 里的 preventDefault 是否生效、transform 值是否始终对齐 100vh 倍数、以及动画完成后的状态清理是否干净——这三点漏掉任一,用户就会觉得“翻页很假”。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











