赞
踩
这里使用三段论是什么为什么怎么做来阐述自定义navigationBar,如果只关心怎么做可直接跳至怎么做段落。
如果说原生导航栏的限制还不足以让你加入自定义导航栏,那么产品需求绝对是更大的推动力。
自定义导航栏除了不能自定义胶囊按钮以外,其他的范围都是程序员的掌控范围,所以使用自定义导航栏无疑可以满足产品的各种需求。
最后的计算公式为:navigationBarHeight = (胶囊按钮.top - statusBarHeight) × 2 + 胶囊按钮.height。navigationBar 距屏幕上方的距离即为navigationBarHeight。
这种计算方法在各种机型以及安卓ios都适用。
针对"wx.getMenuButtonBoundingClientRect()"获取错误或者获取数据为0的极少数情况,只能够去模拟,对于android,一般navigationBarHeight为48px,而对于ios一般为40px,所有机型的胶囊按钮高度是32px笔者也是通过网上很多的文章和自测得出的,这种误差一般可以忽略。当然最理想的就是微信可以hold住所有机型,呵呵。最后提醒一下仅以真机为准,开发者工具的bug就更多不说了。
// App.js ... onLaunch(){ const { statusBarHeight, platform } = wx.getSystemInfoSync() const { top, height } = wx.getMenuButtonBoundingClientRect() // 状态栏高度 wx.setStorageSync('statusBarHeight', statusBarHeight) // 胶囊按钮高度 一般是32 如果获取不到就使用32 wx.setStorageSync('menuButtonHeight', height ? height : 32) // 判断胶囊按钮信息是否成功获取 if (top && top !== 0 && height && height !== 0) { const navigationBarHeight = (top - statusBarHeight) * 2 + height // 导航栏高度 wx.setStorageSync('navigationBarHeight', navigationBarHeight) } else { wx.setStorageSync( 'navigationBarHeight', platform === 'android' ? 48 : 40 ) } } ...
// navigationBar.js ... data: { // 状态栏高度 statusBarHeight: wx.getStorageSync('statusBarHeight') + 'px', // 导航栏高度 navigationBarHeight: wx.getStorageSync('navigationBarHeight') + 'px', // 胶囊按钮高度 menuButtonHeight: wx.getStorageSync('menuButtonHeight') + 'px', // 导航栏和状态栏高度 navigationBarAndStatusBarHeight: wx.getStorageSync('statusBarHeight') + wx.getStorageSync('navigationBarHeight') + 'px' } ...
<!--navigationBar.wxml-->
<view class="navigation-container" style="{{'height: ' + navigationBarAndStatusBarHeight}}">
<!--空白来占位状态栏-->
<view style="{{'height: ' + statusBarHeight}}"></view>
<!--自定义导航栏-->
<view class="navigation-bar" style="{{'height:' + navigationBarHeight}}">
<view class="navigation-buttons" style="{{'height:' + menuButtonHeight}}">
<image class="nav-img" src='/images/back.svg'/>
...其余自定义button
</view>
<view class="navigation-title" style="{{'line-height:' + navigationBarHeight}}">{{title}}</view>
</view>
</view>
<!--空白占位fixed空出的位置-->
<view style="{{'height: ' + navigationBarAndStatusBarHeight}}; background: #ffffff"></view>
/* navigationBar.wxss */ .navigation-container { position: fixed; width: 100%; z-index: 99; top: 0; left: 0; background-color: #ffffff; } .navigation-bar { position: relative; display: flex; flex-direction: row; align-items: center; } .navigation-buttons { display: flex; align-items: center; margin-left: 10px; border: 1px solid rgba(0, 0, 0, 0.05); box-sizing: border-box; border-radius: 15px; background-color: transparent; } .nav-img{ height: 16px; width: 16px; } .navigation-title { position: absolute; left: 104px; right: 104px; text-align: center; font-size: 16px; font-weight: bold; color: #000000; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。