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

news2024/12/12 9:42:17

文章目录

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

今天刚遇到的问题,横屏的页面完成操作后跳转页面后,自定义的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"
  }
} 

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

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

相关文章

十五、K8s计划任务JobCronJob

K8s计划任务CronJob&Job 一、Job可以干什么 Job 控制器用于管理 Pod 对象运行一次性任务,比方说我们对数据库备份,可以直接在 k8s 上启动一个 mysqldump 备份程序,也可以启动一个 pod,这个 pod 专门用来备份用的,备份结束 pod 就可以终止了,不需要重启,而是将 Pod…

【开源】基于SpringBoot框架美容院管理系统(计算机毕业设计)+万字说明文档 T012

系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境&#xff1a; Tomcat 7.x,8.x,9.x版本均可 操作系统…

基于卷积神经网络的垃圾分类系统实现(GUI应用)

1.摘要 本文主要实现了一个卷积神经网络模型进行垃圾图像分类&#xff0c;为了提高垃圾分类模型的准确率&#xff0c;使用使用Batch Normalization层、使用早期停止策略来防止过拟合等方法来优化模型&#xff0c;实验结果显示最终优化后的模型准确率较高90%左右。最终&#xf…

Qt Pro 常用配置

Part1: Summary Qt 开发中 Pro 文件的内容很多&#xff0c;需要不断的去学习和使用&#xff0c;现系统性的整理一下。以备录&#xff1b; 1.创建pro文件 1.1 步骤&#xff1a; Qt Creator--->New Project--->应用程序--->Qt Widgets Application--->名称为&…

软件测试--录制与回放脚本

准备工作 安装phpstudy 配置两个内容 放demo44文件夹 在浏览器输入http://localhost/demo44/index.html&#xff0c;出现如图所示的网站 输入用户名和密码 步骤一&#xff1a;打开Virtual User Generator&#xff0c;点击新建&#xff0c;点击new 步骤二&#xff1a;点击如下…

WEB安全基础知识

WAF全称为Web Application Firewall&#xff08;网页应用防火墙&#xff09;是一种专门设计用来保护web应用免受各种网络攻击的安全防护措施。它位于客户端与服务器之间&#xff0c;监控和过滤HTTP流量&#xff0c;从而拦截恶意请求、识别并防御常见的web攻击。 WAF的主要功能…

android studio kotlin 本地c++工程添加oboe库的方法

1.新建本地c++的kotlin工程hellohao 如图 2.把开源的oboe源文件src、include、CMakelists.txt、debug-utils复制hellohao目录下 3.修改hellohao\app目录下的CMakelists.txt cmake_minimum_required(VERSION 3.22.1) project(hellohao LANGUAGES C CXX)get_filename_component…

ElasticSearch常见的索引_集群的备份与恢复方案

方案一&#xff1a;使用Elasticsearch的快照和恢复功能进行备份和恢复。该方案适用于集群整体备份与迁移&#xff0c;包括全量、增量备份和恢复。 方案二&#xff1a;通过reindex操作在集群内或跨集群同步数据。该方案适用于相同集群但不同索引层面的迁移&#xff0c;或者跨集…

cefsharp131.2.70升级cefsharp131.3.10( Chromium 131.0.6778.109)NETCore 版本升级体验

一、版本 cefsharp 131.3.10 小版本升级:cefsharp 131.2.70>>cef 131.3.10 CEF 131.3.1+gcb062df+chromium-131.0.6778.109 / Chromium 131.0.6778.109 二、测试(html5test)

#自定义数据类型-模拟进程执行

#include <iostream> #include <string> #include <iomanip> using namespace std;//定义一个名为process的结构体&#xff0c;用于表示进程相关信息 //包含进程名、进程ID、进程优先级、进程状态、进程所需CPU时间、进程描述等成员 struct process {string …

多线程的知识总结(8):用 thread 类 或全局 async (...) 函数,创建新线程时,谁才是在新线程里第一个被执行的函数

&#xff08;40&#xff09;用 thread 类 或全局 async (…) 函数&#xff0c;创建新线程时&#xff0c;谁才是在新线程里第一个被执行的函数&#xff1f; 弄清楚这个问题&#xff0c;有利于推测和理解线程中代码的执行流程。根据 thread 类 和 async &#xff08;…&#xff0…

12月11日IO进程线程

作业1、创建子父进程&#xff0c;子进程将1.txt内容拷贝到2.txt中&#xff0c;父进程将3.txt内容拷贝到4.txt中。 #include <myhead.h>int main(int argc, const char *argv[]) {//创建子父进程pid_t pidfork();if(pid>0) //父进程{//打开文件1文件2int fd1open(&q…

TikTok无网络黑屏原因及解决方法

TikTok运营中最常见的问题就是出现黑屏和“Something went wrong”“No internet connection”等字样&#xff0c;这时TikTok往往已经无法正常使用&#xff0c;大大影响运营流程。那么这种情况是什么原因&#xff0c;又有什么解决办法&#xff1f; 一、无网络黑屏原因 1.‌地理…

在 Ansys Mechanical 中使用“螺栓工具”插件自动生成螺栓

总结 在有限元分析 &#xff08;FEA&#xff09; 中&#xff0c;高效创建螺栓连接对于确保机械装配的结构完整性和性能至关重要。螺栓是连接组件不可或缺的一部分&#xff0c;它们在负载下的精确建模会影响整个系统。快速高效的螺栓建模使工程师能够快速优化设计&#xff0c;满…

西门子200 smart PLC助力水处理企业自动化改造

摘要 西门子的200SMART PLC&#xff0c;以其强大的功能和灵活的应用性&#xff0c;正成为环保行业中不可或缺的一环。今天&#xff0c;我们就来看看这个小小的PLC是如何在处理环保问题中大显身手的。 不得不说&#xff0c;环保行业的痛点可不少。 比如污水处理&#xff0c;传…

【漏洞复现】CVE-2024-34102 Magento Open Source XXE漏洞

目录 漏洞介绍 影响版本 环境搭建 查看版本 漏洞复现 手动复现 漏洞 poc Magento Open Source 是一个免费开源的电子商务平台&#xff0c;适合中小企业或开发团队通过自定义代码和插件创建在线商店。它由社区开发和支持&#xff0c;功能强大但需要更多的技术投入。Adobe…

智能合约的离线签名(EIP712协议)解决方案

引言&#xff1a;本文由天玄链开源开发者提供&#xff0c;欢迎报名公益天玄链训练营 https://blockchain.163.com/trainingCamp 一、解决核心问题 项目方不支付gas费&#xff0c;由用户自己发起交易&#xff0c;用户支付gas费。用户的数据保存在链下服务器中&#xff0c;tok…

Vmware的网络适配器的NAT模式和桥接模式有何区别?如何给Uubunt系统添加桥接网卡?

Vmware的网络适配器的NAT模式和桥接模式有何区别&#xff1f; 如何给Uubunt系统添加桥接网卡? 步骤如下&#xff1a;

有源模拟滤波器的快速设计

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时&#xff0c;也能帮助其他需要参考的朋友。如有谬误&#xff0c;欢迎大家进行指正。 一、概述 几乎所有电子电路中都能看到有源模拟滤波器的身影。音频系统使用滤波器进行频带限制和平衡。通信系统设计使用滤波…

HarmonyOS 非线性容器TreeSet 常用的几个方法

TreeSet基于TreeMap实现&#xff0c;在TreeSet中&#xff0c;只对value对象进行处理。TreeSet可用于存储一系列值的集合&#xff0c;元素中value唯一且有序。 TreeSet和HashSet相比&#xff0c;HashSet中的数据无序存放&#xff0c;而TreeSet是有序存放。它们集合中的元素都不允…