找回密码
 加入怎通
查看: 226|回复: 2

微信小程序自定义navigationBar顶部导航栏,兼容适配所有机型(附完整案例)(微信小程序底部导航自定义)

[复制链接]
我来看看 发表于 2023-03-14 10:21:12 | 显示全部楼层 |阅读模式
" e8 k3 R- f/ N4 u( O9 q: @

本文首发自个人自有博客:【FaxMiao个人博客】,一个关注Web前端开发技术、关注用户体验、记录前端点滴,坚持更多原创,为大家提供高质量技术博文!前言navigationBar相信大家都不陌生把?今天我们就来说说自定义navigationBar,把它改变成我们想要的样子(搜索框+胶囊、搜索框+返回按钮+胶囊等)。

" S: }. N K' o0 A( K

思路隐藏原生样式获取胶囊按钮、状态栏相关数据以供后续计算根据不同机型计算出该机型的导航栏高度,进行适配编写新的导航栏引用到页面正文一、隐藏原生的navigationBarwindow全局配置里有个参数:navigationStyle(导航栏样式),default=默认样式,custom=自定义样式。

- O+ B4 j4 l. f4 P' J; _( V

"window":{"navigationStyle":"custom"}让我们看看隐藏后的效果:

1 q' Q& i0 D0 |7 G% `0 @( n. l& a

可以看到原生的navigationBar已经消失了,剩下孤零零的胶囊按钮,胶囊按钮是无法隐藏的二、准备工作1.获取胶囊按钮的布局位置信息我们用wx.getMenuButtonBoundingClientRect()。

1 @) D+ U! q/ K& H

【官方文档】获取胶囊按钮的布局位置信息,坐标信息以屏幕左上角为原点:constmenuButtonInfo=wx.getMenuButtonBoundingClientRect();width:宽度 height:高度

! r& n, ^# ?. Z. t/ R3 A" r

top:上边界坐标right:右边界坐标bottom:下边界坐标left:左边界坐标下面是官方给的示意图,方便大家理解几个坐标。

, {" j {* |# O' l: g t

2.获取系统信息用wx.getSystemInfoSync()【官方文档】获取系统信息,里面有个参数:statusBarHeight(状态栏高度),是我们后面计算整个导航栏的高度需要用到的constsystemInfo

! k' {6 c$ C7 V: Z: l0 F, [% O

=wx.getSystemInfoSync();##### 三、计算公式我们先要知道导航栏高度是怎么组成的,计算公式:导航栏高度 = 状态栏高度 + 44实例 【源码下载】自定义导航栏会应用到多个、甚至全部页面,所以封装成组件,方便调用;下面是我写的一个简单例子:。

& Y5 a, F* s6 C

app.jsApp({onLaunch:function(options){constthat=this;// 获取系统信息 . f3 W ~& `' g3 f constsystemInfo=wx.getSystemInfoSync();

; d; ^, e9 c8 {5 C8 q0 d3 F

// 胶囊按钮位置信息& i; v! J# h% [; N+ | constmenuButtonInfo=wx.getMenuButtonBoundingClientRect();// 导航栏高度 = 状态栏高度 + 44% u; g. F A" K/ f( p3 f( {( L that.globalData

* V2 n! k3 I/ e* `4 |# ?# x9 W( t

.navBarHeight=systemInfo.statusBarHeight+44;that.globalData.menuRight=systemInfo.screenWidth-menuButtonInfo

* l P2 f5 [; s8 i J/ i: a

.right;that.globalData.menuTop=menuButtonInfo.top;that.globalData.menuHeight=menuButtonInfo.height;},

% K) I4 w# H7 R5 t& ^

// 数据都是根据当前机型进行计算,这样的方式兼容大部分机器4 c9 [$ \6 a9 p, C globalData:{navBarHeight:0,// 导航栏高度# E1 r' m5 Y$ S, ^6 [1 P) a9 Q, \) ? menuRight:0,// 胶囊距右方间距(方保持左、右间距一致) 9 r# c& ?' T" a. _) m

3 Z' L" ~6 l S( q; ^1 v* `

menuTop:0,// 胶囊距底部间距(保持底部间距一致)5 S5 A( m. d$ L/ `& _* O, l, _! b menuHeight:0,// 胶囊高度(自定义内容可与胶囊高度保证一致) + H Z; c c9 A$ K1 R1 H ? }})app.json{"pages":["pages/index/index"

* } Y5 [5 J8 o N3 n' q

],"window":{"navigationStyle":"custom"},"sitemapLocation":"sitemap.json"}下面为组件代码:/components/navigation-bar/navigation-bar.wxml

$ i& l- o; _4 l8 W

="输入关键词!"style="height:{{menuHeight}}px; min-height:{{menuHeight}}px; line-height:{{menuHeight}}px; left:{{menuRight}}px; top:{{menuTop}}px;"

3 ]$ `7 T" v s+ P4 K- [: C. e

>/components/navigation-bar/navigation-bar.json

$ e$ i# k0 D, W( j8 l% N' ~

{"component":true}/components/navigation-bar/navigation-bar.jsconstapp=getApp()Component({properties:

; {& v# Q% \5 ~9 H

{// defaultData(父页面传递的数据-就是引用组件的页面)! I7 ?" M( Y3 g defaultData:{type:Object,value:{title:"我是默认标题"},observer:function

+ P2 K4 W- M8 G! _, B

(newVal,oldVal){}}},data:{navBarHeight:app.globalData.navBarHeight,menuRight:app.globalData.menuRight

$ `. t6 m3 c9 L& L

,menuTop:app.globalData.menuTop,menuHeight:app.globalData.menuHeight,},attached:function(){},methods:

0 Q) u/ Z m0 w+ @

{}})/components/navigation-bar/navigation-bar.wxss.nav-bar{position:fixed;width:100%;top:0;color:#fff

2 |" M8 o* x' j

;background:#000;}.nav-bar.search{width:60%;color:#333;font-size:14px;background:#fff;position:absolute

/ W# k) M/ p6 f1 @6 k8 C$ F& n+ P

;border-radius:50px;background:#ddd;padding-left:14px;}以下是调用页面的代码,也就是引用组件的页面:/pages/index/index.wxml<

$ |1 c' I+ g$ G% D+ z6 X

navigation-bardefault-data="{{defaultData}}">/pages/index/index.json{"usingComponents"

1 y9 S; W1 J- l' u/ N- p$ A- M' T

:{"navigation-bar":"/components/navigation-bar/navigation-bar"}}/pages/index/index.jsconstapp=getApp();

0 B5 v$ A3 t- {: N4 S

Page({data:{// 组件参数设置,传递到组件7 ]% j, X$ M G0 E defaultData:{title:"我的主页",// 导航栏标题 3 P y& y" I2 F' Q }},onLoad(){console.log(this.data.height

: F* h! C Y% y4 `& i& R

)}})效果图:

8 j8 u: Z4 [- U: a

好了,以上就是全部代码了,大家可以文中复制代码,也可以【下载源码】,直接到开发者工具里运行,记得appid用自己的或者测试哦!下面附几张其它小程序的效果图,大家也可以尝试照着做:

1 i+ x, v; i7 U8 E( [

总结本文写了自定义navigationBar的一些基础性东西,里面涉及组件用法、参数传递、导航栏相关由于测试环境有限,大家在使用时如果发现有什么问题,希望及时反馈,以供及时更新帮助更多的人!大家有什么疑问,欢迎评论区留言!。

& T/ k; v9 L; c4 J- w% U* I |' R : m5 O& A/ i2 ^' W8 K: p % @2 |/ v9 O8 {' U+ P! s8 k. o * I( Q, X' v/ Y# L8 N8 L6 o$ K4 O& b* U. I/ n$ Q

暂时无法加载帖子列表

回复

使用道具 举报

chinavod 发表于 2026-09-23 15:16:32 | 显示全部楼层
刚好遇到类似问题,看完这个帖子心里有底了
回复

使用道具 举报

西万路小混混 发表于 2026-09-30 17:41:54 | 显示全部楼层
完全赞同,我也是这么认为的,英雄所见略同~
回复

使用道具 举报

    您需要登录后才可以回帖 登录 | 加入怎通

    本版积分规则

    QQ|手机版|小黑屋|网站地图|真牛社区 ( 苏ICP备2023040716号-2 )

    GMT+8, 2026-10-1 14:02 , Processed in 0.035940 second(s), 25 queries , Gzip On.

    免责声明:本站信息来自互联网,本站不对其内容真实性负责,如有侵权等情况请联系420897364#qq.com(把#换成@)删除。

    Powered by Discuz! X3.5

    快速回复 返回顶部 返回列表