小程序导航栏位置与高度计算通用适配方案


在自定义小程序导航栏时,不同机型和尺寸的高度数据都不同导致很难进行适配,所以需要动态计算设备状态栏和胶囊的高度,本文使用Uniapp的跨平台小程序解决方案。

首先来了解下整个导航栏的结构组成原理。

从图片上可以看出,整个导航主要由状态栏(绿色区域)、导航栏(红色区域组成)组成,状态栏高度可以通过uni.getSystemInfoSync获得,而导航栏高度就没那么简单。

我们可以发现,胶囊上下还有一个高度差,通过测量,胶囊顶部高度距导航栏顶部和距底部的高度差是一样的,也就是说导航栏高度 = 胶囊高度 +(高度差)x  2

通过uni.getMenuButtonBoundingClientRect可以获取胶囊的高度信息(height),同时里面还返回了胶囊顶部距屏幕顶部距离的信息(top),也就是说

高度差=top-状态栏高度,代入上面的式子,这样就完美得出了状态栏高度,计算代码如下:

const SYSTEM_INFO = uni.getSystemInfoSync();
const getStatusBarHeight = ()=> SYSTEM_INFO.statusBarHeight;  //状态栏高度
const getTitleBarHeight = ()=>{
	const {top,height} = uni.getMenuButtonBoundingClientRect();
	return height + (top - getStatusBarHeight())*2
} //导航栏高度 = 胶囊高度 +(胶囊距顶部距离-状态栏高度)x  2

若要精准定位胶囊位置和设置高度,只需要在导航栏中加入胶囊高度的子盒子和垂直居中即可,效果如下图:

完整demo代码如下:

<template>
		<view style="background-color: darkgreen" :style="{paddingTop:getStatusBarHeight()+'px'}"></view>
		<view class="staTitleBar" :style="{height:getTitleBarHeight()+'px'}">
			<view class="staContent" :style="{height:getCapsuleHeight()+'px'}">
				Zeekin.cn
			</view>
		</view>
</template>

<style lang="scss">
		.staTitleBar{
			width: 100%;
			display: flex;
			align-items: center;
			background-color: darkred;
			.staContent{
				color: white;
				width: 100%;
				display: flex;
				align-items: center;
				justify-content: center;
				background-color: darkblue;
			}
		}
</style>
<script setup>
const SYSTEM_INFO = uni.getSystemInfoSync();
const getStatusBarHeight = ()=> SYSTEM_INFO.statusBarHeight;
const getTitleBarHeight = ()=>{
	const {top,height} = uni.getMenuButtonBoundingClientRect();
	return height + (top - getStatusBarHeight())*2
}
const getCapsuleHeight = ()=>{
	return uni.getMenuButtonBoundingClientRect().height;
}

</script>

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注