在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
十年河东,十年河西,莫欺少年穷 学无止境,精益求精 鄙人最初Net程序猿一枚,因被逼,自学了物联网及网络编程,又被逼,逐又自学了VUE及React,后又被逼,做起了小程序开发 人呐,都是被逼出来的 为什么要自定义navigationBar?原生导航栏的限制
navigationBar是什么?
小程序布局
自定义navigationBar怎么做?去掉原生导航栏。
计算navigationBarHeight。
代码实现
App.JS ,鄙人将获取到的相关信息存放在了全局数据中 【APPJS中判断了是否是分享进来的场景值,如果是分享进来的,则不显示返回按钮】 场景值可参考:https://developers.weixin.qq.com/miniprogram/dev/reference/scene-list.html import { request } from "./Request/Request"; App({ globalData: { statusBarHeight: 0, //状态栏高度 menuButtonHeight: 0, //胶囊按钮高度 navigationBarHeight: 0, //计算得出的导航栏高度 navigationBarAndStatusBarHeight: 0, //导航栏和状态栏高度之和 platform: "", //手机型号 android 或 IOS isShare:false //是否由分享而来 }, request: request, /** * 当小程序初始化完成时,会触发 onLaunch(全局只触发一次) */ onLaunch: function (options) { let that = this; // 判断是否由分享进入小程序 从分享进入小程序时 返回上一级按钮不应该存在 if (options.scene == 1007 || options.scene == 1008) { tthathis.globalData.isShare = true; } else { that.globalData.isShare = false; }; const { statusBarHeight, platform } = wx.getSystemInfoSync();//获取系统信息 const { top, height } = wx.getMenuButtonBoundingClientRect(); console.log(wx.getSystemInfoSync()) that.globalData.platform=platform; //状态栏高度 that.globalData.statusBarHeight = statusBarHeight; // 胶囊按钮高度 一般是32px 如果获取不到就使用32px that.globalData.menuButtonHeight = height ? height : 32; // 判断胶囊按钮信息是否成功获取 if (top && top !== 0 && height && height !== 0) { // 导航栏高度 that.globalData.navigationBarHeight = (top - statusBarHeight) * 2 + height } else { //个别手机获取不到 根据机型进行赋值 that.globalData.navigationBarHeight = platform === 'android' ? 48 : 40 } //用于绝对定位 占用空间 that.globalData.navigationBarAndStatusBarHeight= that.globalData.navigationBarHeight+that.globalData.statusBarHeight; }, /** * 当小程序启动,或从后台进入前台显示,会触发 onShow */ onShow: function (options) { }, /** * 当小程序从前台进入后台,会触发 onHide */ onHide: function () { }, /** * 当小程序发生脚本错误,或者 api 调用失败时,会触发 onError 并带上错误信息 */ onError: function (msg) { } }) App.Json 中 window 配置 【切莫将背景色设置为黑色,否则时间,电量等信息显示不出来】 "window":{ "navigationBarBackgroundColor": "#FFF", "navigationBarTitleText": "陈大六的小程序", "navigationBarTextStyle":"black", "enablePullDownRefresh":true, "backgroundTextStyle":"dark", "onReachBottomDistance":100 },
在组件Components中创建 navigationBar 文件夹及 navigationBar 组件 navigationBar.js var app = getApp(); Component({ /** * 组件的属性列表 */ properties: { title: { //导航栏标题 type: String, value: "wecaht" }, navigationtype: { //跳转方式 type: String, value: "navigateTo" }, navigationurl: { //URL type: String, value: "/pages/index/index" } }, /** * 组件的初始数据 */ data: { //是否是分享页面 由分享而来 不展示返回按钮 isShare: app.globalData.isShare, // 状态栏高度 statusBarHeight: app.globalData.statusBarHeight + 'px', // 导航栏高度 navigationBarHeight: app.globalData.navigationBarHeight + 'px', // 胶囊按钮高度 menuButtonHeight: app.globalData.menuButtonHeight + 'px', // 导航栏和状态栏高度 navigationBarAndStatusBarHeight: app.globalData.navigationBarAndStatusBarHeight + 'px' }, /** * 组件的方法列表 */ methods: { GoBack(e) { let that=this; let url=e.currentTarget.dataset.navigationurl; //console.log(e) if (e.currentTarget.dataset.navigationtype == "navigateTo") { wx.navigateTo({ url: url, }) } if (e.currentTarget.dataset.navigationtype== "navigateBack") { wx.navigateBack({ url: url, }) } } } }) .navigationBar.wxml 【分享进来的页面,不显示返回按钮】
代码如下: <!--navigationBar.wxml--> <view class="navigation-container" style="{{'height: ' + navigationBarAndStatusBarHeight}}"> <!--空白来占位状态栏--> <view style="{{'height: ' + statusBarHeight}}"></view> <!--自定义导航栏--> <view class="navigation-bar" style="{{'height:' + navigationBarHeight}}"> <view bindtap="GoBack" data-navigationtype="{{navigationtype}}" data-navigationurl="{{navigationurl}}" class="navigation-buttons" style="{{'height:' + menuButtonHeight}}"> <image wx:if="{{!isShare}}" class="nav-img" src='/pages/images/reback.png' mode="widthFix"/> </view> <view class="navigation-title" style="{{'line-height:' + navigationBarHeight}}">{{title}}</view> </view> </view> <!--空白占位,填充定位造成的空间飘逸--> <view style="{{'height: ' + navigationBarAndStatusBarHeight}}"></view> .navigationBar.wxml 样式如下: /* navigationBar.wxss */ .navigation-container { position: fixed; width: 100%; z-index: 9999999; 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; box-sizing: border-box; background-color: transparent; width: 68rpx; } .statusbarClas { background: transparent; color:black; } .nav-img { width: 16rpx; } .navigation-title { position: absolute; left: 104px; right: 104px; text-align: center; font-size: 30rpx; color: #000000; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: 楷体; } 外部页面引用该组件如下, .Json文件,引入组件 { "usingComponents": { "navigationBar":"../Components/navigationBar/navigationBar" }, "navigationStyle":"custom" } 注意添加属性:"navigationStyle":"custom" 代表我们要自定义组件 .wxss文件,样式如下: /* packageA/component/successlv.wxss */ .table{ width: 100%; /* width: calc(100% - 52rpx); */ /* height: calc(100vh - 450rpx); */ height: 540rpx; box-sizing: border-box; /* padding: 0 26rpx; */ /* margin-left: 26rpx; */ background-color: #fff; } .dxBox{ height: 128rpx; width: 100%; margin-top: 24rpx; display: flex; justify-content: space-between; align-items: center; background-color: #fff; font-size: 28rpx; color: #303133; font-weight: 600; font-family: PingFangSC; padding: 0 40rpx 0 40rpx; box-sizing: border-box; } .wxml代码如下: <navigationBar title="自定义导航栏" navigationtype="navigateTo" navigationurl="/pages/echarts/echarts"></navigationBar> <view class="dxBox"> <view>{{title}}</view> <view style="color:#727273">今日:2358次</view> </view> 最终效果如下:
自定义组件中需要父页面传值 Title 、navigationtype 、 navigationurl 三个属性,用来展示导航标题、 跳转方式、跳转地址。 以上便是鄙人封装的自定义导航栏 参考博客: https://www.cnblogs.com/lst619247/p/13255097.html https://www.jianshu.com/p/7393c800ba09 @天才卧龙的博客 |
请发表评论