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

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

相关推荐
benbenAItalk6 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
2601_962885726 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
西瓜太郎12347 小时前
Claude Code、Codex CLI、Gemini CLI 能否共用一枚 Key?先看协议选择矩阵
前端·api 网关·claude code·gemini cli·codex cli
陈随易9 小时前
在Finch用了62亿词元,我认为这是新一代Agent工具之神
前端·人工智能·后端
水域安全老周9 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
计算机魔术师9 小时前
Anthropic CEO突然喊踩刹车,OpenAI罕见力挺:AI这辆车不能只踩油门了
前端
wing9810 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端
EatFan10 小时前
Java接入支付宝 JSAPI 支付保姆教程(二):流程讲解与前后端代码讲解
前端·spring boot·后端·微信小程序·小程序·uni-app
梦想平凡10 小时前
百游棋牌源代码开发搭建教程(五):房间创建、座位分配与请求幂等实现
前端·javascript·数据库·源代码管理
IT_陈寒11 小时前
Redis的Set操作居然能把我的服务整挂了?
前端·人工智能·后端