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


Posted in Javascript onSeptember 04, 2019

简介

看到今日头条小程序页面可以滑动切换,而且tab导航条也会跟着滚动,点击tab导航,页面滑动,切导航栏也会跟着滚动,就想着要怎么实现这个功能

像商城类商品类目如果做成左右滑动切换类目用户体验应该会好很多,我这里只是一个小demo,没有怎么去考虑数据的问题,主要是想着去实现这么个功能,有可能后期引入数据后会出现问题,欢迎提出互相讨论

解决过程

1.在想要实现这个问题的时候找了不少别人的博客看,主体页面布局方面是比较统一的,tab导航栏使用<scroll-view>标签,内容使用<swiper>,其中的使用方法和参数希望自行参考api文档,不过多解释

布局代码如下:

wxml

<view class="container">
 <!-- tab导航栏 -->
 <!-- scroll-left属性可以控制滚动条位置 -->
 <!-- scroll-with-animation滚动添加动画过渡 -->
 <scroll-view scroll-x="true" class="nav" scroll-left="{{navScrollLeft}}" scroll-with-animation="{{true}}">
  <block wx:for="{{navData}}" wx:for-index="idx" wx:for-item="navItem" wx:key="idx">
   <view class="nav-item {{currentTab == idx ?'active':''}}" data-current="{{idx}}" bindtap="switchNav">{{navItem.text}}</view>
  </block>  
 </scroll-view>
 <!-- 页面内容 -->
 <swiper class="tab-box" current="{{currentTab}}" duration="300" bindchange="switchTab">  
  <swiper-item wx:for="{{[0,1,2,3,4,5,6,7,8]}}" wx:for-item="tabItem" wx:for-index="idx" wx:key="idx" class="tab-content">
   {{tabItem}}
  </swiper-item>
 </swiper>
</view>

wxss

/**index.wxss**/
page{
 width: 100%;
 height: 100%;
}
.container{
 width: 100%;
 height: 100%;
}
.nav {
 height: 80rpx;
 width: 100%;
 box-sizing: border-box;
 overflow: hidden;
 line-height: 80rpx;
 background: #f7f7f7;
 font-size: 16px;
 white-space: nowrap;
 position: fixed;
 top: 0;
 left: 0;
 z-index: 99;
}
.nav-item {
 width: 20%;
 display: inline-block;
 text-align: center;
}
.nav-item.active{
 color: red;
}
.tab-box{
 background: greenyellow;
 padding-top: 80rpx;
 height: 100%;
 box-sizing: border-box;
}
.tab-content{
 overflow-y: scroll;
}

js

//index.js
//获取应用实例
const app = getApp()

Page({
 data: {
  motto: 'Hello World',
  userInfo: {},
  hasUserInfo: false,
  canIUse: wx.canIUse('button.open-type.getUserInfo'),
  navData:[
   {
    text: '首页'
   },
   {
    text: '健康'
   },
   {
    text: '情感'
   },
   {
    text: '职场'
   },
   {
    text: '育儿'
   },
   {
    text: '纠纷'
   },
   {
    text: '青葱'
   },
   {
    text: '上课'
   },
   {
    text: '下课'
   }
  ],
  currentTab: 0,
  navScrollLeft: 0
 },
 //事件处理函数
 onLoad: function () {
  if (app.globalData.userInfo) {
   this.setData({
    userInfo: app.globalData.userInfo,
    hasUserInfo: true
   })
  } else if (this.data.canIUse) {
   // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
   // 所以此处加入 callback 以防止这种情况
   app.userInfoReadyCallback = res => {
    this.setData({
     userInfo: res.userInfo,
     hasUserInfo: true
    })
   }
  } else {
   // 在没有 open-type=getUserInfo 版本的兼容处理
   wx.getUserInfo({
    success: res => {
     app.globalData.userInfo = res.userInfo
     this.setData({
      userInfo: res.userInfo,
      hasUserInfo: true
     })
    }
   })
  }


  wx.getSystemInfo({
   success: (res) => {
    this.setData({
     pixelRatio: res.pixelRatio,
     windowHeight: res.windowHeight,
     windowWidth: res.windowWidth
    })
   },
  })  
 },
 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
  });
 }
})

页面代码如上面三部分,可以直接新建一项目进行测试

效果图如下

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

注意事项

在处理顶部tab导航跟随底部页面滑动的时候遇到一个问题,就是在给<scroll-view>中的scrll-left赋值的时候遇到的问题

逻辑上讲初始时tab导航下标小于2时导航栏不滚动,当大于2时向左滑动,以使被选中的导航栏居中,但是当最左侧的选项因为左滑看不到后,我又点击左侧选项希望导航往右滑动,能够看到左边的导航,按上面的js代码计算scroll-left会产生负值,但是scroll-left即使为负值,但是滚动条不会向左缩进去,所以即使为负值,相当于为0,当时做的时候一直在思考这个怎么用逻辑解决,想着要写各种判断,计算距离,结果到最后一句代码直接赋值就搞定了,也是很无语。

总结

以上所述是小编给大家介绍的微信小程序tab切换可滑动切换导航栏跟随滚动实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
初探jquery——表单应用范例
Feb 20 Javascript
摘自启点的main.js
Apr 20 Javascript
js自动闭合html标签(自动补全html标记)
Oct 04 Javascript
FF火狐下获取一个元素同类型的相邻元素实现代码
Dec 15 Javascript
window resize和scroll事件的基本优化思路
Apr 29 Javascript
javascript实现检验的各种规则
Jul 31 Javascript
jQuery UI插件实现百度提词器效果
Nov 21 Javascript
angular动态删除ng-repaeat添加的dom节点的方法
Jul 20 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
Feb 11 Javascript
JS加密插件CryptoJS实现AES加密操作示例
Aug 16 Javascript
浅析vue 函数配置项watch及函数 $watch 源码分享
Nov 22 Javascript
layui实现checkbox的目录树tree的例子
Sep 12 Javascript
微信小程序JS加载esmap地图的实例详解
Sep 04 #Javascript
深入浅出vue图片路径的实现
Sep 04 #Javascript
webpack 如何解析代码模块路径的实现
Sep 04 #Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
Sep 04 #Javascript
微信小程序 自定义复选框实现代码实例
Sep 04 #Javascript
layui弹出框Tab选项卡的示例代码
Sep 04 #Javascript
在layui tab控件中载入外部html页面的方法
Sep 04 #Javascript
You might like
discuz7 phpMysql操作类
2009/06/21 PHP
生成随机字符串和验证码的类的PHP实例
2013/12/24 PHP
php获取ajax的headers方法与内容实例
2017/12/27 PHP
PHP实现浏览器中直接输出图片的方法示例
2018/03/14 PHP
jQuery+PHP实现图片上传并提交功能
2020/07/27 PHP
选择TreeView控件的树状数据节点的JS方法(jquery)
2010/02/06 Javascript
JS禁用浏览器退格键实现思路及代码
2013/10/29 Javascript
jquery删除数据记录时的弹出提示效果
2014/05/06 Javascript
php实例分享之实现显示网站运行时间
2014/05/20 Javascript
js 模式窗口(模式对话框和非模式对话框)的使用介绍
2014/07/17 Javascript
兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码
2014/10/14 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
2016/01/17 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
2016/09/04 Javascript
vuejs响应用户事件(如点击事件)
2017/03/14 Javascript
vue.js如何更改默认端口号8080为指定端口的方法
2017/07/14 Javascript
详解vue-cli 构建Vue项目遇到的坑
2017/08/30 Javascript
node-sass安装失败的原因与解决方法
2017/09/04 Javascript
纯js代码生成可搜索选择下拉列表的实例
2018/01/11 Javascript
angularjs中$http异步上传Excel文件方法
2018/02/23 Javascript
理解Python垃圾回收机制
2016/02/12 Python
Python多线程经典问题之乘客做公交车算法实例
2017/03/22 Python
windows系统下Python环境搭建教程
2017/03/28 Python
python学习必备知识汇总
2017/09/08 Python
Python多线程threading模块用法实例分析
2019/05/22 Python
如何在Django配置文件里配置session链接
2019/08/06 Python
numpy中三维数组中加入元素后的位置详解
2019/11/28 Python
python爬虫利用代理池更换IP的方法步骤
2021/02/21 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
2021/02/22 Python
广州御银科技股份有限公司试卷(C++)
2016/11/04 面试题
教师岗位职责范本
2013/12/29 职场文书
新年联欢会主持词
2014/03/27 职场文书
2014年办公室文员工作总结
2014/11/12 职场文书
初三毕业评语
2014/12/26 职场文书
儿童诗两首教学反思
2016/02/23 职场文书
一级电子管军用接收机测评
2022/04/05 无线电
Win10 最新稳定版本 21H2开始推送
2022/04/19 数码科技