微信小程序tab切换,可滑动切换,导航栏跟随滚动实现

6,056 阅读2分钟

简介: 项目中有一个功能,像今日头条小程序页面可以滑动切换,而且tab导航条也会跟着滚动,点击tab导航,页面滑动,切导航栏也会跟着滚动,就想着要怎么实现这个功能

效果

实现过程:

tab导航栏 <scroll-view>标签,内容使用<swiper>

wxml

    <view class="containers">
      <!-- tab导航栏 -->
      <!-- scroll-left属性可以控制滚动条位置 -->
      <!-- scroll-with-animation滚动添加动画过渡 -->
      <scroll-view scroll-x="true" class="nav" scroll-left="{{navScrollLeft}}" scroll-with-animation="{{true}}">
        <block wx:for="{{modleList}}" wx:for-index="idx" wx:for-item="navItem" wx:key="idx">
          <view class="nav-items nav-item{{idx}} navitems{{idx}}  {{currentTab == idx ?'active':''}}" data-current="{{idx}}" bindtap="switchNav">
            <text class="text-title {{currentTab == idx?'selects':''}}">{{navItem.name}}</text>
          </view>
        </block>
      </scroll-view>
      <!-- 页面内容 -->
      <swiper class="tab-box" current="{{currentTab}}" duration="300" bindchange="switchTab">
        <swiper-item wx:for="{{modleList}}" wx:for-item="tabItem" wx:for-index="idx" wx:key="idx" class="tab-content" scroll-x='true' style="width:100%;">
          <view class="c-list">
           <block>
             <view  class="c-item model-item">
                 <image src="{{tabItem.urls}}"></image>
             </view>
           </block>
          </view>
        </swiper-item>
      </swiper>
    </view>
 

js


Page({

  data: {
    currentTab: 0,
    navScrollLeft: 0,
    modleList: [
      {
        "name": "模块一",
        "urls": "http://img4.imgtn.bdimg.com/it/u=423551398,1303118808&fm=26&gp=0.jpg"
      },
      {
        "name": "模块二",
        "urls": "http://img2.imgtn.bdimg.com/it/u=3365093992,2526641564&fm=26&gp=0.jpg"
      },
      {
        "name": "模块三",
        "urls": "http://img0.imgtn.bdimg.com/it/u=2213244297,14939061&fm=26&gp=0.jpg"
      },
      {
        "name": "模块四",
        "urls": "http://img4.imgtn.bdimg.com/it/u=3762120152,4041020232&fm=26&gp=0.jpg"
      },
      {
        "name": "模块五",
        "urls": "http://img2.imgtn.bdimg.com/it/u=1889032813,1753990189&fm=26&gp=0.jpg"
      },
      {
        "name": "模块六",
        "urls": "http://img4.imgtn.bdimg.com/it/u=1435609199,2696310551&fm=26&gp=0.jpg"
      },
      
    ]

  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {

  },
  switchNav(event) {
    var cur = event.currentTarget.dataset.current;
    //每个tab选项宽度占1/5
    var singleNavWidth = this.data.windowWidth / 5;
    //tab选项居中                            
    this.setData({
      navScrollLeft: (cur - 2) * singleNavWidth
    })
    if (this.data.currentTab == cur) {
      return false;
    } else {
      this.setData({
        currentTab: cur
      })
    }
  },
  switchTab(event) {
    var cur = event.detail.current;
    var singleNavWidth = this.data.windowWidth / 5;
    this.setData({
      currentTab: cur,
      navScrollLeft: (cur - 2) * singleNavWidth
    });
  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function (e) {

  },

})

css

/* page/home/home.wxss */
.containers{
  margin-top: 300rpx;
}

.c-list{
  display: flex;  
}
.potion-list{
  display: flex;
}
.c-item {
  width:680rpx;
  height: 410rpx;
  position: relative;
  color: #fff;
  margin-bottom: 30rpx;
}
.nav {
    height: 80rpx;
    width: 100%;
    box-sizing: border-box;
    overflow: hidden;
    line-height: 80rpx;
    font-size: 16px;
    white-space: nowrap;
    color: #999;
    margin-top: -50rpx;
   display: flex;
   padding: 0 30rpx;
}


.nav-items{
    width: 18%;
    display: inline-block;
    text-align: center;
    margin-left:0rpx;
}
.active{
    color: #000;
     font-weight: 700;
      height: 60rpx;         
}
 .selects{
     border-bottom: 3rpx solid red;
}
.tab-box{
  width: 100vw;
  height: 590rpx;
  box-sizing: border-box;  
}
.tab-content{
    overflow-y: scroll;
    display: flex;
    justify-content: center;
    padding-top: 20rpx;
    margin-right: 20rpx;
}

.content{
    overflow-y: scroll;          
}
.codekongbai{
  margin-top:200rpx;
  display: block;
  width: 100%;
  overflow-y: scroll; 
}

.model-item image{
  width: 100%;
  height: 100%;
   border-radius: 20rpx;

}