126 lines
2.5 KiB
Vue
126 lines
2.5 KiB
Vue
![]() |
<template>
|
|||
|
<view
|
|||
|
class="custom-nav-bar"
|
|||
|
:style="{ height: navBarHeight + 'px', background: bgcolor }"
|
|||
|
>
|
|||
|
<!-- 状态栏占位 -->
|
|||
|
<view class="status-bar" :style="{ height: statusBarHeight + 'px' }"></view>
|
|||
|
|
|||
|
<!-- 导航栏内容 -->
|
|||
|
<view class="nav-bar-content" :style="{ height: navBarContentHeight + 'px' }">
|
|||
|
<!-- 左侧返回按钮 -->
|
|||
|
<view class="nav-bar-left" v-if="showBackButton">
|
|||
|
<view class="back-button" @click="goBack">
|
|||
|
<uni-icons type="back" size="24" color="#000"></uni-icons>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
|
|||
|
<!-- 中间标题 -->
|
|||
|
<view class="nav-bar-center">
|
|||
|
<text class="nav-titles">{{ title }}</text>
|
|||
|
</view>
|
|||
|
|
|||
|
<!-- 右侧插槽 -->
|
|||
|
<view class="nav-bar-right">
|
|||
|
<slot name="right"></slot>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
export default {
|
|||
|
name: 'CustomNavBar',
|
|||
|
props: {
|
|||
|
title: {
|
|||
|
type: String,
|
|||
|
default: '标题'
|
|||
|
},
|
|||
|
showBackButton: {
|
|||
|
type: Boolean,
|
|||
|
default: false
|
|||
|
},
|
|||
|
bgcolor: {
|
|||
|
type: String,
|
|||
|
default: '#FFFFFF'
|
|||
|
}
|
|||
|
},
|
|||
|
data() {
|
|||
|
return {
|
|||
|
statusBarHeight: 0, // 状态栏高度
|
|||
|
navBarHeight: 0, // 导航栏总高度(状态栏 + 导航栏内容)
|
|||
|
navBarContentHeight: 44 // 导航栏内容高度(默认 44px)
|
|||
|
};
|
|||
|
},
|
|||
|
mounted() {
|
|||
|
this.getSystemInfo();
|
|||
|
},
|
|||
|
methods: {
|
|||
|
// 获取系统信息
|
|||
|
getSystemInfo() {
|
|||
|
uni.getSystemInfo({
|
|||
|
success: (res) => {
|
|||
|
this.statusBarHeight = res.statusBarHeight; // 获取状态栏高度
|
|||
|
this.navBarHeight = this.statusBarHeight + this.navBarContentHeight; // 计算导航栏总高度
|
|||
|
// 将 navBarHeight 传递给父组件
|
|||
|
this.$emit('updateHeight', this.navBarHeight);
|
|||
|
}
|
|||
|
});
|
|||
|
},
|
|||
|
// 返回上一页
|
|||
|
goBack() {
|
|||
|
uni.navigateBack({
|
|||
|
delta: 1
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
</script>
|
|||
|
|
|||
|
<style scoped>
|
|||
|
.custom-nav-bar {
|
|||
|
position: fixed;
|
|||
|
top: 0;
|
|||
|
left: 0;
|
|||
|
right: 0;
|
|||
|
z-index: 999;
|
|||
|
}
|
|||
|
|
|||
|
.status-bar {
|
|||
|
width: 100%;
|
|||
|
}
|
|||
|
|
|||
|
.nav-bar-content {
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
justify-content: space-between;
|
|||
|
padding: 0 16px;
|
|||
|
}
|
|||
|
|
|||
|
.nav-bar-left {
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
}
|
|||
|
|
|||
|
.back-button {
|
|||
|
padding: 8px;
|
|||
|
}
|
|||
|
|
|||
|
.nav-bar-center {
|
|||
|
flex: 1;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
align-items: center;
|
|||
|
}
|
|||
|
|
|||
|
.nav-titles {
|
|||
|
font-size: 16px;
|
|||
|
font-weight: bold;
|
|||
|
color: #FFF;
|
|||
|
}
|
|||
|
|
|||
|
.nav-bar-right {
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
}
|
|||
|
</style>
|