微信小程序自定义导航栏机型适配--底部Tabbar--view高度--底部按钮适配

news2025/7/4 13:27:50

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

在这里插入图片描述
自定义微信小程序头部导航栏,有几种方式

方式一

{
  "navigationStyle": "custom" // 将navigationStyle从默认default改为custom
}

定义此方法后,头部的导航栏会去掉,导航栏下的元素会直接向上移动到原导航栏的位置,可以再app.json配置成全局沉浸式导航栏,以及在单页面配置沉浸式导航栏。

方式二

使用组件
这里使用vant组件作为演示
在这里插入图片描述
在这里插入图片描述
组件配置的NavBar,样式在官方文档上有说明,根据文档说明修改样式即可。
官方文档:https://vant-contrib.gitee.io/vant-weapp/#/nav-bar

机型适配

由于自定义navBar了,导航栏下面的元素会直接向上偏移,需要离顶部的距离才可以恢复到正常的位置,此时设置的距离根据不同的机型,位置也会不同,所以这里就需要做到机型适配。
方式一:
根据微信小程序胶囊到顶部以及胶囊的高度,算出navBar下的内容到顶部的距离

// js
let pillHeight = wx.getMenuButtonBoundingClientRect().top  // 胶囊到顶部的高度
let pill = wx.getMenuButtonBoundingClientRect().height  // 胶囊的高度
this.setData({topHeight : pillHeight +pill })

// 页面   动态设置margin-top高度
 <view class="content_bg" style="margin-top: {{capsuleHeight}}px;">内容</view>

方式二:
根据小程序头部的高度加导航高度的距离动态计算内容到顶部的距离

// js
 wx.getSystemInfo({
        success: res => {
          let navWindowHeight = res.statusBarHeight + 46; // 小程序头部的高度 + 导航高度
          this.setData({capsuleHeight : navWindowHeight })  // 赋值高度
        }, fail(err) {
      console.log(err);
    }
// 页面
<view class="content_bg" style="margin-top: {{capsuleHeight }}px;">内容</view>

由于机型的不同,动态计算的高度也不同,不同机型对胶囊到顶部的高度都有差异,而且获取到的胶囊到顶部或者小程序头部的高度的值单位是 px ,所以直接将获取到的值赋值给距离顶部的距离即可,否则在动态计算高度的时候,px不会动态适配屏幕的大小变化,目前来说用方式二适配率高一些,在开发的时候需要根据实际情况,做不同的调整。


动态获取view的宽高

根据viewclassid名动态获取view的宽高信息

<view class="box"></view>

// 获取宽高信息
getNavInfo(){
   let that = this
   const query = wx.createSelectorQuery();
   query.select('.box').boundingClientRect(function (res) {
     console.log(res);
   }).exec()
},

在这里插入图片描述


动态获取底部Tabbar的高度

screenHeight :屏幕高度,单位px
safeArea.bottom:安全区域右下角纵坐标

官方文档已有说明:https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getSystemInfo.html

    wx.getSystemInfo({
      success: (res) => {
        this.setData({
          tabBarHeight : res.screenHeight - res.safeArea.bottom + 50
        })
      }
    })

将计算出来的tabBatHeight直接写在页面的行内样式中即可


底部按钮的适配

由于用户的机型不同,微信小程序底部的高度计算规则也不同,现在的机型分为两种,一种是安卓机,一种是ios机型,安卓机的适配在开发者工具上的预览机型相当于iphone5,而ios机型在开发者工具上的预览相当与iphone12或以上,这其实只是一个预估值,可以将它统称为iphoneX,导致机型不适配的原因是因为苹果 iPhoneX 、iPhone XR等设备上,物理Home键被取消,改为底部小黑条替代home键功能。
在这里插入图片描述
在安卓机型上是直接忽略掉该小黑条的,而iPhoneX及以上设备则会计算该小黑条的高度,这就导致一套css方案在不同的机型上会有适配问题,解决适配问题的方案可以使用苹果官方提供的css样式:

padding-bottom: constant(safe-area-inset-bottom); /*兼容 IOS<11.2*/
padding-bottom: env(safe-area-inset-bottom); /*兼容 IOS>11.2*/

该样式可以兼容iPhone设备的底部高度,但是安卓机型并不兼容,所以需要在给底部的高度再加一个padding-bottom:10rpx;让底部的按钮撑起一个安全距离。下面是完整的代码示例:

<view class="baseBottom">
   <view class="bottomCase">提交</view>
   <view class="isIPhoneXRegexBottom"></view>
</view>
.outStore{
  position: fixed;  /* 固定在底部 */
  bottom: 0;
  left: 0;
  width: 100vw;
  background-color: white;
  .bottomCase{
    width: calc(100% - 52rpx);
    height: 76rpx;
    margin: 0 auto;
    margin-top: 12rpx;
    text-align: center;
    line-height:76rpx
    margin-bottom: 10rpx; /* 10px适配安卓机型 */
  }
}
/* 安全距离-全局的style文件,在页面直接调用即可 */
.isIPhoneXRegexBottom {
  padding-bottom: constant(safe-area-inset-bottom) !important;   /*兼容 IOS<11.2*/
  padding-bottom: env(safe-area-inset-bottom) !important;  /*兼容 IOS>11.2*/
  background-color: transparent;  /* 透明色 */
}

原理就是在底部按钮下方设置一个view块,该块会自动适配iPhone机型,将按钮上方顶住,以保持安全距离。由于苹果官方提供的方法安卓机型不适配,所以需要只用marginpadding来将底部按钮撑起一个安全高度。
在不同机型下的效果:
iPhone机型
在这里插入图片描述
安卓机型:
在这里插入图片描述

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

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

相关文章

‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序?npm i (npm install)安装不上的原因

启动项目时&#xff0c;本地有node包&#xff0c;但是终端提示&#xff1a;vue-cli-service 不是内部或外部命令&#xff0c;也不是可运行的程序&#xff0c;导致项目无法启动&#xff0c;如下&#xff1a; 原因之一是项目的npm版本较低&#xff0c;但是你本地的npm版本过高&am…

uniapp一键发行代码并混淆代码

第一步.在项目根目录下安装插件 npm install javascript-obfuscator -g安装完成后&#xff0c;javascript-obfuscator就是一个独立的可执行命令了。 javascript-obfuscator -v第二步&#xff1a;HbuilderX点击发行按钮&#xff0c;打包代码到dist文件中 小程序发行后代码会自…

微信小程序--》小程序—全局数据共享和分包

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;微信小程序 &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&…

Code For Better 谷歌开发者之声—— 在 Windows 10 上对 Google Chrome 进行故障排除

&#x1f482; 个人网站:【 海拥】【小霸王游戏机】&#x1f91f; 风趣幽默的前端学习课程&#xff1a;&#x1f449;28个案例趣学前端&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】&#x1f4ac; 免费且实用的计算机相关知识题库&…

小白也可以,10分钟搭建大气的Halo博客(保姆级教程)

一、博客的好处 很多程序员、职业投资人、KOL喜欢建立自己的博客系统&#xff0c;为的是让自己有一个知识归纳的工具&#xff0c;也为自己收纳的各种资料有一个线上存储的记事本。到了币圈后&#xff0c;虽然有很多人用Mirro、Medium等文字工具&#xff0c;但这些工具对于中国…

完美解决:flex布局中设置宽度被压缩的问题

问题描述&#xff1a; 在父级中设置了display:flex;父元素宽度不够的时候&#xff0c;子元素就算设置的宽度&#xff0c;也会被压缩&#xff1b; 产生原因&#xff1a; 当子元素设置固定宽度&#xff0c;如果整体宽度不足时&#xff0c;会把固定宽度给压缩 解决方法: 给固定宽…

uniapp小程序开发-富文本编辑器mp-html,juice外部样式转内联样式

前言 在开发一款公司的小程序过程中&#xff0c;有一个需求&#xff1a;web端后端可以上传word文档&#xff0c;后端转为html字符串&#xff1b;小程序接收显示&#xff0c;并且可以在小程序进行编辑修改。 其实在日常小程序中很少见到富文本编辑器的使用&#xff0c;所以这次…

【JavaScript】五个常用功能/案例:计时器 | 流程控制 | 闭包应用 | arguments剩余参数 | 二次封装函数

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 &#x1f5a5;️ NodeJS专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ 博主的前端之路&#xff1a;前端之行&#xff0c;任重道远&#xff08;来自大三学长的万字自述&#xff09; &#x1f9e7; 个人社区&#xff1…

Vue2-生命周期

之前说完了Vue的基础知识&#xff0c;说了语法、数据代理、数据监听、计算属性、指令、过滤器等等&#xff0c;但是没有涉及到Vue的声明周期&#xff0c;其实之所以把生命周期放在后面讲&#xff0c;是因为&#xff0c;如果最开始讲生命周期&#xff0c;里面涉及到的概念性东西…

vue路径component使用import的方式来写 component: () => import(‘@/views/order/orderDetail‘)

以前老师教的一直是这种写法: 工作后突然看到这种写法,我蒙了 首先我们先来理解一下,路由文件里面. path里面其实就是url也就是我们写路径的,我们在网址栏所看到的. 而component则是我们所对应的页面组件.每个页面相当于一个组件.所以我们的页面的名字就是组件的名字. 方法一:普…

掌握Mock摆脱后端同学的束缚

文章目录前言Mock概述mock.js安装Mock规范Mock的使用总结前言 当下采用前后端分离模式开发Web应用已经成为气候&#xff0c;在开发阶段有一个不成文的规定则是 项目开发后端先行 但是作为前端开发工程师的我们&#xff0c;难道在搭建完页面后只能等待后端的接口么&#xff1f;…

自定义修改el-talbe show-overflow-tooltip的样式

el-table表格行有一个可使用的show-overflow-tooltip属性&#xff0c;它接受一个Boolean&#xff0c;为true时多余的内容会在 hover 时以 tooltip 的形式显示出来。 <el-table-columnprop"address"label"地址"show-overflow-tooltip></el-table-…

Vue3、Vue2都有哪些区别

vue3和vue2版本对比&#xff1a; vue2中绝大多数的API与特性&#xff0c;在vue3中同样支持。同时&#xff0c;vue3中还新增了所特有的功能&#xff0c;并废弃了vue2中的某些旧功能。 新增的功能如&#xff1a;组合式API、多根节点组件、更好的TypeScript支持等。 废弃的功能…

jq获取和设置标签的css样式、jq给标签增加或移除class属性

1、jQuery获取和设置标签的css样式 jQuery既可以直接获取标签的css样式&#xff0c;也可以设置样式&#xff0c;包括行内、内部、外部样式&#xff1b;思路&#xff1a;先要选取这个标签&#xff0c;然后再获取或者设置样式&#xff1b;获取css属性&#xff1a;console.log($…

eclipse新建一个简单的网站(web)项目

目录前言一、新建一个简单web项目二、报错解决前言 本篇介绍怎么在eclipse中新建一个简单的web项目&#xff0c;博主是用的eclipse版本是2021-06R&#xff0c;服务器tomcat10。本篇是博主尝试自己动手搭建网站系列文章中的一篇&#xff0c;如想了解更多相关内容&#xff0c;见…

在web页面中直接播放rtsp视频流

rtsp是一种实时传输协议&#xff0c;通过各种百度了解&#xff0c;得出结论&#xff1a;浏览器是不支持播放rtsp流的&#xff0c;必须经过后端转码推流。 实现思路&#xff1a;借助node搭建转码推流服务&#xff0c;再使用JSMpeg播放。 rtsp2web是一个依赖 ffmpeg&#xff0c…

Vue页面生成PDF的方法

最近项目有个需求&#xff0c;将系统统计的数据生成分析报告&#xff0c;然后可以导出成PDF。 这种方法可以有两种&#xff0c;一种是直接调用打印&#xff0c;用户通过浏览器提供的打印页面手动选择导出PDF。当然这种方式兼容性差&#xff0c;且体验不好&#xff0c;显然不是…

net::ERR_CONNECTION_REFUSED 解决大全

sockjs-node/info报错 GET http://localhost/sockjs-node/info?t1641268443660 net::ERR_CONNECTION_REFUSED sockjs-node作用 SockJS is a JavaScript library (for browsers) that provides a WebSocket-like object. SockJS gives you a coherent, cross-browser, Javascr…

前端页面出现 Failed to load response data

工作上前端 搭建了一套新的环境 同一个接口 新的前端环境 调用接口时 偶尔会出现一个情况 这时候 我们 在服务器 、 Postman 、本地环境调用都没问题 唯独在新的前端页面上会出现这样的问题 鉴于这样的问题 在网上查询了很多方法 进行修正都无济于事 最终在我们将问题指向了…

Android基础入门

第1章 Android基础入门 目录第1章 Android基础入门1.1 Android简介1.1.1 通信技术1.1.2 Android发展史1.1.3 Android体系结构1.1.4 Dalvik虚拟机1.2 Android开发环境搭建1.2.1 Android Studio安装1.2.2 模拟器创建1.2.3 SDK下载1.3 Android程序结构1.4 资源的管理与使用1.4.1 图…