微信小程序实现自定义顶部导航栏(选项卡),固定导航栏和可滑动导航栏

  • 固定导航栏
  • 可滑动导航栏

顶部导航栏的需求实现:

  • 顶部导航栏由列表渲染,通过tabclick点击事件改变activeIndex变量的当前值,从而控制weui-navbar-item的切换。

  • wxml获取activeIndex的当前值,通过view组件的hidden="{{activeIndex!=x}}"属性选择性隐藏其余activeIndex下的页面,只显示当前activeIndex下的页面,当然也可以适当修改wxml灵活选择不同的页面显示或隐藏。

固定导航栏和可滑动导航栏区别在于:

  • 效果上:可滑动导航栏承载的页面数量远超过固定导航栏,不仅可以滑动导航栏,而且点击边缘处的native-item时会自动使native-item处于页面中;

  • 原理上:tabClick点击事件只是单单改变activeIndex的当前值,switchNav点击事件除此之外同时改变navScrollLeft的大小以实时改变scroll-view组件的scroll-left属性,达成切换页面时的动画效果。

固定导航栏

效果示意图:

代码:
wxml

<view class="page"><view class="page__bd"><view class="weui-tab"><view class="weui-navbar"><block wx:for="{{tabs}}" wx:key="*this"><view id="{{index}}" class="weui-navbar-item {{activeIndex == index ? 'weui-navbar-item-on' : ''}}" bindtap="tabClick"><view class="weui-navbar__title">{{item}}</view></view></block></view><view class="weui-tab__panel"><!-- 第1个页面 --><view class="weui-tab_content" hidden="{{activeIndex != 0}}">1</view><!-- 第2个页面 --><view class="weui-tab_content" hidden="{{activeIndex != 1}}">2</view><!-- 第3个页面 --><view class="weui-tab_content" hidden="{{activeIndex != 2}}">3</view><!-- 第4个页面 --><view class="weui-tab_content" hidden="{{activeIndex != 3}}">4</view><!-- 第5个页面 --><view class="weui-tab_content" hidden="{{activeIndex != 4}}">5</view></view></view></view>
</view>

js

var sliderWidth = 96; // 需要设置slider的宽度,用于计算中间位置
const app = getApp()
Page({data: {tabs: ["标题A", "标题B", "标题C", "标题D", "标题E"],activeIndex: 0,sliderOffset: 0,sliderLeft: 0},onLoad: function (options) {var that = this;wx.getSystemInfo({success: function (res) {that.setData({sliderLeft: (res.windowWidth / that.data.tabs.length - sliderWidth) / 2,sliderOffset: res.windowWidth / that.data.tabs.length * that.data.activeIndex});}});that.setData({activeIndex: options.activeIndexData})},tabClick: function (e) {this.setData({sliderOffset: e.currentTarget.offsetLeft,activeIndex: e.currentTarget.id})}
})

wxss

page,
.page,
.page__bd {height: 100%;
}
.page__bd {padding-bottom: 0;
}
.weui-tab_content {padding-top: 60px;text-align: center;font-size: 32rpx;
}
.weui-navbar {display: flex;position: absolute;left: 0;top: 0;z-index: 500;width: 100%;height: 95rpx;flex-direction: row;text-align: center;color: #A8A8A8;font-size: 32rpx;box-sizing: border-box;background-color: #FFF;border-bottom: 1rpx solid #DFDFDF;
}
.weui-navbar-item {flex: 1;padding: 26rpx 0px;
}
.weui-navbar-item-on {transition: all 0.3s;border-bottom: 10rpx solid #478ff3;color: #478ff3;
}

可滑动导航栏

效果示意图:

代码:
wxml

<view class="page"><!-- tab导航栏 --><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"><text>{{navItem}}</text></view></block></scroll-view><!-- 页面内容 --><view class="weui-tab__panel"><!-- 第1个页面 --><view class="weui-tab_content" hidden="{{currentTab != 0}}">1</view><!-- 第2个页面 --><view class="weui-tab_content" hidden="{{currentTab != 1}}">2</view><!-- 第3个页面 --><view class="weui-tab_content" hidden="{{currentTab != 2}}">3</view><!-- 第4个页面 --><view class="weui-tab_content" hidden="{{currentTab != 3}}">4</view><!-- 第5个页面 --><view class="weui-tab_content" hidden="{{currentTab != 4}}">5</view><!-- 第6个页面 --><view class="weui-tab_content" hidden="{{currentTab != 5}}">6</view><!-- 第7个页面 --><view class="weui-tab_content" hidden="{{currentTab != 6}}">7</view><!-- 第8个页面 --><view class="weui-tab_content" hidden="{{currentTab != 7}}">8</view></view>
</view>

js

var sliderWidth = 96; // 需要设置slider的宽度,用于计算中间位置
const app = getApp()
Page({data: {navData: ["标题A", "标题B", "标题C", "标题D", "标题E", "标题F", "标题G", "标题H"],currentTab: 0,navScrollLeft: 0,},onLoad() {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/5var singleNavWidth = this.data.windowWidth / 5;//tab选项居中                            this.setData({navScrollLeft: (cur - 2) * singleNavWidth})if (this.data.currentTab == cur) {return false;} else {this.setData({currentTab: cur})}}
})

wxss

.weui-tab_content {padding-top: 100rpx;text-align: center;font-size: 32rpx;
}
.nav {height: 86rpx;text-align: center;color: #A8A8A8;font-size: 4vw;background-color: #FFF;border-bottom: 1rpx solid #DFDFDF;width: 100%;box-sizing: border-box;overflow: hidden;line-height: 80rpx;white-space: nowrap;position: fixed;top: 0;left: 0;z-index: 99;
}
.nav-item {width: 22%;display: inline-block;text-align: center;
}
.nav-item.active {transition: all 0.3s;border-bottom: 10rpx solid #478ff3;color: #478ff3;
}

微信小程序实现自定义顶部导航栏(选项卡),固定导航栏和可滑动导航栏相关推荐

  1. 微信小程序 解决自定义顶部导航栏被键盘挤压的问题

    解决思路:         先把键盘的adjust-position置为false,防止键盘自动挤压.然后计算键盘弹起时,input实际被遮挡的高度,通过代码来上滑相应的距离 wxml代码: < ...

  2. 微信小程序,自定义导航栏组件

    微信小程序,自定义导航栏组件,可兼容iPhone 11及以上留海屏显示,关于参数获取设置参照微信小程序-收藏_羽筠的博客-CSDN博客 可定义设置的内容如下: 文字及返回箭头颜色 背景图片(优先级高于 ...

  3. 微信小程序的自定义导航栏

    微信小程序的导航栏主要分为两个部分:状态栏和标题栏. 关于微信小程序的自定义导航栏也就是通过微信小程序官方提供的API接口来算出状态栏和标题栏的高度. 注意获取到的数值单位都是px. 首先要开启自定义 ...

  4. 关于微信小程序如何去掉顶部标题,自定义标题详细讲解

    关于微信小程序如何去掉顶部 今天工作要求去掉小程序顶部,做成自定义样式,百度后看到一码友写的不错,附上链接:自定义小程序顶部 下面是我新建后做的例子: 首先新建后结构如下:(图片是我自己添加的,用于顶 ...

  5. 【微信小程序】自定义弹窗蒙版输入框效果图完整代码

    [微信小程序]自定义弹窗文本输入框效果图&完整代码 效果图 在输入框中进行内容的输入 点击确认后在姓名一栏进行更新修改 点击返回后姓名一栏不做任何修改 在这个的基础上你可以自定义任何弹窗 wx ...

  6. 微信小程序wepy自定义card控件封装

    微信小程序wepy自定义card控件 在利用wepy开发小程序的过程中,需要使用自定义控件来实现,但是很多时候,若直接在page页面中写对应的控件,下次在另一个页面中,想使用同样的控件又需要重新绑定数 ...

  7. 微信小程序图标不支持html,微信小程序实现自定义加载图标功能

    效果图 实现思路 1.首先通过HTML+CSS实现加载动画的静态效果: 2.根据需求给每个动画设计不同的动画效果. 例如第一个加载图标的静态绘制 1.首先确定动画的盒子宽高: 2.设置盒子中每一个长方 ...

  8. 微信小程序可以加服务器上的字体,微信小程序中自定义字体

    微信小程序支持自定义字体开放出来也有段时间,这边整理下使用自定义字体中,容易忽略的一些问题,和简便的全局自定义方式.如果是同时加载两种字体包,先下载下来的会被后下载下来的字体包给覆盖. 官网接口文档 ...

  9. 微信小程序之自定义模态弹窗(带动画)实例

    代码地址如下: http://www.demodashi.com/demo/13991.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.c ...

最新文章

  1. 用线性单元(LinearUnit)实现工资预测的Python3代码
  2. HYSBZ - 2160 拉拉队排练(回文自动机)
  3. 生命的力量:萝卜开花
  4. 二手手机交易平台使用MYSQL的方法_安卓Android校园淘(二手交易)APP设计与实现(MySQL)...
  5. Java环境变量CLASSPATH详解(转载)
  6. python开发环境推荐_推荐一款Python开发环境管理神器
  7. 常用HDFS java API
  8. 实验六:流类库与I/O
  9. 【生信进阶练习1000days】day16~day22-RNA-seq data analysis with limma edgeR and Glimma
  10. 《Java编程思想》读后感
  11. java web工程师百度云教程_JavaWeb工程师全套视频教程 (初级+中级+高级) 一共485集 送面试辅导...
  12. 高清 GJB-5000B,2021最新版发布,软件能力成熟度模型
  13. 3GPP TS 23502-h20 中英文对照 | 4.15.6.2 NEF service operations information flow
  14. paypal java sdk_PayPal-Java SDK /信用卡付款问题
  15. 第五次作业—— 四则运算“软件”开发
  16. 深入学习ElasticSearch(四)——mapping的详细讲解
  17. 检察院批准逮捕洪磊,铁杆分子不买帐
  18. SQLZOO附加题练习 - Window functions
  19. STM32芯片烧录后上电不运行
  20. 2. ZK客户端与服务端建立连接的过程(基于NIO)

热门文章

  1. CDH HIVE报错引发的一系列血案
  2. 数据库——多种方法导入Excel数据
  3. 企业CDN的简单搭建-varnish
  4. Vue中的slot和slot-scope使用
  5. 董明珠引领格力电器,让中国制造赢得全球认可!
  6. [Go实战]golang使用mysql实例和第三方库Gendry
  7. 基于Docker的深度学习环境NVIDIA和CUDA部署以及WSL和linux镜像问题
  8. 嵌入式Linux图形系统
  9. 可视化Vue开发小助手-Troll (VS Code插件)
  10. 【CSS 属性值分类: 指定值,计算值,使用值,实际值 的区别】