相關API
uni.getSystemInfoSync()
uni.getMenuButtonBoundingClientRect()
創建一個utils文件夾,該文件下封裝一個systemInfo.js
/*** 系統信息工具類* 封裝獲取系統狀態欄、導航欄和安全區域等相關信息的方法*/// 獲取系統信息并緩存
const systemInfo = uni.getSystemInfoSync();
//判斷設備,H5沒有膠囊按鈕
// #ifndef H5
const menuButtonInfo = uni.getMenuButtonBoundingClientRect();
// #endif// 默認值常量
const DEFAULT_STATUS_BAR_HEIGHT = 10;
const DEFAULT_BAR_HEIGHT = 44;
const DEFAULT_SAFE_AREA_INSETS = { bottom: 10, top: 0 };/*** 獲取狀態欄高度* @returns {string|number} 狀態欄高度,默認返回10px*/
export const getStatusBarHeight = () => {return systemInfo.statusBarHeight || DEFAULT_STATUS_BAR_HEIGHT;
};/*** 獲取導航欄總高度(包括狀態欄和標題欄)* @returns {number} 導航欄總高度,默認返回44*/
export const getNavigationBarHeight = () => {try {const statusBarHeight = Number(systemInfo.statusBarHeight) || 0;return (menuButtonInfo.top - statusBarHeight) * 2 + menuButtonInfo.height;} catch (error) {return DEFAULT_BAR_HEIGHT;}
};/*** 獲取菜單按鈕上邊距* @returns {number} 菜單按鈕上邊距*/
export const getMenuButtonTop = () => {return menuButtonInfo.top;
};/*** 獲取安全區域信息* @returns {Object} 包含bottom和top屬性的安全區域對象*/
export const getSafeAreaInsets = () => {return {bottom: systemInfo.safeAreaInsets?.bottom || DEFAULT_SAFE_AREA_INSETS.bottom,top: systemInfo.safeAreaInsets?.top || DEFAULT_SAFE_AREA_INSETS.top};
};export default {getStatusBarHeight,getNavigationBarHeight,getMenuButtonTop,getSafeAreaInsets
};
封裝一個nav-header.vue組件,在當前組件導入使用封裝的,固定在頂部
<template><view class="nav-layout"><!-- 狀態欄高度 --><view class="status-bar" :style="{ height: `${getStatusBarHeight()}px` }"></view><!-- 自定義導航欄 --><view class="search-bar" :style="{ height: `${getNavigationBarHeight()}px` }"><text class="recommend">推薦</text><view class="search-container" @click="onSearchClick"><uni-icons class="search-icon" type="search" size="22" color="#333" /><text class="search-placeholder">搜索</text></view></view></view><!-- 占位 --><view class="layout-fill" :style="{ height: `${getStatusBarHeight() + getNavigationBarHeight()}px` }"></view>
</template><script setup>
import {getStatusBarHeight,getNavigationBarHeight} from '@/utils/systemInfo.js'
</script><style lang="scss" scoped>
.nav-layout {position: fixed;top: 0;left: 0;z-index: 10;width: 100%;background: linear-gradient(to bottom, transparent, #fff 400rpx),linear-gradient(to right, #beecd8 20%, #f4e2d8);.status-bar {background-color: transparent;}.search-bar {display: flex;align-items: center;padding: 0 30rpx;.recommend {font-size: 40rpx;font-weight: bold;padding-right: 30rpx;color: #333;}}.search-container {display: flex;align-items: center;border-radius: 40rpx;border: 2px solid #fff;width: 300rpx;padding: 0 20rpx;box-sizing: border-box;background: rgba(255, 255, 255, 0.3);transition: all 0.3s ease;&:hover {background: rgba(255, 255, 255, 0.5);transform: scale(1.02);}.search-icon {padding-right: 6rpx;}.search-placeholder {color: #666;font-size: 28rpx;}}
}.layout-fill {width: 100%;
}
</style>