uniapp小程序顶部状态栏占位和自定义头部导航栏

子组件custom-header.vue

js 复制代码
<template>
  <view class="custom-header">
    <!-- 顶部状态栏占位 -->
    <view class="status-bar" :style="{ height: statusBarHeight + 'px' }"></view>

    <!-- 导航栏 -->
    <view class="nav-bar" :style="navBarStyle">
      <!-- 左侧插槽内容 -->
      <view class="left-slot">
        <text style="line-height: 44px;">返回</text>
      </view>

      <!-- 中间插槽内容 -->
      <view class="center-slot">
        <text style="line-height: 44px;">标题</text>
      </view>

      <!-- 右侧插槽内容 -->
      <view class="right-slot">
        <text style="line-height: 44px;">更多</text>
      </view>
    </view>
  </view>
</template>

<script>
  export default {
    name: 'CustomHeader',
    data() {
      return {
        statusBarHeight: 0, // 状态栏高度
        navBarHeight: '44px', // 导航栏高度
        paddingTop: '0px', // 导航栏上边距
      };
    },
    computed: {
      navBarStyle() {
        return {
          height: this.navBarHeight,
          paddingTop: this.paddingTop,
        };
      },
    },
    mounted() {
      this.getSystemInfo();
      this.getMenuButtonInfo();
    },
    methods: {
      // 获取系统信息
      getSystemInfo() {
        const systemInfo = uni.getSystemInfoSync();
        this.statusBarHeight = systemInfo.statusBarHeight || 0;
        console.log('状态栏高度:', this.statusBarHeight);
      },
      // 获取胶囊按钮信息
      getMenuButtonInfo() {
        if (uni.getMenuButtonBoundingClientRect) {
          const menuButtonInfo = uni.getMenuButtonBoundingClientRect();
          console.log('胶囊按钮信息:', menuButtonInfo);

          const paddingTop = menuButtonInfo.top - this.statusBarHeight;
          const navBarHeight = menuButtonInfo.height + paddingTop * 2;

          // 确保值是字符串,并包含单位
          this.navBarHeight = `${navBarHeight}px`;
          this.paddingTop = `${paddingTop}px`;
        } else {
          console.warn('当前环境不支持获取胶囊按钮信息');
        }
      },
    },
  };
</script>

<style scoped>
  .custom-header {
    width: 100%;
  }

  .status-bar {
    background-color: transparent;
  }

  .nav-bar {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding-left: 10px;
    padding-right: 10px;
    background-color: #ffffff;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  }

  .left-slot,
  .center-slot,
  .right-slot {
    display: flex;
    align-items: center;
    height: 100%; // 确保插槽内容高度撑满导航栏
  }

  .center-slot {
    flex: 1;
    justify-content: center;
  }

  .right-slot {
    justify-content: flex-end;
  }
</style>

父组件 index.vue

html 复制代码
<template>
<!-- 使用自定义头部组件 -->
		<custom-header>
			<!-- 左侧插槽内容 -->
			<template v-slot:left>
				<text>返回</text>
			</template>

			<!-- 中间插槽内容 -->
			<template v-slot:center>
				<text>标题</text>
			</template>

			<!-- 右侧插槽内容 -->
			<template v-slot:right>
				<text>更多</text>
			</template>
		</custom-header>
</template>

全局注册 main.js

js 复制代码
// 引入自定义头部组件
import CustomHeader from '@/components/custom-header.vue';

// 全局注册组件
Vue.component('CustomHeader', CustomHeader);
相关推荐
2501_915106328 小时前
app 上架过程,安装包准备、证书与描述文件管理、安装测试、上传
android·ios·小程序·https·uni-app·iphone·webview
2501_915106328 小时前
使用 Sniffmaster TCP 抓包和 Wireshark 网络分析
网络协议·tcp/ip·ios·小程序·uni-app·wireshark·iphone
宠友信息10 小时前
2025社交+IM及时通讯社区APP仿小红书小程序
java·spring boot·小程序·uni-app·web app
“负拾捌”10 小时前
python + uniapp 结合腾讯云实现实时语音识别功能(WebSocket)
python·websocket·微信小程序·uni-app·大模型·腾讯云·语音识别
局外人LZ1 天前
Uniapp脚手架项目搭建,uniapp+vue3+uView pro+vite+pinia+sass
前端·uni-app·sass
光影少年1 天前
AIGC + Taro / 小程序
小程序·aigc·taro
2501_915918411 天前
在 iOS 环境下查看 App 详细信息与文件目录
android·ios·小程序·https·uni-app·iphone·webview
前端呆头鹅1 天前
Websocket使用方案详解(uniapp版)
websocket·网络协议·uni-app
浮桥1 天前
uniapp+h5 公众号实现分享海报绘制
uni-app·notepad++
2501_916007471 天前
没有 Mac 用户如何上架 App Store,IPA生成、证书与描述文件管理、跨平台上传
android·macos·ios·小程序·uni-app·iphone·webview