微信小程序自定义顶部导航demo

注释:自定义导航需要自备相应图片

一、设置自定义顶部导航

  Navigation是小程序的顶部导航组件,当页面配置navigationStyle设置为custom的时候可以使用此组件替代原生导航栏。

  1.全局顶部导航自定义,在app.json的“window”里添加"navigationStyle": "custom"

  2.只在某一个页面自定义顶部导航,在该页面的json文件里添加"navigationStyle": "custom"

二、获取手机屏幕数据,app.js

//app.js
const Utils = require(‘./utils/utils‘)
App({
  onLaunch: function () {
    // 获取屏幕参数
    try {
      const res = wx.getSystemInfoSync()
      if (res.platform == ‘ios‘) {
        this.globalData.platform = ‘ios‘
      } else if (res.platform == ‘android‘) {
        this.globalData.platform = ‘android‘
      }
      // 导航高度
      let navHeight = res.statusBarHeight
      // 屏幕宽度/高度,单位px
      this.globalData.screenWidth = res.screenWidth
      this.globalData.screenHeight = res.screenHeight
      // 状态栏的高度,单位px
      this.globalData.statusBarHeight = res.statusBarHeight
      // 设备像素比
      this.globalData.pixelRatio = res.pixelRatio
      // 可使用窗口宽度,单位px
      this.globalData.winWidth = res.windowWidth
      // 安卓时,胶囊距离状态栏8px,iOS距离4px
      if (res.system.indexOf(‘Android‘) !== -1) {
        this.globalData.navHeight = navHeight + 14 + 32
        this.globalData.navTitleTop = navHeight + 8
        // 视窗高度 顶部有占位栏时
        this.globalData.winHeight = res.screenHeight - navHeight - 14 - 32
        // tab主页视窗高度
        this.globalData.winHeightTab = res.windowHeight - navHeight - 14 - 32
      } else {
        this.globalData.navHeight = navHeight + 12 + 32
        this.globalData.navTitleTop = navHeight + 4
        // 视窗高度 顶部有占位栏时
        this.globalData.winHeight = res.screenHeight - navHeight - 12 - 32
        // tab主页视窗高度
        this.globalData.winHeightTab = res.windowHeight - navHeight - 12 - 32
      }
      console.log(wx.getSystemInfoSync(), this.globalData.winHeightTab)
    } catch (e) {
      console.log(e)
    }
  },
  globalData: {
    platform: ‘ios‘,
    pixelRatio: 2,
    statusBarHeight: 20,
    navHeight: 64,
    navTitleTop: 26,
    winHeight: 655,
    winWidth: 750,
    screenWidth: 375,
    screenHeight: 812
  }
})

三、封装导航组件,根目录创建components/navbar文件夹,创建Component

<!--navbar.wxml-->
<view>
  <view class="nav-bar {{isWhite==‘true‘?‘nav-bar-white‘:‘‘}}" style="height: {{navHeight}}px;background-color:{{navColor}};" catchtap="toTop">
    <text class="navbar-title" style="top:{{navTitleTop}}px;color:{{navTitleColor}};">{{navTitle}}</text>
    <view wx:if="{{noArrow==‘false‘&&isArrowWhite==‘false‘&&isNavHome==‘false‘}}" catchtap="navBack" class="navbar-icon-wrap" style="top:{{navTitleTop}}px;">
      <image class="navbar-icon" src="../../images/arrow_left.png"></image>
    </view>
    <view wx:if="{{isArrowWhite==‘true‘&&isNavHome==‘false‘&&noArrow==‘false‘}}"  catchtap="navBack" class="navbar-icon-wrap" style="top:{{navTitleTop}}px;">
      <image src="../../images/arrow_left_white.png" class="navbar-icon"></image>
    </view>
    <view wx:if="{{isNavHome==‘true‘&&isArrowWhite==‘false‘&&noArrow==‘false‘}}" catchtap="navHome" class="navbar-icon-wrap" style="top:{{navTitleTop}}px;">
      <image src="../../images/[email protected]" class="navbar-icon"></image>
    </view>
    <view wx:if="{{isNavHome==‘true‘&&isArrowWhite==‘true‘&&noArrow==‘false‘}}"  catchtap="navHome" class="navbar-icon-wrap" style="top:{{navTitleTop}}px;">
      <image src="../../images/[email protected]_white.png" class="navbar-icon"></image>
    </view>
  </view>
  <view wx:if="{{isWhite==‘true‘}}" class="nav-bar-place" style="height: {{navHeight}}px;background-color:{{navColor}};"></view>
</view>
// navbar.js
const app = getApp()
Component({
  /**
   * 组件的属性列表
   */
  properties: {
    navHeight: {
      type: Number,
      value: 20
    },
    navTitleTop: {
      type: Number,
      value: 26
    },
    navTitle: { // 导航标题 可以为空
      type: String,
      value: ‘‘
    },
    navTitleColor: { // 导航标题颜色 默认黑色
      type: String,
      value: ‘#000‘
    },
    isWhite: { // 是否为白底
      type: String,
      value: ‘true‘
    },
    noArrow: { // 取消返回箭头
      type: String,
      value: ‘false‘
    },
    isArrowWhite: {//白色箭头
      type: String,
      value: ‘false‘
    },
    isNavHome: { // 返回首页
      type: String,
      value: ‘false‘
    },
    navColor: { // 导航栏背景色 默认白色
      type: String
    },
    backPath: { // 返回页面路径
      type: String,
      default: ‘‘
    },
    backDelta: { // 返回页面层数
      type: Number,
      default: 1
    }
  },

  /**
   * 组件的初始数据
   */
  data: {
    navHeight: 0,
    navTitleTop: 0
  },
  attached() {
    // 在组件实例进入页面节点树时执行
    // 获取顶部导航高度
    this.setData({
      navHeight: app.globalData.navHeight,
      navTitleTop: app.globalData.navTitleTop
    })
  },
  /**
   * 组件的方法列表
   */
  methods: {
    // 回到首页
    navHome:function(){
      wx.switchTab({
        url: ‘/pages/index/index‘
      })
    },
    // 回到顶部
    toTop: function () {
      wx.pageScrollTo({
        scrollTop: 0,
        duration: 300
      })
      this.triggerEvent(‘scrollEvent‘, {}) // 可绑定点击标题栏时的事件
    },
    // 返回上一页
    navBack: function () {
      if (this.properties.backPath === ‘‘) {
        wx.navigateBack({
          delta: this.properties.backDelta
        })
      } else {
        wx.redirectTo({
          url: this.properties.backPath
        })
      }
      this.triggerEvent(‘backEvent‘, {}) // 可绑定点击返回时的事件
    }
  }
})
/* navbar.wxss */
/*自定义导航栏*/
.nav-bar {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  z-index: 999999;
}

.nav-bar-white {
  background-color: #fff;
}

.navbar-title {
  position: absolute;
  height: 32px;
  line-height: 32px;
  /* width: 100%; */
  width: 320rpx;
  text-align: center;

  font-size: 16px;
  color: #000;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  left: 28%;
}

.navbar-icon-wrap {
  position: absolute;
  left: 9px;
  width: 44px;
  height: 32px;
  display: flex;
  justify-content: center;
  align-items: center;
}

.navbar-icon {
  width: 44px;
  height: 32px;
}

.navbar-scan {
  width: 28px;
  height: 28px;
}

四、引入组件

五、使用组件(根据属性可以自由配置导,这里例举几个样式,也可以根据自己需求更改组件)

 <navbar navTitle="顶部导航demo" style="width:200rpx;"></navbar>

——————————————————————————————————————————————————————————

<navbar navTitle="无返回顶部导航" noArrow="true"></navbar>

——————————————————————————————————————————————————————————

  <navbar navTitle="透明导航" isWhite="false" isArrowWhite=‘true‘ navTitleColor="#fff"></navbar>

——————————————————————————————————————————————————————————

  <navbar navTitle="主页按钮导航" isNavHome=‘true‘ isArrowWhite=‘false‘ noArrow=‘false‘></navbar>

原文地址:https://www.cnblogs.com/jing-zhe/p/11963603.html

时间: 2024-11-07 08:10:14

微信小程序自定义顶部导航demo的相关文章

微信小程序-自定义底部导航

代码地址如下:http://www.demodashi.com/demo/14258.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html 1.基本需求. 实现用户自定义底部导航 2.案例目录结构 二.程序实现具体步骤 1.自定义nav.wxml代码 <template name="nav"> <view class=&quo

微信小程序自定义导航栏(wx_custom_navigation_bar) 自定义返回键、首页键,动态设置标题,响应式组件

微信小程序自定义导航栏 navigation bar 返回键 首页 github: https://github.com/chen-yt/wx_custom_navigation_bar https://github.com/Superman2113/wx_custom_navigation_bar 代码 navbar组件 navbar.wxml <view class="navbar" style="{{'height: ' + navigationBarHeight

值得记录的(五)- 微信小程序自定义 tabbar

一定的需求情况下,无法使用小程序原生的 tabbar 的时候,需要自行实现一个和 tabbar 功能一模一样的自制组件. 查阅了海量的博客和文档之后,亲自踩坑.总结了三种在不使用微信小程序原生 tabbar的情况下自制 tabbar 的方法.并说说这几种方法各自的特色. 类 navigator 跳转方式 类 navigator 跳转方式是我自己起的名称,因为它的实现思路就是这个样子的.期初参考 微信小程序自定义tabBar组件开发 这篇博文的思路.进行了这种方式的尝试,并为后续提供了解决思路.在

微信小程序自定义弹窗wcPop插件|仿微信弹窗样式

微信小程序自定义组件弹窗wcPop|小程序消息提示框|toast自定义模板弹窗 平时在开发小程序的时候,弹窗应用场景还是蛮广泛的,但是微信官方提供的弹窗比较有局限性,不能自定义修改.这个时候首先想到的是自定义组件化开发,就是把弹出框封装成一个组件,然后多处调用. 解决了小程序开发自定义弹窗出现后,遮罩层下的页面仍可以滚动的方法: 给遮罩层的最外层view中加入catchtouchmove="preventTouchMove" 即可解决该遮罩层点透问题. 根据需要还可以自定义多个按钮及事

使用wepy开发微信小程序的底部导航

前言: 最近公司在做一个微信小程序的项目,用的是类似于vue的wepy框架.我也借此机会学习和实践一下. 小程序官方文档:https://developers.weixin.qq.com/miniprogram/dev/ wepy官方文档:https://tencent.github.io/wepy/document.html#/ wepy小程序项目初始化:wepy小程序入门之项目初始化 今天的目标是开发微信小程序的底部导航 效果图: 1.打开编辑器(我用的是vscode),然后打开微信开发者工

微信小程序入门学习-- 简易Demo:计算器

简单学习下微信小程序 官网 简易教程 · 小程序 https://mp.weixin.qq.com/debug/wxadoc/dev/ 需要通过开发者工具,来完成小程序创建和代码编辑. 下载安装,运行程序,点击添加项目,弹窗,可以选无AppId,选择程序路径,勾选quick start. app.json 配置文件 wxxml --相当于html wxss--相当于css 在pages文件夹新建文件夹 修改配置app.json 这样系统启动时会运行call文件项目 "pages":[

微信小程序-自定义QQ版下拉刷新

最近给别个公司做技术支持,要实现微信小程序上拉刷新与下拉加载更多 微信给出的接口不怎么友好,最终想实现效果类似QQ手机版 ,一共3种下拉刷新状态变化,文字+图片+背景颜色 最终实现后的效果(这里提示有个不同点就是,自定义了导航条,并且下拉的时候,自定义导航条必须固定) 小程序实现下拉加载2种方式: 1. 简单粗暴,直接开启enablePullDownRefresh,开启全局下拉刷新 2.利用scroll-view组件 简单分析下2种方式的利与弊 enablePullDownRefresh方式 优

再谈小程序自定义底部导航

小程序自定义tabBar再探索 前言 最近有很多微信开发者朋友在QQ上加我好友,忽然意识到大家对微信自定义底部导航栏需求还是挺大的,故而再次整理下底部导航栏组件开发思路.和之前的文章还是有些区别,并且底部导航栏组件增加新的特性以及一些优化开发体验的骚操作. 技术选型 与之前不同,现在我们有两种方法实现自定义底部导航栏,因为小程序在2.5.0开始支持自定义底部导航栏了戳此处看文档,所以我们现在的可选方案为: 通过HideTabBar接口hack底部导航栏 通过小程序支持配置实现底部导航栏 下面根据

微信小程序 自定义标题栏

微信小程序可以设置自定义标题栏,可以针对不同页面单独设置1. 在页面文件 .json 文件中,设置如下属性,自定义导航栏 和 导航栏样式"navigationStyle": "custom","navigationBarTextStyle": "white", 特别是第二个 navigationBarTextStyle 属性 可以将胶囊样式调整为透明效果 2. 设置自定义导航栏布局 样式 动效逻辑等 3. 划重点!!!导航栏中