页面局部滑动的方法推荐 详解【scroll-view】【swiper】【overflow:scroll属性】区别
发布于 4 年前 作者 jiexiang 3383 次浏览 来自 分享

前言:

初期开发小程序的时候 我们可能遇到一个问题 一个scroll-view组件内的滑动与页面的滑动冲突 造成 scroll-view动画到边界后 页面才跟着滑动另外

有时可能遇到这样的需求 一个页面中有多处局部滑动 且 他们之间不能互相干扰 互相影响 而且大多数情况下 页面整体不能滑动

这时候我们通过文档 获取到的第一印象是使用scroll-view组件 或 使用swiper组件满足需求 而在实际的工程搭建上又会因为经验不足遇到许多


下面我们使用不同方法分别创建一个竖向的局部滑动区域

横向的参考竖向即可

多个滑动区域的使用三种方法创建对应组件

三种方法区别较大 需要根据实际场景选择



第一种方式 使用scroll-view方式创建一个滑动区域

我们创建一个长度为10的数组 在scroll-view内部

wxml:

wxss:

js:

注意

1.Page元素是该页面整体 类似于H5中的body 给其设置height:100%;变相屏蔽了页面的滑动事件

2.这里scroll-view组件除了设置scroll-y属性外 需要给list一个固定高度 才能生效



第二种方式 使用css属性 overflow-y:scroll

这里wxml和wxss稍作修改 其他的和上面相同

其实使用css属性只是模拟了scroll-view组件的效果 但毕竟scroll-view组件提供了许多其他的属性和方法可供开发者操作 例如监控组件的滑动等 如果使用css的话 只有局部区域的滑动效果而已



第三种方式 使用swiper组件实现竖向滑动

wxml

js

wxss:

这里还是比较复杂的,其中swiper组件需要设置vertical属性为true 另外margin-next指 swiper-item与后面子元素的距离 介于我们要设置swiper内尽可能显示全部的子元素 margin-next应设置为swiper高度 减 swiper-item的高度 计算方法如下 使用 wx.createSelectorQuery() 方法获取swiper和swiper-item元素的属性

预览图:

注意:

1.swiper的margin-next属性不支持 calc()动态计算高 因此只能使用在页面渲染完成后 获取滑动区域总体的高 - 元素内容的高 setdata 来渲染

2.swiper无论如何滑动 都会最终停在某个元素的顶端/左端 而上面两种方式可以scrollTop值可以停留在任何地方

3.swiper滑动到最后几个元素的时候 下方/右方还会留下空白位置 而上面两种方式scrollTop滑动到最后几个元素 滑动条不再滑动 下面/右方没有空白位置

4.swiper组件有 bindanimationfinish 这个方法监控 滑动动画的结束事件 而scroll-view只能通过 bindtouchend 拿到滑动手势的结束事件

swiper的这种特性可以满足特殊场景下的需求 比如无论如何滑动区域后 自动对焦

5.经过测试 swiper组件 在渲染子元素变多的情况下 性能会远小于 scroll-view 以5000个子元素为例 swiper 在安卓/IOS手机上的渲染速度已经严重影响用户体验 而scroll-view组件渲染可以在2秒内完成 并且实现滑动 因此在渲染数量在极限状态下 推荐使用scroll-view

6.如果想使用 scroll-view 模拟swiper的效果 可以使用 遮罩浮层盖住scroll-view主体 + 监听scroll-into-view事件 的方法达到效果 不过如果快速滑动 会造成高频使用 setdata 触发 scroll-into-view 事件造成页面撕裂



不同高度设备的适配:

但进一步想 现在设备五花八门 不同设备的宽高是不一样的 比如新出的安卓手机和iphone x/10/12屏幕都比较长,需要我们对滑动区域父元素进行高的计算 需要 height:calc()/width:calc() createSelectorQuery 动态计算,一个页面顶部有一处固定广告 下面的区域是滑动区域 那么滑动区域的高为 height:calc(100% - 300rpx)

相关代码如下 另附一个可以多处区域滑动的页面

https://developers.weixin.qq.com/s/jgK6DNmR77hJ

作者:陶路


其他相关阅读:

1.swiper组件

https://developers.weixin.qq.com/miniprogram/dev/component/swiper.html

2..scroll-view组件

https://developers.weixin.qq.com/miniprogram/dev/component/scroll-view.html

3.动态获取页面元素方法 wx.createSelectorQuery

https://developers.weixin.qq.com/miniprogram/dev/api/wxml/wx.createSelectorQuery.html

1 回复

火钳刘明

回到顶部