需求:頁(yè)面有一列表,獲取可視區(qū)域的數(shù)據(jù);滑動(dòng)過(guò)程中不處理,停止滑動(dòng)后才獲取。
實(shí)現(xiàn)原理:獲取列表中每個(gè)條目的位置信息(元素頂部距可視區(qū)域頂部的距離),和可視區(qū)域比較,在可視范圍內(nèi)即認(rèn)為可視元素
如下簡(jiǎn)單html結(jié)構(gòu)
<view class="list"><view class="item" wx:for={{ data }} data-id={{ item.id }}>{{ item.name }}</view>
</view>
js方法
- 如果不需要判斷是否滑動(dòng),則在onPageScroll中直接執(zhí)行g(shù)etVisibleItems方法即可
最終得到的visibleItems即為可視區(qū)域的數(shù)據(jù),是一個(gè)數(shù)組,可通過(guò)每個(gè)元素的dataset獲取綁定在元素上的字段,如上述html中的字段id
Page({let scrollTimer = null onPageScroll: function (e) {if(scrollTimer){clearTimeout(scrollTimer)}scrollTimer = setTimeout(() => {this.getVisibleItems()}, 1000);},getVisibleItems(){const query = wx.createSelectorQuery().in(this);query.selectAll('.item').boundingClientRect();query.selectViewport().scrollOffset();query.exec((res) => {const listItemRects = res[0];const viewportHeight = wx.getSystemInfoSync().windowHeight;const visibleItems = listItemRects.filter(rect => {console.log(rect.top) console.log(viewportHeight)return rect.top && rect.top < viewportHeight;})})},
})