微信小程序横屏页面跳转后,自定义navbar样式跑了?

文章目录

      • 问题原因:
      • 解决方案:

今天刚遇到的问题,横屏的页面完成操作后跳转页面后,自定义的tabbar样式乱了,跑到最顶了,真机调试后发现navbar跑到手机状态栏了,它正常应该跟右边胶囊一行。

在这里插入图片描述
知道问题了就好办了,先分析

正常的屏幕显示应该是:

  • 竖屏:导航栏高度 = 状态栏高度 + 44px(内容区)
  • 横屏:导航栏高度 = 44px(仅内容区)

问题原因:

  • 屏幕旋转时,系统信息(如状态栏高度)会发生变化
  • 在横竖屏切换过程中,获取系统信息可能存在时序问题,导致获取到的状态栏高度不准确

解决方案:

  • 监听屏幕旋转事件 wx.onWindowResize
  • 通过比较窗口宽高来判断是否横屏:windowWidth > windowHeight
  • 在横屏时将状态栏高度设置为0,竖屏时使用系统实际状态栏高度
  • 使用 setTimeout 延迟更新导航栏状态,确保系统信息已完全更新
  • 在组件销毁时,记得解绑旋转事件监听器 wx.offWindowResize()

下面是具体custom-navbar组件的代码,这里只是适用我的项目,应该不是完美的方案,有更好的方案欢迎大家沟通

custom-navbar.wxml

<view class="navbar-container">
  <!-- 导航栏主体 -->
  <view class="navbar {{isLandscape ? 'landscape' : ''}}">
    <!-- 状态栏占位 -->
    <view class="status-bar" style="height: {{statusBarHeight}}px"></view>
    <!-- 导航栏内容 -->
    <view class="navbar-content">
      <view class="left">
        <view wx:if="{{showBack}}" class="back-icon" bind:tap="onBack">
          <t-icon name="chevron-left" class="nav-icon" />
        </view>
        <view wx:if="{{showHome}}" class="home-icon" bind:tap="onGoHome">
          <t-icon name="home" class="nav-icon" />
        </view>
      </view>
      <view class="center">
        <text>{{title}}</text>
      </view>
      <view class="right"></view>
    </view>
  </view>
  <!-- 占位元素 -->
  <view class="navbar-placeholder" style="height: {{isLandscape ? 44 : (44 + statusBarHeight)}}px"></view>
</view>

custom-navbar.wxss

.navbar-container {
  width: 100%;
  position: relative;
  z-index: 999;
}

.navbar {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  background: #fff;
  z-index: 999;
  box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
}

.status-bar {
  width: 100%;
  background: #fff;
}

.navbar-content {
  height: 44px;
  display: flex;
  align-items: center;
  padding: 0 12px;
  position: relative;
  background: #fff;
}

.left {
  display: flex;
  align-items: center;
  min-width: 90px;
  position: relative;
  z-index: 2;
}

.back-icon, .home-icon {
  padding: 6px;
  display: flex;
  align-items: center;
  justify-content: center;
}

.back-icon .nav-icon {
  font-size: 50rpx;
}

.home-icon .nav-icon {
  font-size: 40rpx;
}

.icon-image {
  width: 24px;
  height: 24px;
}

.center {
  flex: 1;
  text-align: center;
  font-size: 17px;
  font-weight: 500;
  color: #000;
  position: absolute;
  left: 0;
  right: 0;
  z-index: 1;
  height: 44px;
  line-height: 44px;
}

.right {
  min-width: 90px;
  position: relative;
  z-index: 2;
}

/* 导航栏占位元素 */
.navbar-placeholder {
  width: 100%;
  background: transparent;
}

/* 为使用自定义导航栏的页面提供的全局样式类 */
.with-custom-navbar {
  padding-top: env(safe-area-inset-top);
  min-height: 100vh;
  box-sizing: border-box;
  background: #f5f5f5;
}

/* 横屏模式样式 */
.navbar.landscape {
  position: fixed;
  top: 0;
  left: 0;
  width: 100vw;
  height: 44px;
  padding: 0;
  margin: 0;
}

.navbar.landscape .status-bar {
  display: none;
}

.navbar.landscape .navbar-content {
  height: 44px;
  padding: 0 8px;
  margin: 0;
}

.navbar.landscape .back-icon .nav-icon {
  font-size: 32rpx;
}

.navbar.landscape .home-icon .nav-icon {
  font-size: 28rpx;
}

.navbar.landscape .center {
  font-size: 14px;
  height: 44px;
  line-height: 44px;
}

.navbar.landscape .back-icon,
.navbar.landscape .home-icon {
  padding: 4px;
} 

custom-navbar.js

Component({
  properties: {
    // 标题
    title: {
      type: String,
      value: ''
    },
    // 是否显示返回按钮
    showBack: {
      type: Boolean,
      value: true
    },
    // 是否显示首页按钮
    showHome: {
      type: Boolean,
      value: true
    },
    // 首页路径
    homePath: {
      type: String,
      value: '/pages/index/index'
    }
  },

  data: {
    statusBarHeight: 0,
    isLandscape: false
  },

  lifetimes: {
    attached() {
      this.updateNavBarStatus();
      
      // 监听屏幕旋转
      wx.onWindowResize((res) => {
        const { windowWidth, windowHeight } = res.size;
        const newIsLandscape = windowWidth > windowHeight;
        
        if (this.data.isLandscape !== newIsLandscape) {
          // 延迟一下更新,确保系统信息已经更新
          setTimeout(() => {
            this.updateNavBarStatus();
          }, 100);
        }
      });
    },

    detached() {
      wx.offWindowResize();
    }
  },

  methods: {
    // 更新导航栏状态
    updateNavBarStatus() {
      try {
        const systemInfo = wx.getSystemInfoSync();
        const isLandscape = systemInfo.windowWidth > systemInfo.windowHeight;
        console.log('系统信息:', systemInfo);
        console.log('是否横屏:', isLandscape);
        console.log('状态栏高度:', systemInfo.statusBarHeight);
        
        this.setData({
          isLandscape: isLandscape,
          statusBarHeight: isLandscape ? 0 : (systemInfo.statusBarHeight || 48)
        });
      } catch (error) {
        console.error('获取系统信息失败:', error);
        // 设置默认值
        this.setData({
          statusBarHeight: 48
        });
      }
    },

    // 返回上一页
    onBack() {
      const pages = getCurrentPages();
      if (pages.length > 1) {
        wx.navigateBack();
      } else {
        wx.reLaunch({
          url: this.data.homePath
        });
      }
      this.triggerEvent('back');
    },

    // 返回首页
    onGoHome() {
      wx.reLaunch({
        url: '/pages/index/index',
      });
      this.triggerEvent('home');
    }
  }
}); 

custom-navbar.json

{
  "component": true,
  "usingComponents": {
    "t-navbar": "tdesign-miniprogram/navbar/navbar",
    "t-icon": "tdesign-miniprogram/icon/icon"
  }
} 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分布式 Paxos算法 总结

前言 相关系列 《分布式 & 目录》《分布式 & Paxos算法 & 总结》《分布式 & Paxos算法 & 问题》 参考文献 《图解超难理解的 Paxos 算法&#xff08;含伪代码&#xff09;》《【超详细】分布式一致性协议 - Paxos》 Basic-Paxos 基础帕克索斯算法…

10.qml使用 shadereffect 实现高斯模糊

目录 高斯模糊sigma获取加权均值获取 高斯二维公式实现高斯一维公式实现使用总结 高斯模糊 高斯模糊应用领域我就不过多讲解&#xff0c;想了解自己去了解 高斯模糊有 一维公式 二维公式 当然我们图像是二维的 但是实际上二维公式用于计算那是消耗大量的算力的&#xff0c…

从 CephFS 到 JuiceFS:同程旅游亿级文件存储平台构建之路

随着公司业务的快速发展&#xff0c;同程旅行的非结构化的数据突破 10 亿&#xff0c;在 2022 年&#xff0c;同程首先完成了对象存储服务的建设。当时&#xff0c;分布式文件系统方面&#xff0c;同程使用的是 CephFS&#xff0c;随着数据量的持续增长&#xff0c;CephFS 的高…

相机测距原理

基础概念的回顾 焦距的定义 焦距是指透镜或镜头的光学中心&#xff08;通常是透镜的几何中心&#xff09;到其焦点的距离。 焦点是光线的交点&#xff0c;它指的是透镜或镜头聚焦所有入射光线后汇聚的位置。焦点的位置与透镜的曲率和光线的入射角度相关。就是说所有光线经过…

AOF和RDB【Redis持久化篇】

文章目录 1.什么是持久化&#xff1f;2.RDB3.AOF 1.什么是持久化&#xff1f; Redis是跑在内存里的&#xff0c;当程序重启或者服务器崩溃&#xff0c;数据就会丢失&#xff0c;如果业务场景希望重启之后数据还在&#xff0c;就需要持久化&#xff0c;即把数据保存到可永久保存…

2024-12-14 学习人工智能的Day35 卷积神经网络.阶段项目

卷积神经网络项目实现 关于项目实现的文档说明书&#xff0c;三个要素&#xff1a;数据、模型、训练 1、项目简介。 1.1 项目名称 ​ 基于CNN实现扑克牌花色的小颗粒度分类 1.2 项目简介 ​ 该项目旨在通过卷积神经网络&#xff08;CNN&#xff09;实现扑克的小颗粒度分类…

【鸿蒙实战开发】数据的下拉刷新与上拉加载

本章介绍 本章主要介绍 ArkUI 开发中最常用的场景下拉刷新, 上拉加载&#xff0c;在本章中介绍的内容在实际开发过程当中会高频的使用,所以同学们要牢记本章的内容。下面就让我们开始今天的讲解吧&#xff01; List 组件 在 ArkUI 中List容器组件也可以实现数据滚动的效果&a…

MR30分布式 IO 模块:硅晶行业电池片导片机的智能 “心脏”

硅晶产业作为全球能源和电子领域的基石&#xff0c;其生产规模庞大且工艺复杂。从硅料的提纯、拉晶&#xff0c;到硅片的切割、电池片的制造&#xff0c;每一个环节都要求高精度与高稳定性。在电池片生产环节&#xff0c;导片机承担着硅片传输与定位的重要任务&#xff0c;其运…

MAC虚拟机上安装WDA环境

MAC虚拟机上安装WDA环境 一、MAC虚拟机切换root权限二、macOS上安装xcode若你的macOS系统可以在appstore下载安装若你安装的macOS系统版本太低&#xff0c;无法在appstore上安装xcode 三、macOS上安装WebDriverAgent四、使用xcode配置WDA安装到手机上高版本系统支持 一、MAC虚拟…

个人ffmpeg笔记(一)

环境安装 QT环境安装 运行qt…run安装 下载地址&#xff1a;https://download.qt.io/archive/qt/ 下载地址&#xff1a;https://download.qt.io/archive/qt/5.12/5.12.10/ sudo apt install --reinstall libxcb-xinerama0 解决xcb问题 Ubuntu16.04打开Qt显示/home/user/.co…

【网络】传输层协议UDP/TCP网络层IP数据链路层MACNAT详解

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;计算机网络原理_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.传输层协议 UDP 1.1 传输层 1.2 端口号 1.3 UDP 协议 1.3.1 UDP 协议端格式 1.3.2 UDP 的特点 1.3.3 面向数据报 1…

WordPress插件 Download-block-plugin下载按钮图标美化

WordPress插件 Download-block-plugin下载按钮图标美化

分布式 漏桶算法 总结

前言 相关系列 《分布式 & 目录》《分布式 & 漏桶算法 & 总结》《分布式 & 漏桶算法 & 问题》 概述 简介 LBA Leaky Bucket Algorithm 漏桶算法是一种流行于网络通信领域的流量控制/频率限制算法。漏桶算法的核心原理是通过一个概念上的“漏桶”来…

04面向对象篇(D4_OOT(D1_OOT - 面向对象测试))

目录 一、 面向对象影响测试 1. 封装性影响测试 2. 继承性影响测试 3. 多态性影响测试 二、 面向对象测试模型 三、 面向对象分析测试 1. 对象测试 2. 结构测试 3. 主题测试 4. 属性和实例关联测试 5. 服务和消息关联测试 四、面向对象设计测试 1. 对认定类测试 …

群控系统服务端开发模式-应用开发-前端操作记录功能展示

一、创建操作记录展示视图 在根目录下src文件夹下views文件夹下permission文件夹下创建token文件夹&#xff0c;在token文件夹下&#xff0c;新建index.vue文件&#xff0c;代码如下&#xff1a; <template><div class"app-container"><div class&qu…

【AIGC】如何高效使用ChatGPT挖掘AI最大潜能?26个Prompt提问秘诀帮你提升300%效率的!

还记得第一次使用ChatGPT时&#xff0c;那种既兴奋又困惑的心情吗&#xff1f;我是从一个对AI一知半解的普通用户&#xff0c;逐步成长为现在的“ChatGPT大神”。这一过程并非一蹴而就&#xff0c;而是通过不断的探索和实践&#xff0c;掌握了一系列高效使用的技巧。今天&#…

电容Q值、损耗角、应用

电容发热的主要原因&#xff1a;纹波电压 当电容两端施加纹波电压时&#xff0c;电容承受的是变化的电压&#xff0c;由于电容内部存在寄生电阻&#xff08;ESR&#xff09;和寄生电感&#xff08;ESL&#xff09;.因此电容会有能量损耗&#xff0c;从而产生热量&#xff0c;这…

适配器模式的理解和实践

在软件开发中&#xff0c;我们经常遇到需要将一个类的接口转换成客户端所期望的另一种接口的情况。这种接口不匹配问题会导致类之间的不兼容&#xff0c;使得原本可以协同工作的两个类无法在一起工作。为了解决这一问题&#xff0c;适配器模式&#xff08;Adapter Pattern&…

大数据分析案例-基于梯度提升决策树回归算法构建医疗保险费用预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

轩凯生物被警示,财务内控不规范,华泰证券又被处罚

作者&#xff1a;Tracy 来源&#xff1a;IPO魔女 11月21日&#xff0c;南京轩凯生物科技股份有限公司&#xff08;简称“轩凯生物”&#xff09;被交易所下达书面警示的自律监管函。同时其保荐机构华泰联合证券和会计师事务所天衡&#xff0c;均受到监管处罚。这是今年来&…