微信小程序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 相关文章推荐
js自定义方法通过隐藏iframe实现文件下载
Feb 21 Javascript
JSP跨iframe如何传递参数实现代码
Sep 21 Javascript
Js获取数组最大和最小值示例代码
Oct 29 Javascript
兼容主流浏览器的JS复制内容到剪贴板
Dec 12 Javascript
Javascript基础教程之数据类型 (数值 Number)
Jan 18 Javascript
浏览器兼容性问题大汇总
Dec 17 Javascript
AngularJS service之select下拉菜单效果
Jul 28 Javascript
利用JS测试目标网站的打开响应速度
Dec 01 Javascript
基于vue-upload-component封装一个图片上传组件的示例
Oct 16 Javascript
Element-ui DatePicker显示周数的方法示例
Jul 19 Javascript
微信小程序页面间传递数组对象方法解析
Nov 06 Javascript
在vue中嵌入外部网站的实现
Nov 13 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
php中日期加减法运算实现代码
2011/12/08 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
2015/09/25 PHP
PHP微信开发之文本自动回复
2016/06/23 PHP
PHP中in_array函数使用的问题与解决办法
2016/09/11 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
thinkPHP3.2.2框架行为扩展及demo示例
2018/06/19 PHP
PHP fopen函数用法实例讲解
2019/02/15 PHP
IE innerHTML,outerHTML所引起的问题
2009/06/04 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
JavaScript使用encodeURI()和decodeURI()获取字符串值的方法
2015/08/04 Javascript
jquery带下拉菜单和焦点图代码分享
2015/08/24 Javascript
jquery中ajax处理跨域的三大方式
2016/01/05 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
jQuery获取单击节点对象的方法
2016/06/02 Javascript
nodejs 的 session 简单使用
2016/06/06 NodeJs
js验证真实姓名与身份证号,手机号的简单实例
2016/07/18 Javascript
jQuery学习笔记之回调函数
2016/08/15 Javascript
Vue js 的生命周期(看了就懂)(推荐)
2019/03/29 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
2019/11/13 Javascript
Python基于smtplib实现异步发送邮件服务
2015/05/28 Python
python函数装饰器用法实例详解
2015/06/04 Python
python列表操作之extend和append的区别实例分析
2015/07/28 Python
Python多线程经典问题之乘客做公交车算法实例
2017/03/22 Python
Python Json模块中dumps、loads、dump、load函数介绍
2018/05/15 Python
Python实现 版本号对比功能的实例代码
2019/04/18 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
Python进行特征提取的示例代码
2020/10/15 Python
python Zmail模块简介与使用示例
2020/12/19 Python
美国面料纺织品商城:Fabric.com
2017/06/28 全球购物
美体小铺波兰官方网站:The Body Shop波兰
2019/09/03 全球购物
旅游专业毕业生自荐书
2014/06/30 职场文书
什么是检讨书?检讨书的格式及范文
2019/11/05 职场文书
CSS中em的正确打开方式详解
2021/04/08 HTML / CSS
Springboot使用Spring Data JPA实现数据库操作
2021/06/30 Java/Android
yyds什么意思?90后已经听不懂00后讲话了……
2022/02/03 杂记
SpringBoot详解整合Redis缓存方法
2022/07/15 Java/Android