首页 > 编程语言 >微信小程序自定义头部导航栏

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

时间:2023-09-04 10:22:39浏览次数:33  
标签:自定义 微信 50% globalData width rgba type 导航 255

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

虽然小程序自带的顶部导航栏比较好用,但是扩展性比较差。在实际开发中我们经常需要针对导航栏进行一些功能性操作。比如点击返回按钮返回到固定的页面,设置其他背景颜色字体颜色以及增加一些按钮等等。下面我们一起来看看导航栏的定制;

先看下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

const app = getApp()
Component({
  options: {
    multipleSlots: true
  },
  properties: {
    isWhite: { //默认不是白色自定义返回
      type: Boolean,
      value: false
    },
    // 背景颜色
    backgroundColor: {
      type: String,
      value: 'rgba(0,0,0,0)'
    },
    // 标题颜色
    titleColor: {
      type: String,
      value: 'rgba(0,0,0,1)'
    },
    // 边框颜色
    borderColor: {
      type: String,
      value: 'rgba(0,0,0,1)'
    },
    // 标题
    navTitle: {
      type: String,
      value: ''
    },
    // 状态栏区域位置 
    seat: {
      type: Boolean,
      value: true
    },
    // 是否显示左侧按钮
    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中引入组件

js文件配置

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

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

四个图标(可下载,白色的也在只不过看不清):

通过以上的代码就可以实现针对自定义导航栏的封装以及引用,实现自定义导航栏。有疑问可以留言探讨!

标签:自定义,微信,50%,globalData,width,rgba,type,导航,255
From: https://www.cnblogs.com/panwudi/p/17676251.html

相关文章

  • 微信小程序开发基础知识一
    小程序和普通前端网页开发的区别1、运行环境:微信小程序是在微信内部运行的,而普通前端网页是在浏览器中运行的。这意味着微信小程序必须依赖微信提供的运行时环境,而普通前端网页可以在不同的浏览器上运行。因此,微信小程序开发需要专门的开发工具和技术栈。2、开发语言:微信小程序主......
  • elemenui datePicker 日期组件之快捷键的自定义,本周,本月,本季度,上周,上月,上季度
    1,先定义一个日期工具类,或者写在其他的方法中都行。定义工具类可重复使用1exportfunctiongetDateRang(val){2constnow=newDate();//当前日期3constnowDayOfWeek=now.getDay();//今天是本周的第几天4constnowDay=now.getDate();//当日5......
  • 基于微信小程序的图书馆座位预约系统设计与实现-计算机毕业设计源码+LW文档
    选题意义: 该系统可以监测到图书馆座位的使用情况,便于学生查询图书馆的分布、座位多少、是否空闲等基本数据。学生可以通过手机或者计算机等终端进行座位预约,方便快捷。对于占座现象,学生可以通过系统进行反馈,方便图书馆管理人员及时处理。基于微信小程序的图书馆座位预约系统的使......
  • 如何正确实现一个自定义 Exception
    最近在公司的项目中,编写了几个自定义的Exception类。提交PR的时候,sonarqube提示这几个自定义异常不符合ISerializablepatten.花了点时间稍微研究了一下,把这个问题解了。今天在此记录一下,可能大家都会帮助到大家。自定义异常编写一个自定义的异常,继承自Exception,其中定......
  • springboot自动配置的原理和如何自定义starter
    一、springboot自动配置的原理使用springboot时的一大优点就是当需要引入一些第三方的框架时只需要引入一个对应的starter后springboot就会自动的完成配置,例如在springboot中使用mybatis只需要引入mybatis提供的starter.那么这种便捷的配置方式是如何实现的呢,要了解其中的原理......
  • uniapp项目实践总结(八)自定义加载组件
    有时候一个页面请求接口需要加载很长时间,这时候就需要一个加载页面来告知用户内容正在请求加载中,下面就写一个简单的自定义加载组件。目录准备工作逻辑思路实战演练效果预览准备工作在之前的全局组件目录components下新建一个组件文件夹,命名为q-loading,组件为q-loading......
  • asp.net restful ef core sqlite 自定义包的位置
    MagicVilla_VillaAPI/MagicVilla_VillaAPI.csproj<ProjectSdk="Microsoft.NET.Sdk.Web"><PropertyGroup><TargetFramework>net7.0</TargetFramework><Nullable>enable</Nullable><ImplicitUsings>e......
  • 微信小程序开发部署发布流程
    微信小程序开发部署发布流程最近因为有比赛,所以在进行敏捷小程序开发,由于我比较菜,不会JS原生,所以选择了符合技术栈的技术路线。MPFlutter框架+dart语言的开发。这样就可以符合“同时产出小程序与APP”的需求。1.微信小程序申请微信公众平台(qq.com)进行申请,注册,认证。按照......
  • vue自定义事件用法及$emit
    子组件<template><button@click="handle">自定义事件</button></template><script>exportdefault{data(){return{message:"我子组件"}},methods:{handle(){......
  • 手把手教你vue3-ts-uniapp-vite创建多端小程序-2 设置底部导航
    1.打开项目,打开pages.json,设置底部导航栏。注意pages中的path和tabBar中list中的path要一致{ "pages":[ { "path":"pages/index/index", "style":{ "navigationBarTitleText":"首页" } },{ "pa......