先說一下我的需求吧,因為我們的小程式是巢狀了webview。 點選webview裡面的專案,點的層級太深,使用者後退很麻煩。然後pm又找了一個自定義的導航的小程式,發現別人可以,然後我就開始研究。
小程式自定義導航欄開發注意點與參考文件
- 開一個專案採集裝置的screenHeight,windowHeight,pixelRatio等資訊到一個資料庫中
- 微信提供這樣一個資料庫便於計算,或者微信優化自定義標題欄(譬如通知欄可以改變顏色但不要算在自定義範圍內,給出膠囊寬高到通知欄距離到右側螢幕邊框距離等相關引數)
非自定義導航欄高度怎麼計算?
- wx.getSystemInfo 和 wx.getSystemInfoSync 獲取機器資訊
- screenHeight – windowHeight 計算標題欄高度
- 標題欄高度
- `iPhone`: 64,
- `iPhone X`: 88,
- `android`: 68
—— 不完全統計(ip6 , ip5 , ip6p , ipx , 小米mix2 , 小米5等綜合了開發工具提供的資料和真機資料)所得
有了這些從網上找到的資料,還有名叫貓圈的小程式的例子。開始程式碼實現了。
配置
"window": {
"navigationBarBackgroundColor": "#fff",
"navigationBarTextStyle": "black",
"backgroundColor": "#fff",
"navigationStyle": "custom"
},複製程式碼
這裡navigationStyle 配置修改之後就只剩一個膠囊按鈕,也就意味著所有頁面的導航都的自定義實現,你可以選擇模版或者元件來開發,這裡我是選擇用的元件開發。
然後定義導航的各個數值,我是在app。js 裡面定義的
title_height: "64",
statusbarHeight: "24",
titleIcon_height: "32",
titleIcon_width: "87",
title_top: "24",
title_text: "xxx", // iphone X + 24
prefix: 24
複製程式碼
元件
wxml的程式碼
<view>
<view class="title" style="height:{{title_height}}px;padding-top:{{statusbarHeight}}px;background-color:{{isIndex?`#175dc6`:`#fff`}}">
<view class="title_text" style="color:{{isIndex?`#fff`:`#000`}}">{{title_text}}</view>
<view wx:if="{{isShow}}" class="title_icon" style="top:{{title_top}}px;height:{{titleIcon_height}}px;width:{{titleIcon_width}}px;background-color:{{isIndex?`#175dc6`:`#fff`}}">
<image bindtap="_goBack" class="floatL" src="/img/fanhui_icon.png"></image>
<view class="floatL"></view>
<image bindtap="_goHome" src="/img/home_icon.png"></image>
</view>
</view>
<view style=`height:{{title_height}}px;`></view>
</view>複製程式碼
wxss的程式碼
.title { width: 100%; background-color: #175dc6; box-sizing: border-box; position: fixed; transform: translateZ(0); z-index: 999990;}
.title_text { text-align: center; font-size: 37rpx; color: #fff; line-height: 44px;}
.title_icon { background-color: #175dc6; position: fixed; top: 54rpx; left: 16rpx; border-radius: 64rpx; box-sizing: border-box; border: 0.5px solid #ebe48e; display: flex;}
.title_icon image { height: 20px; width: 20px; padding-top: 5px; display: inline-block; overflow: hidden;}
.title_icon view { height: 18px; border-left: 1px solid #bfb973; margin-top: 6px;}
.floatL { float: left;}
.title_icon image:nth-of-type(1), .title_icon image:nth-of-type(2) { padding-right: 10px; padding-bottom: 10px; padding-left: 10px;}複製程式碼
js的程式碼
const app = getApp();
Component({
properties: {
isShow: { // 是否顯示後退按鈕
type: String,
value: "1"
},
isIndex: { // 是否主頁
type: Boolean,
value: false,
},
title_height: { //
type: String,
value: app.config.title_height,
},
titleIcon_height: {
type: String,
value: app.config.titleIcon_height,
},
titleIcon_width: {
type: String,
value: app.config.titleIcon_width,
},
statusbarHeight: {
type: String,
value: app.config.statusbarHeight,
},
title_top: {
type: String,
value: app.config.title_top,
},
title_text: {
type: String,
value: app.config.title_text,
},
},
methods: {
_goBack: function() {
wx.navigateBack({
delta: 1
});
},
_goHome: function() {
wx.switchTab({
url: "/pages/index/index"
});
}
}
})複製程式碼
這樣元件就寫好了 只需要在你每個頁面裡面用這個元件傳不同的值就可以了。
應用
<header isIndex="true" title_text="首頁" isShow=""></header> 在首頁的wxml應用。
json 檔案裡面的配置
"navigationBarTitleText": "啦啦啦",
"navigationBarBackgroundColor": "#175dc6",
"usingComponents": {
"header": "/components/layout/header/header"
}複製程式碼
效果如圖
適配上可能會有點問題,希望大神有更好的解決方案,告訴我喲。
一步步記錄自己的踩坑歷程~我要做到我技術不是最好的,但我給你總結的小程式的東西是最簡單粗暴的哈哈哈
謝謝 評論區的小夥伴 提醒:客戶端 6.7.2 版本開始,navigationStyle: custom 對 <web-view> 元件無效。
我的部落格
? 送我一朵小發發~
這個程式碼的排版我服了,懶得搞了,我會發到部落格上讓大家看的。
還有一些我總結的小程式的筆記分享 送給寫小程式的你~