赞
踩
如果说原生导航栏的限制还不足以让你加入自定义导航栏,那么产品需求绝对是更大的推动力。
自定义导航栏除了不能自定义胶囊按钮以外,其他的范围都是程序员的掌控范围,所以使用自定义导航栏无疑可以满足产品的各种需求。
图1
图2
最后的计算公式为:navigationBarHeight = (胶囊按钮.top - statusBarHeight) × 2 + 胶囊按钮.height。navigationBar 距屏幕上方的距离即为navigationBarHeight。
这种计算方法在各种机型以及安卓ios都适用。
针对"wx.getMenuButtonBoundingClientRect()"获取错误或者获取数据为0的极少数情况,只能够去模拟,对于android,一般navigationBarHeight为48px,而对于ios一般为40px,所有机型的胶囊按钮高度是32px笔者也是通过网上很多的文章和自测得出的,这种误差一般可以忽略。当然最理想的就是微信可以hold住所有机型,呵呵。最后提醒一下仅以真机为准,开发者工具的bug就更多不说了。
获取本机信息,笔者一般写在App的onLaunch中。
- // App.js
- ...
- onLaunch(){
- const { statusBarHeight, platform, windowHeight }=wx.getSystemInfoSync()
- const { top, height } = wx.getMenuButtonBoundingClientRect()
- // 状态栏高度
- wx.setStorageSync('statusBarHeight', statusBarHeight)
- // 屏幕高度
- wx.setStorageSync('windowHeight', windowHeight)
- // 胶囊按钮高度 一般是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'
- }
- ...
- <!--Components/navigationBar.wxml-->
- <view class="navigation-container" style="{{'height: ' + navigationBarAndStatusBarHeight}}">
- <!--空白来占位状态栏-->
- <view style="{{'height: ' + statusBarHeight}}"></view>
- <!--自定义导航栏-->
- <view class="navigation-bar" style="{{'height:' + navigationBarHeight}}">
- <image class="nav-img" src='/icon/edit.png' />
- <view class="navigation-title" style="{{'line-height:' + navigationBarHeight}}">{{title}}</view>
- </view>
- </view>
- <!--空白占位fixed空出的位置-->
- <view style="{{'height: ' + navigationBarAndStatusBarHeight}}"></view>
navigationBar.wxss
- /* Components/navigationBar.wxss */
- .navigation-container {
- position: fixed;
- width: 100%;
- z-index: 99;
- top: 0;
- left: 0;
- }
-
- .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: 22px;
- margin-left: 28rpx;
- width: 22px;
- }
-
- .navigation-title {
- position: absolute;
- left: 104rpx;
- right: 104rpx;
- text-align: center;
- font-size: 16px;
- font-weight: bold;
- color: #ffffff;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。