UniApp微信小程序自定義導航欄實現

UniApp微信小程序自定義導航欄

在UniApp開發微信小程序時,頁面左上角默認有一個返回按鈕(在導航欄左側),但有時我們需要自定義這個按鈕的樣式和功能,同時保持與導航欄中間的標題和右側膠囊按鈕(藥丸屏)的高度一致。

微信小程序的導航欄分為三部分:左側(返回和主頁)、中間(標題)、右側(膠囊按鈕)。自定義左側按鈕時,我們需要注意以下幾點:

  1. 微信小程序的導航欄是原生的,我們無法直接修改原生返回按鈕的樣式,因此常見的做法是隱藏原生導航欄,使用自定義導航欄。

  2. 自定義導航欄需要計算導航欄的高度,尤其是要考慮到不同機型的適配(如iPhone的劉海屏、狀態欄高度等)。

  3. 右側的膠囊按鈕(藥丸屏)的尺寸和位置是固定的,我們可以通過微信提供的API獲取其位置信息,以便讓自定義按鈕與膠囊按鈕對齊。

具體步驟如下:

1. 隱藏原生導航欄

pages.json中,設置頁面或全局的導航欄為自定義:


{"pages": [{"path": "pages/index/index","style": {"navigationStyle": "custom"  // 使用自定義導航欄}}],// 或者全局設置"globalStyle": {"navigationStyle": "custom"}}

2. 在頁面中編寫自定義導航欄

在頁面的vue文件中,我們需要自己編寫一個導航欄組件,通常放在頁面頂部。

3. 獲取狀態欄高度和膠囊按鈕位置

我們可以使用uni.getSystemInfoSync()來獲取狀態欄高度,以及使用uni.getMenuButtonBoundingClientRect()來獲取膠囊按鈕的位置信息。

示例代碼:


const systemInfo = uni.getSystemInfoSync();const menuButtonInfo = uni.getMenuButtonBoundingClientRect();// 狀態欄高度(手機頂部狀態欄區域的高度)const statusBarHeight = systemInfo.statusBarHeight;// 膠囊按鈕距離頂部的距離(通常比狀態欄高度多一點點,具體以獲取到的為準)const menuButtonTop = menuButtonInfo.top;// 導航欄高度 = 膠囊按鈕高度 + (膠囊按鈕上邊距 - 狀態欄高度) * 2// 因為膠囊按鈕上下有間隙,所以導航欄高度可以這樣計算:const navBarHeight = (menuButtonTop - statusBarHeight) * 2 + menuButtonInfo.height;// 整個自定義導航欄的高度 = 狀態欄高度 + 導航欄高度const customBarHeight = statusBarHeight + navBarHeight;

4. 布局自定義導航欄

在模板中,我們使用計算得到的高度來設置導航欄的樣式,確保高度與原生導航欄一致。

左側按鈕的位置需要與膠囊按鈕對齊(垂直方向),因此我們可以將左側按鈕的頂部設置為menuButtonTop(膠囊按鈕的頂部位置),然后通過調整上邊距或使用絕對定位來實現。

示例模板結構:


<template><view><!-- 自定義導航欄 --><view class="custom-nav" :style="{ height: customBarHeight + 'px', paddingTop: statusBarHeight + 'px' }"><!-- 左側按鈕 --><view class="left-btn" :style="{ top: menuButtonTop + 'px' }" @click="goHome"><!-- 這里可以放置自定義圖標或文字 --><image src="/static/home.png" mode="aspectFit"></image></view><!-- 中間標題 --><view class="title" :style="{ height: navBarHeight + 'px', lineHeight: navBarHeight + 'px' }">標題</view><!-- 右側通常不需要添加內容,因為膠囊按鈕是原生的,但我們也可以自定義右側內容,但要注意與膠囊按鈕的位置不重疊 --></view><!-- 頁面內容,需要設置一個上邊距,避免被導航欄覆蓋 --><view :style="{ marginTop: customBarHeight + 'px' }">... 頁面內容 ...</view></view></template>

樣式示例(使用scss):


.custom-nav {position: fixed;top: 0;left: 0;width: 100%;box-sizing: border-box;background-color: #ffffff;z-index: 999;.left-btn {position: absolute;left: 10px;height: 30px; // 膠囊按鈕的高度可以通過menuButtonInfo.height獲取,這里假設30pxdisplay: flex;align-items: center;justify-content: center;// 通過top定位垂直位置,與膠囊按鈕對齊image {width: 20px;height: 20px;}}.title {text-align: center;font-size: 16px;}}

5. 自定義按鈕的功能

goHome方法中,我們可以實現跳轉到首頁的功能:


methods: {goHome() {uni.reLaunch({url: '/pages/index/index'});}}

注意事項:

  • 由于自定義導航欄是固定在頂部的,頁面內容需要設置一個上邊距(等于自定義導航欄的高度),避免內容被導航欄覆蓋。

  • 不同機型的膠囊按鈕位置可能略有差異,所以一定要動態獲取膠囊按鈕的位置信息。

  • 在微信開發者工具中,膠囊按鈕的位置信息可能與真機有差異,建議在真機測試。

通過以上步驟,我們就可以自定義一個與中間標題和右側膠囊按鈕高度一致的左側按鈕,并實現自定義功能。

在 UniApp 開發微信小程序時,要自定義左上角返回按鈕并保持與標題欄、右側膠囊按鈕高度對齊,需使用自定義導航欄方案。以下是完整實現步驟:

核心思路
隱藏原生導航欄,使用自定義導航欄組件

精確計算布局尺寸,匹配微信膠囊按鈕位置

使用絕對定位控制自定義按鈕位置

實現步驟
1. 配置全局自定義導航欄(pages.json)

{"globalStyle": {"navigationStyle": "custom","transparentTitle": "always","navigationBarTextStyle": "black"}
}

2. 創建自定義導航欄組件(components/custom-navbar.vue)

<template><view class="custom-navbar"><!-- 狀態欄占位 --><view :style="{ height: statusBarHeight + 'px' }"></view><!-- 導航欄主體 --><view class="navbar-content" :style="{ height: navBarHeight + 'px' }"><!-- 左側自定義按鈕 --><view class="custom-home-btn" :style="btnStyle"@click="handleHomeClick"><image src="/static/home-icon.png" class="icon" /></view><!-- 標題居中 --><view class="title" :style="titleStyle">{{ title }}</view></view></view>
</template><script>
export default {props: {title: String},data() {return {statusBarHeight: 20, // 默認值navBarHeight: 44,    // 默認值menuButtonInfo: null};},computed: {// 按鈕樣式計算(核心)btnStyle() {if (!this.menuButtonInfo) return {};return {width: '30px',height: this.menuButtonInfo.height + 'px',top: this.menuButtonInfo.top + 'px'};},// 標題位置適配titleStyle() {return {height: this.menuButtonInfo.height + 'px',lineHeight: this.menuButtonInfo.height + 'px'};}},mounted() {this.initSystemInfo();},methods: {initSystemInfo() {const systemInfo = uni.getSystemInfoSync();this.statusBarHeight = systemInfo.statusBarHeight;// 獲取微信膠囊按鈕位置const menuButtonInfo = uni.getMenuButtonBoundingClientRect();this.menuButtonInfo = menuButtonInfo;// 計算導航欄高度 = 膠囊按鈕高度 + (膠囊按鈕上間距 - 狀態欄高度) * 2this.navBarHeight = menuButtonInfo.height + (menuButtonInfo.top - systemInfo.statusBarHeight) * 2;},handleHomeClick() {// 自定義按鈕功能(示例:返回首頁)uni.reLaunch({ url: '/pages/index/index' });}}
};
</script><style scoped>
.custom-navbar {position: fixed;top: 0;left: 0;right: 0;z-index: 9999;background: white;
}.navbar-content {position: relative;display: flex;justify-content: center;align-items: center;
}.custom-home-btn {position: absolute;left: 15px;display: flex;align-items: center;justify-content: center;z-index: 10;
}.icon {width: 22px;height: 22px;
}.title {font-size: 16px;font-weight: 500;max-width: 60%;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;
}
</style>

3. 在頁面中使用自定義導航欄

<template><view><!-- 引入自定義導航欄 --><custom-navbar title="我的頁面" /><!-- 頁面內容 (需要設置頂部內邊距) --><view :style="{ paddingTop: navBarTotalHeight + 'px' }"><!-- 頁面內容... --></view></view>
</template><script>
import customNavbar from '@/components/custom-navbar.vue'export default {components: { customNavbar },data() {return {// 計算:狀態欄高度 + 導航欄高度navBarTotalHeight: 64 // 默認值}},onLoad() {this.calcNavbarHeight()},methods: {calcNavbarHeight() {const systemInfo = uni.getSystemInfoSync()const menuButtonInfo = uni.getMenuButtonBoundingClientRect()this.navBarTotalHeight = systemInfo.statusBarHeight + menuButtonInfo.height + (menuButtonInfo.top - systemInfo.statusBarHeight) * 2}}
}
</script>

關鍵點說明
膠囊按鈕對齊原理:

  • 使用 uni.getMenuButtonBoundingClientRect() 獲取膠囊按鈕的精確位置信息
  • 通過公式計算導航欄高度:膠囊高度 + (膠囊上間距 - 狀態欄高度) × 2
  • 按鈕垂直定位使用膠囊按鈕的 top 值

響應式處理:

  • 不同機型適配(iPhone 劉海屏、Android 等)
  • 小程序右上角膠囊按鈕位置是固定的
  • 頁面滾動時導航欄保持固定定位

樣式定制:

  • 替換 /static/home-icon.png 為自定義圖標
  • 調整 left 值控制水平位置
  • 修改按鈕的寬高和圖標尺寸

注意事項

  1. **真機測試:**微信開發者工具中的膠囊位置與真機可能有差異
  2. **iOS 安全區域:**iPhone X 及以上機型需要處理底部安全區域
  3. **頁面滾動:**頁面內容需要設置 padding-top 避免內容被導航欄遮擋
  4. **組件復用:**建議封裝成全局組件減少重復代碼

通過此方案,自定義按鈕可以實現:

  1. 與原生膠囊按鈕完美對齊 ?
  2. 支持自定義圖標和點擊事件 ?
  3. 完美適配不同機型 ?
  4. 保持原生導航欄流暢體驗 ?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/83046.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83046.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83046.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java大師成長計劃之第35天:未來展望與個人總結

引言 作為一門歷史悠久的編程語言&#xff0c;Java自1995年問世以來&#xff0c;經歷了多個版本的迭代與演進&#xff0c;依然在當今技術生態中占據著重要地位。從早期的Java SE、Java EE到后來的Java Spring框架&#xff0c;再到現代的微服務架構與云原生應用&#xff0c;Jav…

Ubuntu開機自動運行Docker容器中的Qt UI程序

Ubuntu開機自動運行Docker容器中的Qt UI程序 引言為什么需要這樣配置?解決方案概覽詳細實現步驟1. 創建容器啟動腳本2. 創建系統服務3. 配置自動登錄和顯示設置常見問題解決方案1. 程序無法顯示(X11權限問題)2. 分辨率設置不生效3. 服務啟動失敗安全注意事項結語附錄:完整文…

Scratch節日 | 龍舟比賽 | 端午節

端午節快樂&#xff01; 這款專為孩子們打造的Scratch游戲——《龍舟比賽》&#xff0c;讓你在掌控龍舟的競速中&#xff0c;沉浸式體驗中華傳統節日的魅力&#xff01; &#x1f3ae; 游戲亮點 節日氛圍濃厚&#xff1a;化身龍舟選手&#xff0c;在波濤洶涌的河流中展開刺激競…

(五)MMA(OpenTelemetry/Rabbit MQ/ApiGateway/MongoDB)

文章目錄 項目地址一、OpenTelemetry1.1 配置OpenTelemetry1. 服務添加2. 添加服務標識3. 添加請求的標識4. 添加中間價 二、Rabbit MQ2.1 配置Rabbit MQ1. docker-compose2. 添加Rabbit MQ的Connect String 2.2 替換成Rabbit MQ1. 安裝所需要的包2. 使用 三、API Gateways3.1 …

格恩朗超聲波水表 助力農業精準灌溉與振興?

在農業現代化的征程中&#xff0c;水資源的精準利用至關重要&#xff0c;而這離不開高精度計量設備的支持。大連格恩朗品牌積極響應國家全面推進鄉村振興、加快農業農村現代化的號召&#xff0c;精心打造的超聲波水表&#xff0c;憑借其超高精度&#xff0c;成為綠色灌溉領域的…

微信小程序頁面嵌套web-view點擊系統導航返回時進行彈窗處理

實現效果&#xff1a;微信小程序頁面嵌套web-view點擊系統導航返回時進行彈窗處理 首先在web-view里是不可實現的&#xff08;據我了解下來&#xff09; 參考小程序文檔&#xff1a;page-container 大致邏輯&#xff1a; 1、page-container可實現頁面離開前攔截 2、由于web-vie…

設計模式25——中介者模式

寫文章的初心主要是用來幫助自己快速的回憶這個模式該怎么用&#xff0c;主要是下面的UML圖可以起到大作用&#xff0c;在你學習過一遍以后可能會遺忘&#xff0c;忘記了不要緊&#xff0c;只要看一眼UML圖就能想起來了。同時也請大家多多指教。 中介者模式&#xff08;Mediat…

Java基礎 Day25

一、線程通信 1、簡介 確保線程能夠按照預定的順序執行并且能夠安全地訪問共享資源 使多條線程更好的進行協同工作 2、常用方法 void wait() 使當前線程進入等待狀態 void notify(); 隨機喚醒單個等待的線程&#xff08;可以空喚醒&#xff09; void notifyAll(); 喚醒…

WebSocket與實時對話式AI服務的集成

WebSocket與實時對話式AI服務的集成 在現代對話式AI系統中,傳統的HTTP請求-響應模型已難以滿足實時交互的體驗需求。特別是用戶對響應速度、逐字輸出、會話上下文保持等方面提出更高要求時,需要一種能夠建立持久連接并支持雙向通信的協議。WebSocket正是在這一背景下,成為A…

iOS 集成網易云信IM

云信官方文檔在這 看官方文檔的時候&#xff0c;版本選擇最新的V10。 1、CocoPods集成 pod NIMSDK_LITE 2、AppDelegate.m添加頭文件 #import <NIMSDK/NIMSDK.h> 3、初始化 NIMSDKOption *mrnn_option [NIMSDKOption optionWithAppKey:"6f6568e354026d2d658a…

人工智能100問?第37問:什么是擴散模型?

目錄 ??一、通俗解釋 二、專業解析?? 三、權威參考 擴散模型是一種??通過系統性地添加再去除噪聲來生成新數據(如圖像)的生成式AI技術??,其核心機制分為兩個階段:正向擴散??:對原始數據(如清晰圖片)逐步添加噪聲,直至完全變成隨機噪點(類似老照片逐漸模糊…

傳輸層核心技術解析

目錄 一、端口號機制 二、網絡診斷工具 1. netstat命令 2. pidof工具 三、UDP協議詳解 協議特征 典型應用場景 四、TCP協議深度解析 核心機制 狀態轉換模型 特殊狀態說明 五、協議對比分析 六、開發實踐要點 一、端口號機制 核心作用&#xff1a;標識主機唯一進程…

IO Vs NIO

一、IO(傳統阻塞式) 全稱?&#xff1a;Input/Output(輸入/輸出) 定義?&#xff1a;Java 1.0 引入的基礎 I/O 模型&#xff0c;基于流&#xff08;Stream&#xff09;的同步阻塞操作&#xff0c;線程在讀寫數據時會阻塞直到操作完成。 二、NIO(新式非阻塞式) ?全…

基于原生JavaScript前端和 Flask 后端的Todo 應用

Demo地址&#xff1a;https://gitcode.com/rmbnetlife/todo-app-js-flask.git Python Todo 應用 這是一個使用Python Flask框架開發的簡單待辦事項(Todo)應用&#xff0c;采用前后端分離架構。本項目實現了待辦事項的添加、刪除、狀態切換等基本功能&#xff0c;并提供了直觀…

005 ElasticSearch 許可證過期問題

ElasticSearch 許可證過期問題 項目啟動報錯 org.elasticsearch.client.ResponseException: method [GET], host [http://127.0.0.1:9200], URI [/_cluster/health/], status line [HTTP/1.1 403 Forbidden] {"error":{"root_cause":[{"type":…

哪些崗位最易被AI替代?

隨著AI技術高速演進&#xff0c;一場“職場大洗牌”正悄然上演。當ChatGPT出口成章、機器人能精準執勤&#xff0c;AI時代的“就業焦慮”已不再是空談。你是否認真思考過&#xff0c;自己所處的崗位是否也正面臨被AI邊緣化的風險&#xff1f; 以下幾類職業&#xff0c;已成為AI…

信號槽中 sender() 的作用

好的,sender() 是 Qt 框架中的一個重要函數,它用于獲取觸發當前槽函數的對象。在 Qt 的信號和槽機制中,一個信號可以連接到多個槽函數,而一個槽函數也可以被多個信號觸發。sender() 函數允許你在槽函數中確定是哪個對象觸發了當前信號。 信號和槽機制 在 Qt 中,信號和槽…

深度學習|pytorch基本運算

【1】引言 pytorch是深度學習常用的包&#xff0c;顧名思義&#xff0c;就是python適用的torch包&#xff0c;在python里面使用時直接import torch就可以調用。 需要注意的是&#xff0c;pytorch包與電腦配置、python版本有很大關系&#xff0c;一定要仔細閱讀安裝要求、找到…

DeepSeek 賦能數字人直播帶貨:技術革新重塑電商營銷新生態

目錄 一、引言二、DeepSeek 技術探秘2.1 DeepSeek 技術原理剖析2.2 DeepSeek 與其他大模型對比優勢 三、數字人直播帶貨現狀洞察3.1 數字人直播帶貨發展歷程回顧3.2 市場規模與增長趨勢分析3.3 現存問題與挑戰探討 四、DeepSeek 在數字人直播帶貨中的應用實例4.1 交個朋友的成功…

實驗設計與分析(第6版,Montgomery)第5章析因設計引導5.7節思考題5.11 R語言解題

本文是實驗設計與分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅玨生譯) 第5章析因設計引導5.7節思考題5.11 R語言解題。主要涉及方差分析&#xff0c;正態假設檢驗&#xff0c;殘差分析&#xff0c;交互作用圖。 dataframe<-data.frame( densityc(570,565,…