微信小程序自定义导航教程(兼容各种手机)

作者:面包大虾 时间:2024-04-30 09:53:12 

前言

本文主要给大家介绍了关于微信小程序自定义导航的相关内容,详细代码请见github,请点击地址 (本地下载),其中有原生小程序的实现,也有wepy版本的实现

了解小程序默认导航

微信小程序自定义导航教程(兼容各种手机)

如上图所示,微信导航分为两部分,第一个部分为statusBarHeight,刘海屏手机(iPhone X,小米8等)会比其他的手机高很多,第二部分为titleBarHeight,安卓和IOS的高度不同,但是IOS高度是一样的,IOS高度是一样的,

所以我们要实现一个兼容不同手机的导航必须要根据不同的手机实现statusBarHeight和titleBarHeight

第一步:全局设置

把app.json中的window中的navigationStyle设置为custom,官方文档链接

设置完之后发现导航栏变成了如下图所示,只剩下了右上角胶囊按钮

微信小程序自定义导航教程(兼容各种手机)

第二步:确定导航栏两部分的高度

(1)确定第一部分statusBarHeight的高度,这部分是手机用来展示时间,信号和手机电量的,我们可以从wx.getSystemInfo从获得


wx.getSystemInfo({
success: function(res) {
console.log(res.statusBarHeight)
}
})

(2)第二部分titleBarHeight为小程序导航栏的高度,经过我查询无数文档和实践得知,在iPhone上titleBarHeight=44px,在安卓上titleBarHeight = 48px

(3)最后总结一下微信小程序的高度代码为


wx.getSystemInfo({
success: function(res) {
let titleBarHeight = 0
if (res.model.indexOf('iPhone') !== -1) {
 titleBarHeight = 44
} else {
 titleBarHeight = 48
}
that.setData({
 statusBarHeight: res.statusBarHeight,
 titleBarHeight: titleBarHeight
});
},
failure() {
that.setData({
 statusBarHeight: 0,
 titleBarHeight: 0
});
}
})

第三步:编写Navigation组件

(1)Navigation.js


const app = getApp();
Component({
properties: {
//小程序页面的标题
title: {
 type: String,
 default: '默认标题'
},
//是否展示返回和主页按钮
showIcon: {
 type: Boolean,
 default: true
}
},

data: {
statusBarHeight: 0,
titleBarHeight: 0,
},

ready: function () {
// 因为每个页面都需要用到这连个字段,所以放到全局对象中
if (app.globalData && app.globalData.statusBarHeight && app.globalData.titleBarHeight) {
 this.setData({
 statusBarHeight: app.globalData.statusBarHeight,
 titleBarHeight: app.globalData.titleBarHeight
 });
} else {
 let that = this
 wx.getSystemInfo({
 success: function(res) {
  if (!app.globalData) {
  app.globalData = {}
  }
  if (res.model.indexOf('iPhone') !== -1) {
  app.globalData.titleBarHeight = 44
  } else {
  app.globalData.titleBarHeight = 48
  }
  app.globalData.statusBarHeight = res.statusBarHeight
  that.setData({
  statusBarHeight: app.globalData.statusBarHeight,
  titleBarHeight: app.globalData.titleBarHeight
  });
 },
 failure() {
  that.setData({
  statusBarHeight: 0,
  titleBarHeight: 0
  });
 }
 })
}
},

methods: {
headerBack() {
 wx.navigateBack({
 delta: 1,
 fail(e) {
  wx.switchTab({
  url: '/pages/main/main'
  })
 }
 })
},
headerHome() {
 wx.switchTab({
 url: '/pages/main/main'
 })
}
}
})

(2) Navigation.wxml


<view style="height:{{titleBarHeight}}px;padding-top:{{statusBarHeight}}px">
<view class="header" style="height:{{titleBarHeight}}px;padding-top:{{statusBarHeight}}px">
<view wx:if="{{showIcon}}" class="title-bar">
 <view class="back" bindtap="headerBack"><image src="https://dn-testimage.qbox.me/Files/08/6b/086b8e19c7a5aa031dc4df31ca8b53ac2ed32212_644.png"></image></view>
 <view class="line"></view>
 <view class="home" bindtap="headerHome"><image src="https://dn-testimage.qbox.me/Files/fc/49/fc4958729bf1937667b68c78f495edeafe30f339_1030.png"></image></view>
</view>
<view class="header-title">{{title}}</view>
</view>
</view>

css就不贴了,有点多,需要的朋友可以去的github上拿 点击地址(本地下载)

第四步:展示效果

iPhone X展示效果

微信小程序自定义导航教程(兼容各种手机)

iPhone 7展示效果

微信小程序自定义导航教程(兼容各种手机)

小米8展示效果

微信小程序自定义导航教程(兼容各种手机)

用我们公司的测试机基本上都试了一遍,基本上都能正常显示,别问我为什么样式和右边这么相似,因为我是叫公司设计给了我样式

解决下拉刷新的问题

微信小程序自定义导航教程(兼容各种手机)微信小程序自定义导航教程(兼容各种手机)

图一为默认导航下的下拉刷新,显示正常,图二为自定义导航栏下的下拉刷新,显示异常,中间有一大块空白。

如果解决这个问题,我们自定义一个加载动画,藏在导航底下

(1)把app.json中的window设置为如下,这样加载动画就隐藏了,因为加载动画必须要设置window的backgroundTextStyle=blackbackgroundColor=#F3F3F3才会显示如上图所示


window: { "navigationStyle": "custom", "backgroundTextStyle": "light", "navigationBarBackgroundColor": "#fff", "navigationBarTitleText": "ICY买手店", "navigationBarTextStyle": "black"}

(2)修改Navigation.wxml


<view style="height:{{titleBarHeight}}px;padding-top:{{statusBarHeight}}px">
<view class="header" style="height:{{titleBarHeight}}px;padding-top:{{statusBarHeight}}px">
<view wx:if="{{showIcon}}" class="title-bar">
 <view class="back" bindtap="headerBack"><image src="https://dn-testimage.qbox.me/Files/08/6b/086b8e19c7a5aa031dc4df31ca8b53ac2ed32212_644.png"></image></view>
 <view class="line"></view>
 <view class="home" bindtap="headerHome"><image src="https://dn-testimage.qbox.me/Files/fc/49/fc4958729bf1937667b68c78f495edeafe30f339_1030.png"></image></view>
</view>
<view class="header-title">{{title}}</view>
</view>
<view class="loading-wrap"><image class="loading-gif" src="https://dn-testimage.qbox.me/Files/e0/35/e03562502eae6d5944bed747b7c21a3c2cce1ff8_1250.gif"></image></view>
</view>

效果如下图,加载动画我可能写的不太好看

微信小程序自定义导航教程(兼容各种手机)

问题:这样做在iPhone上是能正常展示的,但是在安卓上还有一点小问题,自定义导航栏的标题和图标有一起滑动

注意点

(1)安卓手机下拉刷新还是会有一点点展示问题

(2)项目所有fixed的元素都需要改,top需要加上导航栏的高度

目前哪些小程序在用自定义导航栏

我所知道的有 “bilibili”,"票圈长视频",我们公司的小程序也在计划用

来源:https://www.cnblogs.com/mianbaodaxia/p/10103933.html

标签:微信小程序,自定义,导航
0
投稿

猜你喜欢

  • SQL窗口函数之聚合窗口函数的使用(count,max,min,sum)

    2024-01-21 00:56:09
  • Python实现多属性排序的方法

    2021-03-11 02:13:57
  • t-sql清空表数据的两种方式示例(truncate and delete)

    2024-01-20 09:46:24
  • php隐藏IP地址后两位显示为星号的方法

    2023-08-16 13:05:17
  • Python环境使用OpenCV检测人脸实现教程

    2022-01-24 11:31:21
  • Java数据库操作库DButils类的使用方法与实例详解

    2024-01-20 13:32:45
  • Python中JsonPath提取器和正则提取器

    2022-08-27 14:12:20
  • pandas每次多Sheet写入文件的方法

    2022-02-07 03:50:39
  • python实现指定文件夹下的指定文件移动到指定位置

    2023-07-03 08:21:11
  • 详解Python基础random模块随机数的生成

    2021-07-29 08:12:01
  • Python聊天室带界面实现的示例代码(tkinter,Mysql,Treading,socket)

    2024-01-23 21:46:07
  • Python实现的摇骰子猜大小功能小游戏示例

    2022-04-08 13:26:28
  • 第五章之BootStrap 栅格系统

    2024-05-05 09:14:46
  • 使用limit,offset分页场景时为什么会慢

    2024-01-13 02:46:52
  • GIT相关-IDEA/ECLIPSE工具配置的教程详解

    2023-06-27 21:12:53
  • 利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)

    2021-07-16 11:37:24
  • vue自定义指令directive的使用方法

    2024-05-09 10:43:39
  • Django连接本地mysql数据库(pycharm)的步骤

    2024-01-20 05:05:39
  • SQL根据指定分隔符分解字符串实现步骤

    2023-07-13 03:09:14
  • CentOS 6.4下编译安装MySQL5.6.14教程

    2024-01-20 01:06:43
  • asp之家 网络编程 m.aspxhome.com