產品說小程序返回到首頁不太方便,想添加返回首頁按鈕,UI說導航欄能不能設置背景圖片,由於那樣設計挺好看的。json
這產品和UI都提需求了,咱也不能反駁哈,因此開始調研,分析可行性方案;一、能夠添加懸浮按鈕。二、自定義導航欄。
添加懸浮按鈕,是看起來是比較簡單哈,可是感受不太優雅,會佔據頁面的空間,體驗也不太好。因此想了下第二種方案,自定義導航欄既能夠實現產品的需求還能夠知足UI的設計美感,在頂部空白處加上返回首頁的按鈕,這樣和返回按鈕還對稱(最終如圖所示,頂部導航欄是個背景圖片,分兩塊組合起來)。小程序
1、實現的前提微信
一、首先查看文檔,看文檔裏關於自定義導航欄是怎麼規定的,有哪些限制;還有小程序自定義導航欄全局配置和單頁面配置的微信版本和調試庫的最低支持版本。app
二、在app.json window 增長 navigationStyle:custom ,頂部導航欄就會消失,只保留右上角膠囊狀的按鈕,如何修改膠囊的顏色呢;膠囊體目前只支持黑色和白色兩種顏色 在app.josn window 加上 "navigationBarTextStyle":"white/black"xss
三、還要考慮加返回按鈕和返回首頁的按鈕,適配不一樣的機型flex
先說下兩種配置方法:spa
①全局配置navigationStyle:設計
app.json { "usingComponents": { "navigationBar": "/components/navigationBar/navigationBar" }, "window": { "navigationStyle": "custom" } }
②單頁面配置navigationStyle調試
自定義的頁面.json { "window": { "navigationStyle": "default" } } { "navigationStyle": "custom", "usingComponents": { "navigationBar": "/components/navigationBar/navigationBar" } }
二者的區別就是,全局配置放在app.json文件裏,單頁面配置放在自定義頁面配置文件裏。
2、實現的步驟code
如下說下幾個要點:
一、自定義導航欄文本,是否顯示返回,是否顯示返回首頁,導航欄高度
二、statusBarHeight,用來獲取手機狀態欄的高度,這個須要在全局app.js中的onLaunch,調用wx.getSystemInfo獲取,navigationBarHeight+默認的高度,這個是設定整個導航欄的高度,
三、還有注意的,在寫樣式距離和大小時建議都用px,因小程序右邊的膠囊也是用的px,不是rpx。
四、由於自定義導航欄每一個頁面都要寫,因此把導航欄封裝了公共組件,這樣只須要在每一個頁面引入便可。
以下是封裝的導航欄組件:
wxml
<view class="navbar" style="{{'height: ' + navigationBarHeight}}"> <view style="{{'height: ' + statusBarHeight}}"></view> <view class='title-container'> <view class='capsule' wx:if="{{ back || home }}"> <view bindtap='back' wx:if="{{back}}"> <image src='/images/back.png'></image> </view> <view bindtap='backHome' wx:if="{{home}}"> <image src='/images/home.png'></image> </view> </view> <view class='title'>{{text}}</view> </view> </view> <view style="{{'height: ' + navigationBarHeight}};background: white;"></view>
這裏有個需注意的問題,就是通常會出現自定義導航欄,下拉頁面,導航欄也隨着會下拉,這種問題是由於設置fixed後頁面元素總體上移了navigationBarHeight,因此在此組件裏設置一個空白view元素佔用最上面的navigationBarHeight這塊高度
wxss
.navbar { width: 100%; background-color: #1797eb; position: fixed; top: 0; left: 0; z-index: 999; } .title-container { height: 40px; display: flex; align-items: center; position: relative; } .capsule { margin-left: 10px; height: 30px; background: rgba(255, 255, 255, 0.6); border: 1px solid #fff; border-radius: 16px; display: flex; align-items: center; } .capsule > view { width: 45px; height: 60%; position: relative; .capsule > view:nth-child(2) { border-left: 1px solid #fff; } .capsule image { width: 50%; height: 100%; position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%); } .title { color: white; position: absolute; top: 6px; left: 104px; right: 104px; height: 30px; line-height: 30px; font-size: 14px; text-align: center; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
js
const app = getApp() Component({ properties: { text: { type: String, value: 'Wechat' }, back: { type: Boolean, value: false }, home: { type: Boolean, value: false } }, data: { statusBarHeight: app.globalData.statusBarHeight + 'px', navigationBarHeight: (app.globalData.statusBarHeight + 44) + 'px' }, methods: { backHome: function () { let pages = getCurrentPages() wx.navigateBack({ delta: pages.length }) }, back: function () { wx.navigateBack({ delta: 1 }) } } })
json
{ "component": true, "usingComponents": {} }
最終還須要考慮下版本兼容的問題,畢竟還有一些用戶,微信版本並無更新到最新版本。首先能夠在app.js裏面獲取下當前用戶的微信版本,作下版本比較,若是小於這個版本,設置個全局變量,也能夠在組件寫個方法,在不一樣的頁面打開顯示不一樣的頂部導航欄,或者能夠控制是否顯示導航欄,這裏就不詳細說了。
親自試了下,在低於7.0版本的微信中,若是採用單頁面自定義導航欄,會出現兩個導航欄,這時候經過判斷版本號不要再渲染自定義的導航欄組件了,在頁面的配置文件裏寫上title名,還有相應的背景色,這樣就會顯示自帶的導航欄了。
小程序開發是有些坑的地方,從不支持自定義導航欄,到支持全局自定義導航欄,再到如今的支持單頁面配置,能夠看出在慢慢完善。還有底部tabbar,可本身選擇配置的太少了,雖然也支持自定義,可是發現自定義寫的底部導航組件體驗並很差,每次打開頁面都會從新渲染底部的按鈕,若是所有寫成在一個頁面裏的tab切換,雖然按鈕每次不用從新加載了,可是業務多確定不行,寫到一個單頁面裏東西也太多了。 但願微信可以多添加或放開一些功能,讓開發者更好的服務於產品,給用戶更好的體驗。