Uniapp 自定义头部导航栏

Uniapp 自定义头部导航栏指南

在 Uniapp 中自定义头部导航栏可以通过以下几种方式实现:

1. 全局配置

pages.json 中进行全局配置:

json 复制代码
{
  "globalStyle": {
    "navigationBarTextStyle": "black",
    "navigationBarTitleText": "默认标题",
    "navigationBarBackgroundColor": "#F8F8F8",
    "backgroundColor": "#F8F8F8"
  }
}
html 复制代码
"style": {
  "navigationBarTitleText": "首页",      // 设置导航栏标题文字
  "navigationBarBackgroundColor": "#FF0000",  // 设置导航栏背景颜色
  "navigationBarTextStyle": "white"     // 设置导航栏文字颜色
}

2. 单页面配置

pages.json 中为特定页面配置:

json 复制代码
{
  "pages": [
    {
      "path": "pages/index/index",
      "style": {
        "navigationBarTitleText": "首页",
        "navigationBarBackgroundColor": "#FF0000",
        "navigationBarTextStyle": "white"
      }
    }
  ]
}

3. 完全自定义导航栏

如果需要更复杂的自定义,可以隐藏原生导航栏并使用自定义组件:

  1. 首先在 pages.json 中隐藏原生导航栏:
json 复制代码
{
  "pages": [
    {
      "path": "pages/index/index",
      "style": {
        "navigationStyle": "custom"
      }
    }
  ]
}
  1. 然后创建自定义导航栏组件,例如 custom-nav-bar.vue
html 复制代码
<template>
  <view class="custom-nav-bar">
    <view class="nav-bar-content">
      <!-- 返回按钮 -->
      <view class="back-btn" @click="handleBack" v-if="showBack">
        <image src="/static/back.png" mode="aspectFit"></image>
      </view>
      
      <!-- 标题 -->
      <view class="title">{{ title }}</view>
      
      <!-- 右侧操作 -->
      <view class="right-actions">
        <slot name="right"></slot>
      </view>
    </view>
  </view>
</template>

<script>
export default {
  props: {
    title: {
      type: String,
      default: ''
    },
    showBack: {
      type: Boolean,
      default: true
    }
  },
  methods: {
    handleBack() {
      uni.navigateBack()
    }
  }
}
</script>

<style scoped>
.custom-nav-bar {
  height: var(--status-bar-height);
  padding-top: var(--status-bar-height);
  background-color: #FFFFFF;
  box-shadow: 0 1px 6px rgba(0, 0, 0, 0.1);
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 999;
}

.nav-bar-content {
  height: 44px;
  display: flex;
  align-items: center;
  padding: 0 15px;
}

.back-btn {
  width: 24px;
  height: 24px;
  margin-right: 10px;
}

.back-btn image {
  width: 100%;
  height: 100%;
}

.title {
  flex: 1;
  text-align: center;
  font-size: 16px;
  font-weight: bold;
}

.right-actions {
  width: 24px;
  height: 24px;
  margin-left: 10px;
}
</style>
  1. 在页面中使用自定义导航栏:
html 复制代码
<template>
  <view>
    <custom-nav-bar title="我的页面" :show-back="true">
      <template #right>
        <image src="/static/share.png" mode="aspectFit"></image>
      </template>
    </custom-nav-bar>
    
    <!-- 页面内容需要设置padding-top避免被导航栏遮挡 -->
    <view class="content" :style="{paddingTop: navBarHeight}">
      页面内容...
    </view>
  </view>
</template>

<script>
import CustomNavBar from '@/components/custom-nav-bar.vue'

export default {
  components: {
    CustomNavBar
  },
  data() {
    return {
      // 计算导航栏高度(状态栏高度 + 导航栏内容高度)
      navBarHeight: `calc(var(--status-bar-height) + 44px)`
    }
  }
}
</script>

注意事项

  1. --status-bar-height 是 CSS 变量,表示状态栏高度
  2. 导航栏内容高度通常为 44px(iOS 标准)
  3. 使用自定义导航栏时,页面内容需要设置适当的 padding-top 避免被遮挡
  4. 在微信小程序中,自定义导航栏可能需要特殊处理,可以使用 uni.getSystemInfoSync() 获取状态栏高度

平台差异

  • H5:可以直接使用 CSS 实现复杂效果
  • 小程序:部分样式可能需要特殊处理,特别是状态栏高度
  • App:支持最全面的自定义能力

通过以上方法,你可以灵活地实现各种自定义头部导航栏效果。

相关推荐
Hashan7 分钟前
微信小程序:扁平化的无限级树
前端·微信小程序·uni-app
胡gh7 分钟前
面试官问你如何实现居中?别慌,这里可有的是东西bb
前端·css·面试
遂心_7 分钟前
深入响应式原理:从 Object.defineProperty 到 Proxy 的进化之路
前端·javascript
PineappleCoder7 分钟前
图解 setTimeout + 循环:var 共享变量 vs let 独立绑定
前端·javascript
季禮祥7 分钟前
你的Vite应用需要@vitejs/plugin-legacy构建Legacy包吗
前端·javascript·vite
小徐_23338 分钟前
uni-app 无法实现全局 Toast?这个方法做到了!
前端·uni-app
言兴9 分钟前
面试题之React组件通信:从基础到高级实践
前端·javascript·面试
用户36668239157319 分钟前
day06 - 表单
前端
归于尽9 分钟前
Web Workers:前端多线程解决方案
前端
阿慧勇闯大前端12 分钟前
前端面试:你说一下JS中作用域是什么东西?
前端·面试