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:支持最全面的自定义能力

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

相关推荐
destinying13 分钟前
性能优化之实战指南:让你的 Vue 应⽤跑得飞起
前端·javascript·vue.js
徐小夕2 小时前
JitWord Office预览引擎:如何用Vue3+Node.js打造丝滑的PDF/Excel/PPT嵌入方案
前端·vue.js·github
晴殇i2 小时前
揭秘JavaScript中那些“不冒泡”的DOM事件
前端·javascript·面试
孟陬2 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
BER_c2 小时前
前端权限校验最佳实践:一个健壮的柯里化工具函数
前端·javascript
兆子龙2 小时前
别再用 useState / data 管 Tabs 的 activeKey 了:和 URL 绑定才香
前端·架构
sudo_jin2 小时前
前端包管理器演进史:为什么 npm 之后,Yarn 和 pnpm 成了新宠?
前端·npm
敲敲敲敲暴你脑袋3 小时前
写个添加注释的vscode插件
javascript·typescript·visual studio code
叁两3 小时前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent
golang学习记3 小时前
GitLens 十大神技:彻底改变你在 VS Code 中的 Git 工作流
前端·后端·visual studio code