当前位置:首页 >> 网络编程

微信小程序自定义头部导航栏和导航栏背景图片 navigationStyle问题

这两天因为要做一个带背景的小程序头,哭了,小程序导航栏有背景也就算了,还得让导航栏上的背景顺下来,心态小崩。现在可以单独设置一个页面的小程序头了,但是前提是要微信7.0以上的版本,考虑到兼容性问题,还是不要贸然的上了,所以用老版本的替换所有页面的小程序头来做。

"text-align: center">微信小程序自定义头部导航栏和导航栏背景图片 navigationStyle问题

原理其实就是通过将原来的头禁用,然后PAGE自然而然的顶上去以后,定义一个头的组件,将他设置成fixed布局固定在原来头的部分,然后给page加上Margin-top,所以还原原来的感觉。背景待会再说。

1.app配置

"htmlcode">

"window": {
 "navigationStyle": "custom"
}, 
"disableScroll": true

"htmlcode">

// app.js

App({
 globalData: {
 statusBarHeight: wx.getSystemInfoSync()['statusBarHeight']
 },
 // 判断是否由分享进入小程序
 if (e.scene == 1007 || e.scene == 1008) {
  this.globalData.share = true
 } else {
  this.globalData.share = false
 }
 //获取设备顶部窗口的高度(不同设备窗口高度不一样,根据这个来设置自定义导航栏的高度)
 //这个最初我是在组件中获取,但是出现了一个问题,当第一次进入小程序时导航栏会把
 //页面内容盖住一部分,当打开调试重新进入时就没有问题,这个问题弄得我是莫名其妙
 //虽然最后解决了,但是花费了不少时间
 wx.getSystemInfo({
  success: res => {
  this.globalData.height = res.statusBarHeight
  }
 })
 },
 globalData: {
 userInfo: null,
 share: false, // 分享默认为false
 height: 0 // 顶部高度
 }
})

在app.wxss给page加一个高度百分之百。

/* app.wxss */
page {
 height: 100%;
}

"color: #ff0000">2.组件配置

组件结构:

微信小程序自定义头部导航栏和导航栏背景图片 navigationStyle问题

放源码吧

// navbar.wxml

<view class='nav-wrap' style='height: {{height*2 + 20}}px;'>
 <!-- 导航栏背景图片 -->
 <image class="backgroundimg" src="/UploadFiles/2021-04-02/{{navbarData.address}}">

CSS:

/* navbar.wxss */

/* 顶部要固定定位 标题要居中 自定义按钮和标题要和右边微信原生的胶囊上下对齐 */
.nav-wrap {
 /* display: none; */
 position: fixed;
 width: 100%;
 top: 0;
 background: #fff;
 color: #000;
 z-index: 9999999;
 background: #000;
 overflow: hidden;
}
/* 背景图 */
.backgroundimg {
 position: absolute;
 z-index: -1;
}
/* 标题要居中 */
.nav-title {
 position: absolute;
 text-align: center;
 max-width: 400rpx;
 overflow: hidden;
 text-overflow: ellipsis;
 white-space: nowrap;
 top: 0;
 left: 0;
 right: 0;
 bottom: 0;
 margin: auto;
 font-size: 36rpx;
 color: #2c2b2b;
 font-weight: 450;
}

.nav-capsule {
 display: flex;
 align-items: center;
 margin-left: 30rpx;
 width: 140rpx;
 justify-content: space-between;
 height: 100%;
}

.back-pre {
 width: 32rpx;
 height: 36rpx;
 margin-top: 4rpx;
 padding: 10rpx;
}
.nav-capsule {
 width: 36rpx;
 height: 40rpx;
 margin-top: 3rpx;
}

在JSON里声明我是个组件

{
 "component": true,
 "usingComponents": {}
}

最后是js。

const app = getApp()
Component({
 properties: {
 navbarData: {
  //navbarData 由父页面传递的数据,变量名字自命名
  type: Object,
  value: {},
  observer: function(newVal, oldVal) {}
 }
 },
 data: {
 height: '',
 //默认值 默认显示左上角
 navbarData: {
  showCapsule: 1
 },
 imageWidth: wx.getSystemInfoSync().windowWidth, // 背景图片的高度
 imageHeight: '' // 背景图片的长度,通过计算获取
 },
 attached: function() {
 // 获取是否是通过分享进入的小程序
 this.setData({
  share: app.globalData.share
 })
 // 定义导航栏的高度 方便对齐
 this.setData({
  height: app.globalData.height
 })
 },
 methods: {
 // 返回上一页面
 _navback() {
  wx.navigateBack()
 },
 // 计算图片高度
 imgLoaded(e) {
  this.setData({
  imageHeight:
   e.detail.height *
   (wx.getSystemInfoSync().windowWidth / e.detail.width)
  })
 }
 //返回到首页
 // _backhome() {
 // wx.switchTab({
 //  url: '/pages/index/index'
 // })
 // }
 }
})

大概就是这么多,怎么在页面上用呢

3.具体页面配置

"htmlcode">

<nav-bar navbar-data='{{nvabarData}}'></nav-bar>
<scroll-view scroll-y style="height: 100%;">
 <view class="scroll-view-item" style='padding-top: {{height}}px;'>我是内容</view>
</scroll-view>

页面的JSON,navigationBarTextStyle是用来配置胶囊颜色的,因为胶囊是微信给的,不能自定义,只能改颜色,所以委屈一下从这里改一下吧

{
 "usingComponents": {
 "nav-bar": "../../components/navbar/navbar"
 },
 "navigationBarTextStyle": "white"
}

页面JS,图片自己填上地址就好了。注意getApp()不要省。

const app = getApp()
Page({
 data: {
  // 导航头组件所需的参数
  nvabarData: {
   showCapsule: 1, //是否显示左上角图标  1表示显示  0表示不显示
   title: '标题', //导航栏 中间的标题
   white: true, // 是就显示白的,不是就显示黑的。
   address: '../../images/蒙版组 1@2x.png' // 加个背景 不加就是没有
  },
  // 导航头的高度
  height: app.globalData.height * 2 + 20
 }
})

4.存在的问题

上拉刷新

"color: #ff0000">5.踩的坑

"color: #ff0000">总结

以上所述是小编给大家介绍的微信小程序自定义头部导航栏和导航栏背景图片 navigationStyle问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!