前言
自定义 navbar 应该是很常见的需求。要自定义一个 navbar 并不难,只需要了解其组成部分即可。

从上面的图片可以看出,navbar 由 statusbar 和 titlebar 组成。了解了这些组成部分之后,只需要知道它们各自的高度,就可以很好地完成自定义。
statusbar高度
状态栏高度与设备(即操作系统)有关。在 uniapp 中,提供了一个名为 getsysteminfosync 的方法,可以同步获取与设备相关的内容。
const systeminfo = uni.getsysteminfosync(); const statusbarheight = systeminfo.statusbarheight;
titlebar高度
通常,设备按照系统被划分为 android 和 ios,这种分类方式在行业内是一种通用的标准,虽然个别厂商可能会有一些细微的差异,但这里我们只关注通用标准。
const titlebarheight = systeminfo.platform == 'android' ? 48 : 44;
知道 statusbar 、titlebar 高度之后,接下来定义就很简单了。
编写navbar组件
<template>
<view class="navbar">
<!--statusbar-->
<view
v-if="showstatusbar"
class="status-bar"
:style="{ height: `${statusbarheight}px` }"
></view>
<view class="navbar-content" :style="{ height: `${titlebarheight}px` }">
<view class="navbar__left" @click="onclickleft">
<view class="navbar__left-icon">
<slot name="left"></slot>
</view>
</view>
<view class="navbar__title">
<slot name="title">
{{ title }}
</slot>
</view>
<view class="navbar__right" @click="onclickright">
<view class="navbar__right-icon">
<slot name="right"></slot>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
name: 'navbarcomponent',
props: {
title: {
type: string,
default: '',
},
showstatusbar: {
type: boolean,
default: true,
},
},
setup(props, { emit, expose }) {
const systeminfo = uni.getsysteminfosync();
const statusbarheight = systeminfo.statusbarheight;
const titlebarheight = systeminfo.platform == 'android' ? 48 : 44;
const navbarheight = statusbarheight + titlebarheight;
const getnavbarheight = () => {
return props.showstatusbar ? navbarheight : titlebarheight;
};
const onclickleft = () => {
emit('clickleft');
};
const onclickright = () => {
emit('clickright');
};
expose({
getnavbarheight,
});
return {
navbarheight,
titlebarheight,
statusbarheight,
onclickleft,
onclickright,
};
},
};
</script>
<style scoped lang="scss">
.navbar {
padding: 0 20rpx;
.navbar-content {
display: flex;
align-items: center;
}
.navbar__title {
display: flex;
justify-content: center;
align-items: center;
height: 100%;
flex: 1;
text-align: center;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.navbar__left {
flex: 0 0 80rpx;
display: flex;
align-items: center;
padding: 0 10rpx;
height: 100%;
font-size: 28rpx;
}
.navbar__right {
flex: 0 0 80rpx;
display: flex;
align-items: center;
padding: 0 10rpx;
height: 100%;
}
}
</style>使用
<template>
<b-navbar :title="title" @clickleft="onclickleft" @clickright="onclickright">
<template #left>
<uni-icons type="left"></uni-icons>
</template>
</b-navbar>
</template>
<script>
import { ref } from 'vue';
import bnavbar from '@/components/bnavbar/index.vue';
export default {
components: {
bnavbar,
},
setup() {
const title = ref('自定义navbar');
const onclickleft = () => {
uni.navigateback();
};
const onclickright = () => {
console.log('clickright');
};
return {
title,
onclickleft,
onclickright,
};
},
};
</script>
<style scoped lang="scss">
.navbar {
display: flex;
align-items: center;
padding: 0 20rpx;
.navbar__title {
display: flex;
justify-content: center;
align-items: center;
height: 100%;
flex: 1;
text-align: center;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.navbar__left {
flex: 0 0 80rpx;
display: flex;
align-items: center;
padding: 0 10rpx;
height: 100%;
font-size: 28rpx;
}
.navbar__right {
flex: 0 0 80rpx;
display: flex;
align-items: center;
padding: 0 10rpx;
height: 100%;
}
}
</style>最终效果

以上就是微信小程序中实现自定义navbar方法详解的详细内容,更多关于小程序自定义navbar的资料请关注代码网其它相关文章!
发表评论