uniapp一个关于自定义导航栏高度计算的问题

问题核心

自定义导航栏没有正确计算状态栏高度,导致导航栏和状态栏重叠在一起了。

解决方案

1. 获取系统信息

javascript 复制代码
// 获取系统信息,包含状态栏高度等数据
const systemInfo = uni.getSystemInfoSync()
console.log(systemInfo)

2. 关键数据解析

  • 状态栏高度 :systemInfo.statusBarHeight (单位:px)
  • 胶囊按钮信息 :uni.getMenuButtonBoundingClientRect()

3. 完整代码实现

javascript 复制代码
// 获取导航栏所需的所有高度信息
function getNavBarInfo() {
  const systemInfo = uni.getSystemInfoSync()
  
  // 状态栏高度(px)
  const statusBarHeight = systemInfo.statusBarHeight || 0
  
  // 获取胶囊按钮信息
  let menuButtonInfo = {}
  try {
    menuButtonInfo = uni.getMenuButtonBoundingClientRect()
  } catch (e) {
    // H5等环境可能没有胶囊按钮
    menuButtonInfo = { top: 0, height: 0 }
  }
  
  // 计算导航栏总高度
  // 公式:状态栏高度 + (胶囊按钮top - 状态栏高度) * 2 + 胶囊按钮高度
  const navBarHeight = statusBarHeight + 
                      (menuButtonInfo.top - statusBarHeight) * 2 + 
                      menuButtonInfo.height
  
  return {
    statusBarHeight,        // 状态栏高度
    menuButtonInfo,         // 胶囊按钮信息
    navBarHeight           // 导航栏总高度
  }
}

// 在组件中使用
export default {
  data() {
    return {
      navBarInfo: {}
    }
  },
  mounted() {
    this.navBarInfo = getNavBarInfo()
    console.log('导航栏信息:', this.navBarInfo)
  }
}

4. 模板中使用

html 复制代码
<template>
  <view>
    <!-- 状态栏占位 -->
    <view :style="{ height: navBarInfo.statusBarHeight + 'px' }"></view>
    
    <!-- 导航栏内容 -->
    <view class="nav-bar" :style="{ height: (navBarInfo.navBarHeight - navBarInfo.statusBarHeight) + 'px' }">
      <text>我是导航栏标题</text>
    </view>
    
    <!-- 页面内容 -->
    <view class="content" :style="{ marginTop: navBarInfo.navBarHeight + 'px' }">
      页面主要内容...
    </view>
  </view>
</template>

5. 样式优化

css 复制代码
.nav-bar {
  display: flex;
  align-items: center;
  justify-content: center;
  background-color: #ffffff;
  position: fixed;
  top: var(--status-bar-height);
  left: 0;
  right: 0;
  z-index: 999;
}

核心要点

  1. 状态栏高度:直接从系统信息获取
  2. 胶囊按钮:包含top、height等信息
  3. 导航栏总高度 = 状态栏高度 + 上下间距 + 胶囊按钮高度
  4. 填充区域:用空view占位,避免内容被遮挡

多平台兼容

  • 小程序:有完整的胶囊按钮信息
  • H5:状态栏高度为0,需要特殊处理。设置多高都是,看情况,40、50都可
  • App:同样可以获取到状态栏高度

这样就能完美解决导航栏和状态栏重叠的问题了!

相关推荐
Dovis(誓平步青云)24 分钟前
导览音频切换太快,旧讲解不能覆盖新展品
android·前端·javascript·ecmascript·音视频·宠物
福兮说11 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
郑州光合科技余经理12 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
小呆呆66612 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
Dovis(誓平步青云)13 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan13 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_14 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒14 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
广州华水科技14 小时前
大坝安全监测解决方案:单北斗GNSS形变监测系统应用与维护
前端
yivifu15 小时前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub