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:同样可以获取到状态栏高度

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

相关推荐
变与不变8068 小时前
jQuery怎么使用
前端·javascript
神膘护体小月半9 小时前
flex 布局的 order 属性
前端·css
paopaokaka_luck9 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
仰望.9 小时前
vue 表格组件 vxe-table 树表格懒加载支持拖拽排序的详细用法
前端·javascript·vue.js·vxe-table
前端 贾公子9 小时前
vite-plugin-uni-manifest 升级指南
前端
小码哥_常9 小时前
iPhone 用户传了张 HEIC,我的前端崩了
前端
小码哥_常9 小时前
你发的原图可能暴露你家地址——聊聊图片 EXIF 隐私
前端
java1234_小锋9 小时前
【技术专题】CSS3 网页技术 - CSS3 优先级
前端·css·css3
鸿蒙开发10 小时前
共享 Schema 与 SchemaFactory
前端·后端·harmonyos
屏什么录10 小时前
录屏超过两小时就卡顿崩盘?从参数调优到代码实现,一文彻底搞定长时间录屏
前端·音视频开发