(转载)微信小程序自定义头部导航栏

本文详细介绍了如何在微信小程序中自定义导航栏,包括不显示左侧按钮、分享页面隐藏返回按钮、设置返回层级、字体和背景颜色以及左右按钮样式的切换。通过创建组件并设置相应属性,实现了导航栏的个性化定制,并提供了代码示例和实际效果展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文转载自微信小程序自定义头部导航栏

微信小程序自定义头部导航栏

先看下demo的效果:

在这里插入图片描述

在这里插入图片描述

最终要实现的效果:

  1. 在tabbar页面不显示左侧按钮;
  2. 分享出去的页面进入后不显示左侧返回按钮;
  3. 点击返回按钮可以自行设置返回层级;
  4. 字体颜色,背景颜色的设置;
  5. 左侧按钮的深浅样式切换;

使用自定义组件定义导航栏

在小程序跟目录下建立component / nav文件夹用来放我们的导航栏组件

在这里插入图片描述

首先在app.js中获取机型信息

onLaunch() {
    wx.getSystemInfo({
      success: (res) => {
        this.globalData.windowWidth = res.windowWidth
        this.globalData.statusBarHeight = res.statusBarHeight
        this.globalData.navBarHeight = 44 + res.statusBarHeight
      }
    })
    this.globalData.capsule = wx.getMenuButtonBoundingClientRect() //获取胶囊宽高及位置
  },
  globalData: {
    capsule:null,
  }

 在nav组件中编写组件

wxml:

<view class="nav-box">
	<view wx:if="{{ seat }}" class="seat-box" style="height:{{ 44 + statusBarHeight}}px;"></view>
	<view class='nav-wrap' style="background-color:{{backgroundColor}};">
		<view style="height:{{statusBarHeight}}px;"></view>
		<view class='content'>
			<view class="title" style="line-height:44px;color:{{titleColor}};">{{navTitle}}</view>
			<view wx:if="{{isShow}}" class="capsule-box {{isWhite? 'isWhite':'isblack'}} {{!isBack?'noBack':''}}"
				style='height:{{capsule.height}}px;position: absolute; top:{{capsule.top-statusBarHeight}}px; left:{{left}}px;'>
				<block wx:if="{{isBack}}">
					<view class="capsult-item">
						<image class='back' bindtap='back'
						src="{{isWhite ? '/images/ic_nav_back_white.png':'/images/ic_nav_back_blac.png'}}"
						mode="aspectFit" lazy-load="false" data-num="{{pageNum}}" binderror="" bindload="">
					</image>
					</view>
					<view class="{{isWhite? 'lineWhite':'lineblack'}}" hover-class="none" hover-stop-propagation="false"></view>
		  	</block>
				<view class="capsult-item">
					<image class='home' bindtap="toIndex"
					src="{{isWhite ? '/images/ic_nav_home_white.png':'/images/ic_nav_home_black.png'}}"
					mode="aspectFit" lazy-load="false" binderror="" bindload="">
				</image>
				</view>
			</view>
		</view>
	</view>
</view>

wxss

​
.nav-wrap {
  position: fixed;
  top: 0;
  left: 0;
  width: 750rpx;
  z-index: 99999;
}

.content {
  position: relative;
  width: 100%;
  height: 44px;
}

.back {
  width: 44rpx;
  height: 44rpx;
}

.home {
  width: 44rpx;
  height: 44rpx;
}

.lineblack {
  height: 36rpx;
  background: #B0B0B0;
  width: 1rpx;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  opacity: 0.5;
}

.lineWhite {
  height: 36rpx;
  background: rgba(255, 255, 255, .7);
  width: 1rpx;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  opacity: 0.5;
}

.title {
  text-align: center;
  font-weight: 900;
  font-size: 32rpx;
}

.letBtnBox {
  width: 100px;
  display: flex;
  align-items: center;
}

.capsule-box {
  width: 85px;
  border-radius: 88rpx;
  background: #FFFFFF;
  overflow: hidden;
  display: flex;
  justify-content: space-between;
}

.isWhite {
  border: 1rpx solid rgba(255, 255, 255, .25);
  background: rgba(0, 0, 0, .15);
}

.isblack {
  border: 1rpx solid rgba(0, 0, 0, .1);
  background: rgba(255, 255, 255, .6);
}

.opacity {
  background: rgba(0, 0, 0, .1);
}

.capsult-item {
  display: flex;
  width: 50%;
  align-items: center;
  justify-content: center;
}
.noBack{
  width: 32px;
}
.noBack .capsult-item{
  width: 100%;
}

​

js


    // 是否显示左侧按钮
    isShow: {
      type: Boolean,
      value: true
    },
    // 是否显示左侧返回按钮
    isBack:{
      type:Boolean,
      value:true
    },
    // 返回层级 默认为1
    pageNum: {
      type: Number,
      value: 1
    }
  },
  data: {
    capsule: {}
  },
  lifetimes:{
      //判断是否有上一级页面,如果有显示返回按钮(isBack参数)否则不显示
    attached: function() {
        this.setData({
          isBack:getCurrentPages().length === 1?false:true
        })
    }
  },
  ready() {
      //获取机型状态栏信息
    const {
      statusBarHeight,
      navBarHeight
    } = app.globalData
    console.log(app.globalData)
    this.setData({
      statusBarHeight,
      navBarHeight,
      left: app.globalData.windowWidth - app.globalData.capsule.right, //胶囊据右边距离
      capsule: app.globalData.capsule
    })
  },
  methods: {
      //返回层级 默认为1
    back(e) {
      wx.navigateBack({
        delta: e.currentTarget.dataset.num
      })
    },
      //跳转到首页
    toIndex() {
      wx.switchTab({
        url: '/pages/index/index'
      })
    }
  }
})

json

{
  "component": true
}

页面中引用

在需要使用自定义导航栏的页面设置

{
  "usingComponents": {
    "navbar":"/component/nav/nav"
  },
  "navigationStyle":"custom"
}

wxml中引入组件

<navbar isShow="{{isShow}}" navTitle="{{navTitle}}" backgroundColor="{{backgroundColor}}" isWhite="{{isWhite}}" pageNum="1" titleColor="{{titleColor}}"></navbar>

js文件配置

data:{
    isShow:true,//是否显示左侧按钮
    backgroundColor:'red',//背景颜色
    navTitle:'首页',//标题
    isWhite:true,//是否白色胶囊
    titleColor:'#fff',//字体颜色
}

images静态资源我项目中是使用的这四个图标。尺寸为44*44px; 如果你的项目中UI提供的图标尺寸不是这个,一定要对应去修改图标的nav.wxss中图片的尺寸大小!!!!

四个图标(可下载,添加了背景背景色方便看清正常加载没有背景颜色):图标1图标2图标3图片4

图标预览图:
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值