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

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

相关推荐
wuk9982 小时前
实现ROS系统的Websocket传输,向Web应用推送sensor_msgs::Image数据
前端·websocket·网络协议
合作小小程序员小小店4 小时前
web网页开发,在线%考试管理%系统,基于Idea,vscode,html,css,vue,java,maven,springboot,mysql
java·前端·系统架构·vue·intellij-idea·springboot
天天进步20154 小时前
CSS Grid与Flexbox:2025年响应式布局终极指南
前端·css
Boop_wu5 小时前
[Java EE] 计算机基础
java·服务器·前端
Novlan15 小时前
TDesign UniApp 组件库来了
前端
用户47949283569155 小时前
React DevTools 组件名乱码?揭秘从开发到生产的代码变形记
前端·react.js
顾安r6 小时前
11.8 脚本网页 打砖块max
服务器·前端·html·css3
倚栏听风雨6 小时前
typescript 方法前面加* 是什么意思
前端
狮子不白6 小时前
C#WEB 防重复提交控制
开发语言·前端·程序人生·c#
菜鸟‍6 小时前
【前端学习】阿里前端面试题
前端·javascript·学习