微信小程序自定義navigationBar頂部導(dǎo)航欄適配所有機(jī)型(附完整案例)
前言
navigationBar相信大家都不陌生把?今天我們就來(lái)說(shuō)說(shuō)自定義navigationBar,把它改變成我們想要的樣子(搜索框+膠囊、搜索框+返回按鈕+膠囊等)。
思路
- 隱藏原生樣式
- 獲取膠囊按鈕、狀態(tài)欄相關(guān)數(shù)據(jù)以供后續(xù)計(jì)算
- 根據(jù)不同機(jī)型計(jì)算出該機(jī)型的導(dǎo)航欄高度,進(jìn)行適配
- 編寫新的導(dǎo)航欄
- 引用到頁(yè)面
正文
一、隱藏原生的navigationBar
window全局配置里有個(gè)參數(shù):navigationStyle(導(dǎo)航欄樣式),default=默認(rèn)樣式,custom=自定義樣式。
"window": { "navigationStyle": "custom" }
讓我們看看隱藏后的效果:
可以看到原生的navigationBar已經(jīng)消失了,剩下孤零零的膠囊按鈕,膠囊按鈕是無(wú)法隱藏的。
二、準(zhǔn)備工作
1.獲取膠囊按鈕的布局位置信息
我們用wx.getMenuButtonBoundingClientRect() 【官方文檔】 獲取膠囊按鈕的布局位置信息,坐標(biāo)信息以屏幕左上角為原點(diǎn):
const menuButtonInfo = wx.getMenuButtonBoundingClientRect();
width | height | top | right | bottom | left |
---|---|---|---|---|---|
寬度 | 高度 | 上邊界坐標(biāo) | 右邊界坐標(biāo) | 下邊界坐標(biāo) | 左邊界坐標(biāo) |
下面是官方給的示意圖,方便大家理解幾個(gè)坐標(biāo)。
2.獲取系統(tǒng)信息
用wx.getSystemInfoSync() 【官方文檔】 獲取系統(tǒng)信息,里面有個(gè)參數(shù):statusBarHeight(狀態(tài)欄高度),是我們后面計(jì)算整個(gè)導(dǎo)航欄的高度需要用到的。
const systemInfo = wx.getSystemInfoSync();
三、計(jì)算公式
我們先要知道導(dǎo)航欄高度是怎么組成的, 計(jì)算公式: 導(dǎo)航欄高度 = 狀態(tài)欄到膠囊的間距(膠囊距上距離-狀態(tài)欄高度) * 2 + 膠囊高度 + 狀態(tài)欄高度 。
實(shí)例 【源碼下載】
自定義導(dǎo)航欄會(huì)應(yīng)用到多個(gè)、甚至全部頁(yè)面,所以封裝成組件,方便調(diào)用;下面是我寫的一個(gè)簡(jiǎn)單例子:
app.js
App({ onLaunch: function(options) { const that = this; // 獲取系統(tǒng)信息 const systemInfo = wx.getSystemInfoSync(); // 膠囊按鈕位置信息 const menuButtonInfo = wx.getMenuButtonBoundingClientRect(); // 導(dǎo)航欄高度 = 狀態(tài)欄到膠囊的間距(膠囊距上距離-狀態(tài)欄高度) * 2 + 膠囊高度 + 狀態(tài)欄高度 that.globalData.navBarHeight = (menuButtonInfo.top - systemInfo.statusBarHeight) * 2 + menuButtonInfo.height + systemInfo.statusBarHeight; that.globalData.menuRight = systemInfo.screenWidth - menuButtonInfo.right; that.globalData.menuBotton = menuButtonInfo.top - systemInfo.statusBarHeight; that.globalData.menuHeight = menuButtonInfo.height; }, // 數(shù)據(jù)都是根據(jù)當(dāng)前機(jī)型進(jìn)行計(jì)算,這樣的方式兼容大部分機(jī)器 globalData: { navBarHeight: 0, // 導(dǎo)航欄高度 menuRight: 0, // 膠囊距右方間距(方保持左、右間距一致) menuBotton: 0, // 膠囊距底部間距(保持底部間距一致) menuHeight: 0, // 膠囊高度(自定義內(nèi)容可與膠囊高度保證一致) } })
app.json
{ "pages": [ "pages/index/index" ], "window": { "navigationStyle": "custom" }, "sitemapLocation": "sitemap.json" }
下面為組件代碼: /components/navigation-bar/navigation-bar.wxml
<!-- 自定義頂部欄 --> <view class="nav-bar" style="height:{{navBarHeight}}px;"> <input class="search" placeholder="輸入關(guān)鍵詞!" style="height:{{menuHeight}}px; min-height:{{menuHeight}}px; line-height:{menuHeight}}px; left:{{menuRight}}px; bottom:{{menuBotton}}px;"></input> </view> <!-- 內(nèi)容區(qū)域: 自定義頂部欄用的fixed定位,會(huì)遮蓋到下面內(nèi)容,注意設(shè)置好間距 --> <view class="content" style="margin-top:{{navBarHeight}}px;"></view>
/components/navigation-bar/navigation-bar.json
{ "component": true }
/components/navigation-bar/navigation-bar.js
const app = getApp() Component({ properties: { // defaultData(父頁(yè)面?zhèn)鬟f的數(shù)據(jù)-就是引用組件的頁(yè)面) defaultData: { type: Object, value: { title: "我是默認(rèn)標(biāo)題" }, observer: function(newVal, oldVal) {} } }, data: { navBarHeight: app.globalData.navBarHeight, menuRight: app.globalData.menuRight, menuBotton: app.globalData.menuBotton, menuHeight: app.globalData.menuHeight, }, attached: function() {}, methods: {} })
/components/navigation-bar/navigation-bar.wxss
.nav-bar{ position: fixed; width: 100%; top: 0; color: #fff; background: #000;} .nav-bar .search{ width: 60%; color: #333; font-size: 14px; background: #fff; position: absolute; border-radius: 50px; background: #ddd; padding-left: 14px;}
以下是調(diào)用頁(yè)面的代碼,也就是引用組件的頁(yè)面: /pages/index/index.wxml
navigation-bar default-data="{{defaultData}}"></navigation-bar>
/pages/index/index.json
{ "usingComponents": { "navigation-bar": "/components/navigation-bar/navigation-bar" } }
/pages/index/index.js
const app = getApp(); Page({ data: { // 組件參數(shù)設(shè)置,傳遞到組件 defaultData: { title: "我的主頁(yè)", // 導(dǎo)航欄標(biāo)題 } }, onLoad() { console.log(this.data.height) } })
效果圖:
好了,以上就是全部代碼了,大家可以文中復(fù)制代碼,也可以 【下載源碼】
,直接到開發(fā)者工具里運(yùn)行,記得appid用自己的或者測(cè)試哦!
下面附幾張其它小程序的效果圖,大家也可以嘗試照著做:
總結(jié)
本文寫了自定義navigationBar的一些基礎(chǔ)性東西,里面涉及組件用法、參數(shù)傳遞、導(dǎo)航欄相關(guān)。
由于測(cè)試環(huán)境有限,大家在使用時(shí)如果發(fā)現(xiàn)有什么問(wèn)題,希望及時(shí)反饋,以供及時(shí)更新幫助更多的人!
到此這篇關(guān)于微信小程序自定義navigationBar頂部導(dǎo)航欄適配所有機(jī)型(附完整案例)的文章就介紹到這了,更多相關(guān)小程序navigationBar頂部導(dǎo)航欄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于JavaScript中JSON的5個(gè)小技巧分享
這篇文章主要和大家分享五個(gè)JavaScript中的JSON技巧,例如:隱藏字符串化數(shù)據(jù)中的某些屬性、創(chuàng)建自定義輸出格式等,感興趣的小伙伴可以了解一下2022-03-03微信小程序中data-key屬性之?dāng)?shù)據(jù)傳輸(經(jīng)驗(yàn)總結(jié))
這篇文章主要介紹了微信小程序中data-key屬性:數(shù)據(jù)傳輸,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08JS實(shí)現(xiàn)下拉菜單列表與登錄注冊(cè)彈窗效果
下面小編就為大家?guī)?lái)一篇JS實(shí)現(xiàn)下拉菜單列表與登錄注冊(cè)彈窗效果。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08List the UTC Time on a Computer
List the UTC Time on a Computer...2007-06-06js以分隔符分隔數(shù)組中的元素并轉(zhuǎn)換為字符串的方法
下面小編就為大家?guī)?lái)一篇js以分隔符分隔數(shù)組中的元素并轉(zhuǎn)換為字符串的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11Javascript 數(shù)組添加 shuffle 方法的實(shí)現(xiàn)代碼
PHP 里面有個(gè)非常方便的打亂數(shù)組的函數(shù) shuffle() ,這個(gè)功能在許多情況下都會(huì)用到,但 javascript 的數(shù)組卻沒(méi)有這個(gè)方法,沒(méi)有不要緊,可以擴(kuò)展一個(gè),自己動(dòng)手,豐衣足食嘛。2009-09-09