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

news2024/9/27 5:41:37

1.封装自定义nav导航组件

// app.js
App({
  globalData: {
    systeminfo: false,   //系统信息
    headerBtnPosi: false  //头部菜单高度
  }
})
// components/nav/nav.js
const app = getApp();
Component({
  properties: {
    vTitle: { // 标题
      type: String,
      value: ""
    },
    isSearch: {
      type: Boolean,
      value: false
    },
    noBorder: {  // 不需要下边框
      type: Boolean,
      value: false
    },
    color: { // 标题颜色
      type: String,
      value: "black"
    },
    bg: { // 背景图片路径
      type: String,
      value: ""
    },
    showBack: {  // 显示返回按钮
      type: Boolean,
      value: true
    }
  },
  data: {
    haveBack: true, // 是否有返回按钮
    statusBarHeight: 0, // 状态栏高度
    navbarHeight: 0, // 顶部导航栏高度
    navbarBtn: { // 胶囊位置信息
      height: 0,
      width: 0,
      top: 0,
      bottom: 0,
      right: 0
    },
    cusnavH: 0 //title高度
  },
  // 微信7.0.0支持wx.getMenuButtonBoundingClientRect()获得胶囊按钮高度
  attached: function () {
    if (!app.globalData.systeminfo) {
      app.globalData.systeminfo = wx.getSystemInfoSync()
    }
    if (!app.globalData.headerBtnPosi)
      app.globalData.headerBtnPosi = wx.getMenuButtonBoundingClientRect()
    let statusBarHeight = app.globalData.systeminfo.statusBarHeight // 状态栏高度
    let headerPosi = app.globalData.headerBtnPosi // 胶囊位置信息
    let btnPosi = {
      // 胶囊实际位置,坐标信息不是左上角原点
      height: headerPosi.height,
      width: headerPosi.width,
      top: headerPosi.top - statusBarHeight, // 胶囊top - 状态栏高度
      bottom: headerPosi.bottom - headerPosi.height - statusBarHeight, // 胶囊bottom - 胶囊height - 状态栏height (胶囊实际bottom 为距离导航栏底部的长度)
      right: app.globalData.systeminfo.windowWidth - headerPosi.right // 这里不能获取 屏幕宽度,PC端打开小程序会有BUG,要获取窗口高度 - 胶囊right
    }
    let haveBack
    if (this.properties.showBack === false) {
      haveBack = false
    } else {
      haveBack = true
    }
    
    var cusnavH = btnPosi.height + btnPosi.top + btnPosi.bottom // 导航高度
    this.setData({
      haveBack: haveBack, // 获取是否是通过分享进入的小程序
      statusBarHeight: statusBarHeight,
      navbarHeight: headerPosi.bottom + btnPosi.bottom, // 胶囊bottom + 胶囊实际bottom
      navbarBtn: btnPosi,
      cusnavH: cusnavH
    })
    //将实际nav高度传给父类页面
    this.triggerEvent("commonNavAttr", {
      height: headerPosi.bottom + btnPosi.bottom
    })
  },
  methods: {
    _goBack: function () {
      wx.navigateBack({
        delta: 1
      })
    },
    bindKeyInput: function (e) {
      // console.log(e.detail.value);
    }
  }
})
// components/nav/nav.json
{
  "component": true,
  "usingComponents": {},
  "navigationStyle": "custom"
}
<!-- components/nav/nav.wxml -->
<view class="custom_nav" style="height:{{navbarHeight}}px;position: relative;">
  <image wx:if="{{ !!bg }}" class="head-bg" mode="widthFix" src="{{bg}}"></image>
  <view class="custom_nav_box {{noBorder?'no-border':''}}" style="height:{{navbarHeight}}px;">
    <view class="custom_nav_bar" style="top:{{statusBarHeight}}px; height:{{cusnavH}}px;">
      <block wx:if="{{isSearch}}">
        <input class="navSearch" style="height:{{navbarBtn.height-2}}px;line-height:{{navbarBtn.height-4}}px; top:{{navbarBtn.top+1}}px; left:{{navbarBtn.right}}px; border-radius:{{navbarBtn.height/2}}px;" maxlength="10" bindinput="bindKeyInput" placeholder="输入文字搜索"/>
      </block>
      <block wx:else>
        <view class="custom_nav_icon" style="height:{{navbarBtn.height}}px;line-height:{{navbarBtn.height-2}}px; top:{{navbarBtn.top}}px; left:{{navbarBtn.right}}px;">
          <view wx:if="{{haveBack}}" class="icon-back" bindtap='_goBack'>
            <!-- <image src='/res/images/back.png' class='back-pre'></image> -->
            <iconfont name="back" color="#ff6200" size="44"/>
          </view>
        </view>
        <view class="nav_title" style="color: {{color}};height:{{cusnavH}}px; line-height:{{cusnavH}}px;">
          {{vTitle}}
        </view>
      </block>
    </view>
  </view>
</view>
/* components/nav/nav.wxss*/
.custom_nav {
  width: 100%;
  position: relative;
}

.head-bg {
  position: fixed;
  top: 0;
  left: 0;
  z-index: -1;
  width: 100%;
}
.custom_nav_box {
  position: fixed;
  width: 100%;
  z-index: 99999;
  border-bottom: 1rpx solid rgba(255, 255, 255, 0.3);
  box-shadow: 2rpx 2rpx 12rpx 0rpx rgba(95,95,95,0.1);
}
.custom_nav_box.no-border {
  border-bottom: none;
  box-shadow: none;
}

.custom_nav_bar {
  position: relative;
  z-index: 9;
}

.custom_nav_box .nav_title {
  font-size: 30rpx;
  text-align: center;
  position: absolute;
  max-width: 360rpx;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  margin: auto;
  z-index: 1;
}

.custom_nav_box .custom_nav_icon {
  position:absolute;
  z-index: 2;
  display: inline-block;
  border-radius: 50%;
  vertical-align: top;
  font-size:0;
  box-sizing: border-box;
}
.custom_nav_box .custom_nav_icon.borderLine {
  border: 1rpx solid rgba(255, 255, 255, 0.3);
  background: rgba(0, 0, 0, 0.1);
}

.navbar-v-line {
  width: 1px;
  margin-top: 14rpx;
  height: 32rpx;
  background-color: rgba(255, 255, 255, 0.3);
  display: inline-block;
  vertical-align: top;
}

.icon-back {
  display: flex;
  align-items: center;
  width: 74rpx; 
  padding-left: 20rpx;
  height: 100%;
}

.icon-home {
  display: inline-block;
  width: 80rpx;
  text-align: center;
  vertical-align: top;
  height: 100%;
}

.icon-home .home_a {
  height: 100%;
  display: inline-block;
  vertical-align: top;
  width: 35rpx;
}

.custom_nav_box .back-pre,
.custom_nav_box .back-home {
  width: 40rpx;
  height: 40rpx;
}

.navSearch {
  width: 200px;
  background: #fff;
  font-size: 14px;
  position: absolute;
  padding: 0 20rpx;
  z-index: 9;
}

2.修改全局配置

navigationStyle 字段设置为 custom,这样就能使用自定义的nav。

// app.json
"window": {
  "backgroundTextStyle": "light",
  "navigationBarBackgroundColor": "#fff",
  "navigationBarTitleText": "测试",
  "navigationBarTextStyle": "black",
  "navigationStyle": "custom"
},

3.页面使用

需要使用自定义nav的页面,需要每个页面都要引入自定义组件:

// pages/service/service.json
{
  "usingComponents": {
    "nav-component": "/components/nav/nav"
  }
}
<!-- pages/service/service.wxml -->
<nav-component v-title="服务" showBack="{{ false }}"></nav-component>

效果:
在这里插入图片描述
显示返回按钮,具体样式可以在自定义组件中定义默认样式:

<nav-component v-title="订单详情"></nav-component>

在这里插入图片描述
复杂一点的头部带背景图片:

<nav-component 
  v-title="首页" 
  color="white" 
  bg="/res/images/home_bg.png"
  no-border="{{ true }}"
  showBack="{{false}}"
></nav-component>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/97472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大厂频频裁员,0基础转行做IT是不是已经晚了

现在转行做程序员是不是已经晚了 转行不会晚&#xff0c;晚的是你数不清的犹豫 对于二十来岁刚毕业或者毕业没几年的人来说&#xff0c;经历过社会的“摧残”&#xff0c;面对着一眼能够望到头的工作&#xff0c;拿着也不太高的工资&#xff0c;总是会去寻求一些改变与其每天…

Ajax请求原理与数据抓取

有些时候&#xff0c;我们直接通过网络请求库请求网页地址时&#xff0c;得到的响应结果可能跟浏览器中右键查看网页源码所看到的内容不一样。例如&#xff0c;在抓取&#xff1a;https://www.feeair.com/threeCode.html &#xff08;飞啊网&#xff09;这个网页时&#xff0c;…

公司固定资产管理系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 模块划分&#xff1a;公告类型、公告信息、员工信息、仓库信息、资产类型、资产信息、供应商信 息、采购信息、盗产调拨…

(Matlab)基于蝙蝠算法实现电力系统经济调度

目录 摘要&#xff1a; 1.蝙蝠优化算法的基本原理&#xff1a; 2.蝙蝠优化算法的流程&#xff1a; 3.仿真实验分析&#xff1a; 摘要&#xff1a; 基于Matalb平台&#xff0c;构建基于蝙蝠活动行为的蝙蝠优化算法&#xff0c;对一个含有6个火电机组的电力系统进行优化调度…

毕业设计 ESP32在线墨水屏桌面摆件 -物联网 单片机 嵌入式

0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过…

单因子分析(如何判定一个因子是否有效)

本人之前都是做期权中性策略&#xff0c;第一次接触这个多因子策略&#xff0c;和一些大私募对接学习后&#xff0c;才知道这里面的水&#xff08;只能说各有各的道&#xff09;。 先说下&#xff0c;何为因子策略&#xff0c;就是一个因子和股票的价格在一定时间内是存在一定的…

【算法数据结构专题】「线程锁算法专项」初探CLH队列锁机制原理分析

技术扩展 SMP&#xff08;对称多处理器架构&#xff09; SMP(Symmetric Multi-Processor)&#xff0c;即对称多处理器结构&#xff0c;指服务器中多个CPU对称工作&#xff0c;每个CPU访问内存地址所需时间相同。其主要特征是共享&#xff0c;包含对CPU&#xff0c;内存&#…

使用Python互转pdf文档和word文档

1 前言 一日&#xff0c;欲将手头上的一份pdf文档转换成word文档。先试着用XX办公软件试了下&#xff0c;微信扫码登录后&#xff0c;在PDF转换界面&#xff0c;选中文档&#xff0c;点击“开始转换”&#xff0c;弹出提示对话框&#xff1a;免费的只给转换5页文档&#xff0c…

十万部冷知识:本届世界杯阿根廷会夺冠吗?

明天&#xff0c;世界杯的决赛“阿法大战”就开始了。而我个人是希望阿根廷夺冠的&#xff0c;熟悉我的人会知道&#xff0c;在2014巴西世界杯的64场比赛中&#xff0c;我曾预测对了63场&#xff0c;唯一一场不对的就是&#xff0c;那年阿根廷和德国的决赛&#xff0c;我当时就…

基于SSM村委会工作管理系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 工作人员&#xff1a; (1)通知管理&#xff1a;对日常的重要信息以及公告进行发布通知。 (2)财务管理&#xff1a;用于收…

【学习打卡】CAM可解释性分析-算法讲解

文章目录引言该算法能做什么直观上研究上意义上精妙之处定位特点弱监督学习特点作者简介CAM算法原理具体计算方法巧妙之处讨论全卷积神经网络池化简介池化的作用全局平均池化CAM总结SqueezeNet显著性分析的意义例1&#xff1a;工艺改进例2&#xff1a;识别鸟例3&#xff1a;围棋…

事业编招聘:事业单位招聘136人!可免笔试!

吉林的小伙伴看过来 2023年吉林四平事业编招聘136人 本科起报名&#xff0c;研究生免除笔试 报名时间&#xff1a;12月20日至12月24日 感兴趣的宝子们别错过了哦 为深入实施“万名大学生留平计划”&#xff0c;持续加大我市党政干部的专业化人才储备力度&#xff0c;现面向…

数据治理的数据流程整合

一、核心业务流程 在企业业务整合时&#xff0c;根据企业对信息化的投入&#xff0c;避免整合对企业业务流程影响过大&#xff0c;按照循序渐进的方式进行整合。 核心业务流程是企业经营、存在、发展的基础。在信息整合中&#xff0c;要围绕这样的业务流程整合企业的信息。在…

首看世界杯

首看世界杯&#xff0c;不谈技术&#xff0c;只聊自己的几点感受&#xff0c;纯属个人感想。 今年是第一次关注世界杯&#xff0c;本来对足球是没有什么兴趣的。如果说对足球有什么了解的话&#xff0c;大部分还是来自小时候的动画片“足球小将”。但是看现实中的足球比赛&…

Java项目:SSM酒吧后台管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 管理员角色包含以下功能&#xff1a; 管理员登录,桌位信息查看,查看账单,日常维护,酒水库存管理等功能。 环境需要 1.运行环境&#xff1a;最…

桌面壁纸实时展示粉丝数(CSDN)

最近csdn偶尔就又有几个同学关注我&#xff0c;觉得很有动力&#xff01;于是我想能在任何时候的桌面壁纸&#xff0c;都能看到csdn粉丝数以及显示他们的昵称&#xff0c;我觉得会很有意义&#xff01; 下面展示效果&#xff0c;(&#xff62;&#xff65;ω&#xff65;)&…

ArcGIS:如何进行栅格数据的拼接和裁剪、坡度坡向的提取、地形透视图的建立、等高线的提取、剖面图的创建?

目录 01 说明 02 实验目的及要求 03 实验设备及软件平台 04 实验内容与步骤 4.1 DEM 数据拼接和裁剪 4.2 地形属性的提取 4.3 透视图的建立&#xff08;均在ArcScence中操作&#xff09; 4.4 建立和显示 TIN 4.5 创建等高线图层 4.6 垂直剖面图创建 4.7 坡度分级 05 实验结果与…

【MySQL】MySQL性能优化

MySQL性能优化1、SQL语句及索引优化1.1 EXPLAIN查看索引使用情况1.2 SQL语句中IN包含的值不应过多1.3 SELECT语句务必指明字段名称1.4 当只需要一条数据的时候&#xff0c;使用limit 1&#xff0c;limit 是可以停止全表扫描的1.5 排序字段加索引1.6 如果限制条件中其他字段没有…

JAVA类和对象重点笔记及理解

1.类创建对象的详细过程 创建完成&#xff0c;dog就成了一个实例&#xff08;对象&#xff09;&#xff0c;具有属性和方法 Dog类的属性&#xff1a;一般叫做成员变量 Dog类的方法&#xff1a;一般叫做成员方法 类是对象的抽象&#xff0c;对象是类的具体实例。 2.JAVA的数据…

Mycat(4):mycat名词解释

1、逻辑库 对实际应用来说&#xff0c;并不需要知道中间件的存在&#xff0c;业务开发人员只需要知道数据库的概念&#xff0c;所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库。 如图一中&#xff0c;在MYCAT服务区中的TESTDB库&#xff0c;只是逻辑上存在的数…