微信小程序自定義navigationBar頂部導(dǎo)航欄俭缓,兼容適配所有機(jī)型(附完整案例)

本文首發(fā)自個(gè)人自有博客:【FaxMiao個(gè)人博客】克伊,一個(gè)關(guān)注Web前端開發(fā)技術(shù)、關(guān)注用戶體驗(yàn)华坦、記錄前端點(diǎn)滴愿吹,堅(jiān)持更多原創(chuàng),為大家提供高質(zhì)量技術(shù)博文惜姐!

前言

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"
}

讓我們看看隱藏后的效果:


image

可以看到原生的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)欄高度 + 44序仙。

實(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)欄高度 + 44
        that.globalData.navBarHeight = systemInfo.statusBarHeight + 44;
        that.globalData.menuRight = systemInfo.screenWidth - menuButtonInfo.right;
        that.globalData.menuTop = menuButtonInfo.top;
        that.globalData.menuHeight = menuButtonInfo.height;
    },
    // 數(shù)據(jù)都是根據(jù)當(dāng)前機(jī)型進(jìn)行計(jì)算爬橡,這樣的方式兼容大部分機(jī)器
    globalData: {
        navBarHeight: 0, // 導(dǎo)航欄高度
        menuRight: 0, // 膠囊距右方間距(方保持左治唤、右間距一致)
        menuTop: 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; top:{{menuTop}}px;"></input>
</view>

<!-- 占位糙申,高度與頂部欄一樣 -->
<view style="height:{{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,
        menuTop: app.globalData.menuTop,
        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è)試哦!

下面附幾張其它小程序的效果圖铐然,大家也可以嘗試照著做:


image

image

總結(jié)

  • 本文寫了自定義navigationBar的一些基礎(chǔ)性東西蔬崩,里面涉及組件用法恶座、參數(shù)傳遞、導(dǎo)航欄相關(guān)沥阳。
  • 由于測(cè)試環(huán)境有限跨琳,大家在使用時(shí)如果發(fā)現(xiàn)有什么問(wèn)題,希望及時(shí)反饋桐罕,以供及時(shí)更新幫助更多的人湾宙!
  • 大家有什么疑問(wèn),歡迎評(píng)論區(qū)留言冈绊!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末侠鳄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子死宣,更是在濱河造成了極大的恐慌伟恶,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,835評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毅该,死亡現(xiàn)場(chǎng)離奇詭異博秫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)眶掌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,900評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門挡育,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人朴爬,你說(shuō)我怎么就攤上這事即寒。” “怎么了召噩?”我有些...
    開封第一講書人閱讀 156,481評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵母赵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我具滴,道長(zhǎng)凹嘲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,303評(píng)論 1 282
  • 正文 為了忘掉前任构韵,我火速辦了婚禮周蹭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疲恢。我一直安慰自己凶朗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,375評(píng)論 5 384
  • 文/花漫 我一把揭開白布冈闭。 她就那樣靜靜地躺著俱尼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萎攒。 梳的紋絲不亂的頭發(fā)上遇八,一...
    開封第一講書人閱讀 49,729評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音耍休,去河邊找鬼刃永。 笑死,一個(gè)胖子當(dāng)著我的面吹牛羊精,可吹牛的內(nèi)容都是我干的斯够。 我是一名探鬼主播,決...
    沈念sama閱讀 38,877評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼喧锦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼读规!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起燃少,我...
    開封第一講書人閱讀 37,633評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤束亏,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后阵具,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碍遍,經(jīng)...
    沈念sama閱讀 44,088評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,443評(píng)論 2 326
  • 正文 我和宋清朗相戀三年阳液,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怕敬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,563評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡帘皿,死狀恐怖东跪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鹰溜,我是刑警寧澤越庇,帶...
    沈念sama閱讀 34,251評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站奉狈,受9級(jí)特大地震影響卤唉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仁期,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,827評(píng)論 3 312
  • 文/蒙蒙 一桑驱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跛蛋,春花似錦熬的、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,712評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至理逊,卻和暖如春橡伞,著一層夾襖步出監(jiān)牢的瞬間盒揉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,943評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工兑徘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刚盈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,240評(píng)論 2 360
  • 正文 我出身青樓挂脑,卻偏偏與公主長(zhǎng)得像藕漱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子崭闲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,435評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容