你還在發愁小程序自定義導航欄嗎?

先說一下個人需求吧,由於咱們的小程序是嵌套了webview。 點擊webview裏面的項目,點的層級太深,用戶後退很麻煩。而後pm又找了一個自定義的導航的小程序,發現別人能夠,而後我就開始研究。javascript


小程序自定義導航欄開發注意點與參考文檔

  • 微信官方設計指導中關於膠囊按鈕的描述 由此推測膠囊寬度87pt=116px,設置以後,的確能產生較好的兼容性效果
  • [2018-07-06]根據測試截圖發現微信膠囊寬度應該在96px左右,還有待研究
  • 社區相關Q&A:自定義標題欄高度計算
  • 使用時注意方法與屬性版本兼容性
  • 完善之路:
    1. 開一個項目採集設備的screenHeight,windowHeight,pixelRatio等信息到一個數據庫中
    2. 微信提供這樣一個數據庫便於計算,或者微信優化自定義標題欄(譬如通知欄能夠改變顏色但不要算在自定義範圍內,給出膠囊寬高到通知欄距離到右側屏幕邊框距離等相關參數)

    非自定義導航欄高度怎麼計算?

    1. wx.getSystemInfo 和 wx.getSystemInfoSync 獲取機器信息
    2. screenHeight - windowHeight 計算標題欄高度
    3. 標題欄高度
    • 'iPhone': 64,
    • 'iPhone X': 88,
    • 'android': 68

    —— 不徹底統計(ip6 , ip5 , ip6p , ipx , 小米mix2 , 小米5等綜合了開發工具提供的數據和真機數據)所得java

    有了這些從網上找到的資料,還有名叫貓圈的小程序的例子。開始代碼實現了。

    配置

    "window": {        
            "navigationBarBackgroundColor": "#fff",        
            "navigationBarTextStyle": "black",       
            "backgroundColor": "#fff",        
            "navigationStyle": "custom"    
        },複製代碼

    這裏navigationStyle 配置修改以後就只剩一個膠囊按鈕,也就意味着全部頁面的導航都的自定義實現,你能夠選擇模版或者組件來開發,這裏我是選擇用的組件開發。android

    而後定義導航的各個數值,我是在app。js 裏面定義的web

    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的代碼json

    .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"            
                });        
                }    
            }
    })複製代碼

    這樣組件就寫好了  只須要在你每一個頁面裏面用這個組件傳不一樣的值就能夠了。bash

    應用

    <header isIndex="true" title_text="首頁" isShow=""></header> 在首頁的wxml應用。
    json 文件裏面的配置  
            "navigationBarTitleText": "啦啦啦",  
            "navigationBarBackgroundColor": "#175dc6",  
            "usingComponents": {    
                    "header": "/components/layout/header/header"  
            }複製代碼

    效果如圖



    適配上可能會有點問題,但願大神有更好的解決方案,告訴我喲。微信

    一步步記錄本身的踩坑歷程~我要作到我技術不是最好的,但我給你總結的小程序的東西是最簡單粗暴的哈哈哈app

    謝謝 評論區的小夥伴 提醒:客戶端 6.7.2 版本開始,navigationStyle: custom 對 <web-view> 組件無效。

    個人博客

    🎉 送我一朵小發發~

    這個代碼的排版我服了,懶得搞了,我會發到博客上讓你們看的。

    還有一些我總結的小程序的筆記分享 送給寫小程序的你~

    相關文章
    相關標籤/搜索