对于使用Swiper实现整屏滑动的页面,如果某一页内容超过一屏高度,超出部分将无法通过滚动条下滑查看,即便我们设置了overflow:scroll
。
如果我们单纯的通过手势判断滑倒上一页/下一页,在一些浏览器表现不佳,所以我们得滑动到有滚动条的部分时,再去触发我们的相关事件。
最后一页的iPhone专区,其页面内容超过一屏高度,即使我们使出吃奶的劲去滑,超出部分将无法查看到,如图所示:
其Css如下:
这是为什么呢,因为Swiper注册了touchstart
,touchmove
,和touchend
事件,当手指在屏幕上滑动时,使用CSS3的transform
来实时设置viewport的位置,比如要显示第二个页面,就设置viewport的transform:translate3d(100%,0,0)
即可, 在这里使用translate3d来代替translateX,translate3d可以主动开启手机GPU加速渲染,页面滑动更流畅。
所以当我们滑到最后一页时,Swiper监听到了touchstart
,touchmove
等,在改变其translate3d
值,所以无法正常查看到超出该屏幕的内容。如下图所示,通过Chrome观察,我们可以看到每一次滑屏,都是translate3d
值的改变。
我们想要的效果是,超出的内容不受影响,出现滚动条,正常上下话查看内容;并且滑到底部/顶部时,仍然可以切换下一屏/上一屏。
在这种情况,我们祭出一段利器,在js中添加如下代码:
其中核心是判断onlyScrolling的状态,当滑动到有滚动条的部分时,slide.scrollHeight > slide.offsetHeight
为true
,否则为false
;
当滑到需要Swiper切换的临界点时,如下图所示代码为false
,在滚动中间区域时,为true
;
所以当onlyScrolling 为true
时,可以知道用户在浏览超出滚动的内容,当达到临界点想离开时,onlyScrolling为false
,不再阻止Swiper滑动,整屏可自由滑动。
当onlyScrolling
为true
时,阻止Swiper改变transform
值,使超出滚动部分的内容可以正常浏览。如下图所示:
至此,我们大功告成!