微信小程序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 相关文章推荐
新浪中用来显示flash的函数
Apr 02 Javascript
初学Javascript的一些总结
Nov 03 Javascript
javascript 页面划词搜索JS
Sep 28 Javascript
js修改原型的属性使用介绍
Jan 26 Javascript
JS清除选择内容的方法
Jan 29 Javascript
JavaScript实现LI列表数据绑定的方法
Aug 04 Javascript
js实现文字滚动效果
Mar 03 Javascript
node.js使用cluster实现多进程
Mar 17 Javascript
基于Node.js的JavaScript项目构建工具gulp的使用教程
May 20 Javascript
用angular实现多选按钮的全选与反选实例代码
May 23 Javascript
layui 富文本赋值,取值,取纯文本值的实例
Sep 18 Javascript
JS中箭头函数与this的写法和理解
Jan 14 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生成随机数或者字符串的代码
2008/09/05 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
offsetParent 算法分析
2010/04/05 Javascript
直接在JS里创建JSON数据然后遍历使用
2014/07/25 Javascript
js获取元素相对窗口位置的实现代码
2014/09/28 Javascript
初始Nodejs
2014/11/08 NodeJs
在父页面得到zTree已选中的节点的方法
2015/02/12 Javascript
JS实现超炫网页烟花动画效果的方法
2015/03/02 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
2016/06/21 Javascript
浅谈jQuery hover(over, out)事件函数
2016/12/03 Javascript
微信小程序之获取当前位置经纬度以及地图显示详解
2017/05/09 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
2017/07/04 Javascript
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
vue.js input框之间赋值方法
2018/08/24 Javascript
vue 实现边输入边搜索功能的实例讲解
2018/09/16 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
2019/06/03 Javascript
javascript实现放大镜功能
2020/12/09 Javascript
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
详解Python中用于计算指数的exp()方法
2015/05/14 Python
Python函数式编程指南(一):函数式编程概述
2015/06/24 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
2018/02/10 Python
Python实现随机漫步功能
2018/07/09 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
Python Celery多队列配置代码实例
2019/11/22 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
Python爬虫与反爬虫大战
2020/07/30 Python
详解HTML5新增标签
2017/11/27 HTML / CSS
使用HTML5 Canvas为图片填充颜色和纹理的教程
2016/03/21 HTML / CSS
消防器材管理制度
2014/01/28 职场文书
学校运动会广播稿
2014/10/11 职场文书
基层党支部整改方案
2014/10/25 职场文书
SQL Server实现分页方法介绍
2022/03/16 SQL Server