找回密码
 加入怎通
查看: 153|回复: 0

微信小程序自定义导航栏兼容适配所有机型(微信小程序顶部导航栏怎么做)

[复制链接]
我来看看 发表于 2023-03-14 20:08:50 | 显示全部楼层 |阅读模式
& E# Y- T! M5 {3 S; E* B

目前小程序已在前端占了一席之地,最近公司项目上用的就是小程序开发,由于功能及页面不是很多,所以直接原生开发,毕竟坑可能会少点,在开发过程中,小程序自带导航栏和客户的设计稿导航栏排在一起,感觉很别扭,因此要求去掉微信的自带导航栏,微信提供了这方面的api,接下来我们就实操。

+ _1 b% l' u \

这是小程序官方文档截图,可以看到导航栏样式支持两种,默认是带导航栏,另外一种是自定义导航栏-custom,如果使用自定义导航栏,我们可以全局配置//app.json"window": {"navigationStyle"

: x1 t7 v0 F+ f

: "custom"}单页面配置//page.json{"navigationStyle": "custom"}效果对比

7 k4 C' p3 N7 ]+ w5 ~

能明显的看出来,自定义导航栏页面内容已经顶到屏幕顶端,除了胶囊按钮,其他都是页面可控区域每个手机的屏幕都不一样,各家系统的状态栏高度也不一样,因此,我们在开发页面时要考虑屏幕的适配,有刘海的,要留出刘海的距离,没有的,要把状态栏高度留出来。

9 A; s2 l$ e0 n1 z6 @& L i

1.获取导航栏高度及按钮位置微信提供了获取导航栏高度的Api和胶囊按钮位置的Api// 系统信息const systemInfo = wx.getSystemInfoSync();// 胶囊按钮位置信息

* @0 U: P4 V9 M1 z c( W5 B$ A$ |

const menuButtonInfo = wx.getMenuButtonBoundingClientRect();在控制台打印出这两个Api返回结果

- J. g/ ^& B" D, b! x

这里面我们只说几个我们接下来用到的参数statusBarHeight // 状态栏高度screenWidth // 胶囊的宽度top // 胶囊到顶部距离height // 胶囊的高度right // 胶囊距离右边的距离。

8 x* j8 r, ?7 ^% ?# ]& _) h3 {4 E- f

通过这几个参数,我们可以计算出状态栏的高度,微信胶囊所占的高度(存在padding值,可以使元素和胶囊纵向居中)首先在app.js中定义全局data-globalDataglobalData: { navBarHeight:

6 I# W' [5 L2 b9 `

0, // 导航栏高度 menuBotton: 0, // 胶囊距底部间距(保持底部间距一致) menuRight: 0, // 胶囊距右方间距(方保持左、右间距一致) menuHeight: 0, // 胶囊高度(自定义内容可与胶囊高度保证一致)

6 z. V: a; X" l: t

},新建个方法setNavBarInfo() {// 获取系统信息 const systemInfo = wx.getSystemInfoSync();// 胶囊按钮位置信息 const menuButtonInfo = wx.getMenuButtonBoundingClientRect();

' d+ a. k( D2 O

// 导航栏高度 = 状态栏到胶囊的间距(胶囊距上距离-状态栏高度) * 2 + 胶囊高度 + 状态栏高度this.globalData.navBarHeight = (menuButtonInfo.top - systemInfo.statusBarHeight) *

* O# Q: x2 b9 N

2 + menuButtonInfo.height + systemInfo.statusBarHeight;this.globalData.menuBotton = menuButtonInfo.top - systemInfo.statusBarHeight;

. v0 }. g# ~7 z% |

this.globalData.menuRight = systemInfo.screenWidth - menuButtonInfo.right;this.globalData.menuHeight = menuButtonInfo.right;

" i+ d! e5 ^7 D1 R; t3 G u9 d

}在onLaunch中调用,因为我这个项目是所有的导航都不用微信自带的,所以在app.js中调用及设置data onLaunch() {this.setNavBarInfo() },到这里所需要用到的都已经存了起来,页面用法也比较简单,排除状态栏的高度,设置导航栏的高度和胶囊高度保持,用flex布局。

+ Q; O& A; d2 k4 S e4 o

2.页面适配首先page.js中定义变量var app = getApp()Page({/** * 页面的初始数据 */ data: { navBarHeight: app.globalData.navBarHeight,

9 v" F& [9 X: j: E% V

//导航栏高度 menuBotton: app.globalData.menuBotton, //导航栏距离顶部距离 menuRight: app.globalData.menuRight, //导航栏距离右侧距离

/ O2 v# X! V& J6 S

menuHeight: app.globalData.menuHeight, //导航栏高度 }})页面使用

9 W: k% h- d! V. A. X7 ^8 r" }5 G

>

0 ~4 I" h/ I3 F+ b: P2 g. r

px; min-height:{{menuHeight}}px; line-height:{{menuHeight}}px; bottom:0px;padding:0 {{menuRight}}px;">

& y7 {! U- s& J9 n* S+ k

wxss/* 公共导航 */.nav {position: fixed;top: 0;left: 0;box-sizing

, q' I4 i P9 t4 R4 `& ?: G

: border-box;width: 100vw;z-index: 1000; }.nav-main {width: 100%;height: 100%;box-sizing: border-box;

$ Q! X' z) v' e2 P* n. W

position: relative; }.nav.capsule-box {position: absolute;box-sizing: border-box;width: 100%;display: flex;

3 K; x9 |7 J- o

align-items: center; }最终效果

) |# l; v- }5 @: m3 U

此种适配方案适应所有手机,应该说是最优的选择。

4 r' T2 t" ]$ M; y0 D * `" }2 c! y% X5 I7 y ; u2 K8 z+ S/ F- E/ x I% Q5 W, s' A2 m4 Z0 n0 G4 G5 ?1 n. g2 L* y7 [
回复

使用道具 举报

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

    本版积分规则

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

    GMT+8, 2026-7-8 18:28 , Processed in 0.036826 second(s), 25 queries , Gzip On.

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

    Powered by Discuz! X3.5

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