微信小程序-上下滑动内容控制导航的选中

2,204 阅读2分钟

上一篇文章演示了如何使用锚点定位,即点击导航的时候跳转到相应的内容。但是若想反过来(滑动内容的时候控制导航的样式),就需要再做进一步的思考!

若是用JS实现,思路:

  1. 获取内容上下滑动的时候卷上去的高度
  2. 获取导航对应模块距离内容顶部的高度
  3. 通过第一步和第二步获取的高度比较,控制导航的选中样式

那么,在微信小程序里怎样实现呢?

查找微信小程序相关的文档之后,并没有得到比较优化的解决思路,换句话说,就是微信没有自己的实现方法,所以我们根据JS的实现思路来实现!

WXML结构

<view class="navigateBox">
  <view class="title">
    <image wx:if="{{actionView=='productBox'}}" src="../images/position.png"/>
    <view class="{{actionView=='productBox' ? 'checked':''}}">商品</view>
  </view>
  <view class="title">
    <image wx:if="{{actionView=='commentBox'}}" src="../images/position.png"/>
    <view class="{{actionView=='commentBox' ? 'checked':''}}">评价</view>
  </view>
  <view class="title">
    <image wx:if="{{actionView=='infoBox'}}" src="../images/position.png"/>
    <view class="{{actionView=='infoBox' ? 'checked':''}}">详情</view>
  </view>
</view>

<scroll-view @scroll="scrollTo">
  <view id="productBox"></view>
  <view id="commentBox"></view>
  <view id="infoBox"></view>
</scroll-view>    

在data里定义需要使用的变量

data={
    actionView: 'productBox',//控制导航选中
    productBoxTop: 0,//商品模块距离顶部的距离
    commentBoxTop: 0,//评价模块距离顶部的距离
    infoBoxTop: 0,//详情模块距离顶部的距离
}

获取内容上下滑动时卷上去的高度

在WXML部分,添加绑定事件

<scroll-view bindscroll="scrollTo">

内容上下滑动时距离内容顶部的距离

let scrollTop = e.detail.scrollTop;

获取导航对应模块距离内容顶部的高度

需要借助微信小程序里的createSelectorQuery()方法

new Promise(resolve => {
  let query = wx.createSelectorQuery();
  query.select('#productBox').boundingClientRect();
  query.select('#commentBox').boundingClientRect();
  query.select('#infoBox').boundingClientRect();
  query.exec(function (res) {
    resolve(res);
  });
}).then(res => {
  this.productBoxTop = res[0].top;
  this.commentBoxTop = res[1].top;
  this.infoBoxTop = res[2].top;
});

注意:createSelectorQuery()方法是异步的,所以利用Promise机制变成同步

通过两个高度的比较,控制导航的选中

scrollTo: function(e){
  let scrollTop = e.detail.scrollTop+100;//增加100是因为在内容滑入屏幕中间位置的时候就能显示选中导航的样式

  if(scrollTop >= this.infoBoxTop){
    this.actionView = 'infoBox';
  }else if(scrollTop >= this.commentBoxTop){
    this.actionView = 'commentBox';
  }else {
    this.actionView = 'productBox';
  }

  //this.$apply();//WEPY里实现数据绑定,刷新数据
}

至此,上下滑动内容控制导航的样式就实现了。下一篇会结合锚点定位,实现点击导航跳转到相应的内容和滑动内容实现导航的选中!