微信小程序橫屏頁面跳轉后,自定義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"}
} 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62654.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62654.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62654.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vivado ILA數據導出MATLAB分析

目錄 ILA數據導出 分析方式一 分析方式二 有時候在系統調試時&#xff0c;數據在VIVADO窗口獲取的信息有限&#xff0c;可結合MATLAB對已捕獲的數據進行分析處理 ILA數據導出 選擇信號&#xff0c;單擊右鍵后&#xff0c;會有export ILA DATA選項&#xff0c;將其保存成CS…

《探索形象克隆:科技與未來的奇妙融合》

目錄 一、什么是形象克隆 二、形象克隆的技術原理 三、形象克隆的發展現狀 四、形象克隆的未來趨勢 五、形象克隆的應用場景 六、形象克隆簡單代碼案例 Python 實現數字人形象克隆 Scratch 實現角色克隆效果&#xff08;以貓為例&#xff09; JavaScript 實現 Scratc…

MATLAB深度學習(七)——ResNet殘差網絡

一、ResNet網絡 ResNet是深度殘差網絡的簡稱。其核心思想就是在&#xff0c;每兩個網絡層之間加入一個殘差連接&#xff0c;緩解深層網絡中的梯度消失問題 二、殘差結構 在多層神經網絡模型里&#xff0c;設想一個包含諾干層自網絡&#xff0c;子網絡的函數用H(x)來表示&#x…

前端入門之VUE--vue組件化編程

前言 VUE是前端用的最多的框架&#xff1b;這篇文章是本人大一上學習前端的筆記&#xff1b;歡迎點贊 收藏 關注&#xff0c;本人將會持續更新。 文章目錄 2、Vue組件化編程2.1、組件2.2、基本使用2.2.1、VueComponent 2、Vue組件化編程 2.1、組件 組件&#xff1a;用來實現…

設計模式-裝飾器模式(結構型)與責任鏈模式(行為型)對比,以及鏈式設計

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言1.裝飾器模式1.1概念1.2作用1.3應用場景1.4特點1.5類與對象關系1.6實現 2責任鏈模式2.1概念2.2作用2.3應用場景2.4特點2.5類與對象關系2.6實現 3.對比總結 前言…

交叉熵損失函數(Cross-Entropy Loss)

原理 交叉熵損失函數是深度學習中分類問題常用的損失函數&#xff0c;特別適用于多分類問題。它通過度量預測分布與真實分布之間的差異&#xff0c;來衡量模型輸出的準確性。 交叉熵的數學公式 交叉熵的定義如下&#xff1a; C r o s s E n t r o y L o s s ? ∑ i 1 N …

操作系統:死鎖與饑餓

目錄 死鎖概念 饑餓與餓死概念 饑餓和死鎖對比 死鎖類型 死鎖條件&#xff08;Coffman條件&#xff09; 死鎖恢復方法 死鎖避免 安全狀態與安全進程序列&#xff1a; 銀行家算法&#xff1a; 死鎖檢測時機&#xff08;了解&#xff09;&#xff1a; 死鎖檢測 死鎖案…

Prisoner’s Dilemma

囚徒困境博弈論解析 什么是囚徒困境&#xff1f; 囚徒困境&#xff08;Prisoner’s Dilemma&#xff09;是博弈論中的一個經典模型&#xff0c;用來分析兩名玩家在非合作環境下的決策行為。 其核心在于玩家既可以選擇合作也可以選擇背叛&#xff0c;而最終的結果取決于雙方的…

RPO: Read-only Prompt Optimization for Vision-Language Few-shot Learning

文章匯總 想解決的問題對CoOp的改進CoCoOp盡管提升了性能,但卻增加了方差(模型的準確率波動性較大)。 模型的框架一眼看去,跟maple很像(maple跟這篇文章都是2023年發表的),但maple的視覺提示是由文本提示經過全連接轉換而來的,而這里是文本提示和視覺提示是獨立的。另外m…

『MySQL 實戰 45 講』24 - MySQL是怎么保證主備一致的?

MySQL是怎么保證主備一致的&#xff1f; MySQL 主備的基本原理 基本的主備切換流程 狀態 1&#xff1a;客戶端的讀寫都直接訪問節點 A&#xff0c;而節點 B 是 A 的備庫狀態 2&#xff1a;切換時&#xff0c;讀寫訪問的都是節點 B&#xff0c;而節點 A 是 B 的備庫注意&…

自薦一部IT方案架構師回憶錄

作者本人畢業于一個不知名大專院校&#xff0c;所讀專業計算機科學技術。2009年開始IT職業生涯&#xff0c;至今工作15年。擅長TSQL/Shell/linux等技術&#xff0c;曾經就職于超萬人大型集團、國內頂級云廠商、央國企公司。參與過運營商大數據平臺、大型智慧城市ICT、云計算、人…

python數據分析之爬蟲基礎:selenium詳細講解

目錄 1、selenium介紹 2、selenium的作用&#xff1a; 3、配置瀏覽器驅動環境及selenium安裝 4、selenium基本語法 4.1、selenium元素的定位 4.2、selenium元素的信息 4.3、selenium元素的交互 5、Phantomjs介紹 6、chrome handless模式 1、selenium介紹 &#xff08;1…

【數據結構——查找】順序查找(頭歌實踐教學平臺習題)【合集】

目錄&#x1f60b; 任務描述 相關知識 測試說明 我的通關代碼: 測試結果&#xff1a; 任務描述 本關任務&#xff1a;實現順序查找的算法。 相關知識 為了完成本關任務&#xff0c;你需要掌握&#xff1a;1.根據輸入數據建立順序表&#xff0c;2.順序表的輸出&#xff0c;…

光伏電站建設成本利潤估算

?截至2024年9月底,全國光伏發電裝機容量達到7.7億千瓦,同比增長48.4%。其中集中式光伏4.3億千瓦,分布式光伏3.4億千瓦。2024年前三季度,全國光伏發電量6359億千瓦時,同比增長45.5%。全國光伏發電利用率97.2%,同比下降1.1個百分點.早在今年2月份,中國光伏行業協會名譽理…

create-react-app react19 搭建項目報錯

報錯截圖 此時運行會報錯&#xff1a; 解決方法&#xff1a; 1.根據提示安裝依賴法 執行npm i web-vitals然后重新允許 2.刪除文件法 在index.js中刪除對報錯文件的引入&#xff0c;刪除報錯文件

scala的集合性能2

可變集合\n可變集合允許在原地修改數據&#xff0c;適合需要頻繁更新的場景。Scala 的可變集合包括 ArrayBuffer、HashSet和HashMap。 1. ArrayBuffer\nArrayBuffer 是一個可變的動態數組&#xff0c;提供高效的隨機訪問和添加操作。 import scala.collection.mutable.ArrayB…

【Ubuntu】腳本自動化控制終端填充

1.sh腳本文件控制終端寫入命令 在SLAM算法中&#xff0c;每次啟動vins都需要起很多終端&#xff0c;盡管使用了超級終端Terminator可以終端內劃分看起來更加便捷&#xff0c;但是每次起算法的命令還是要自己輸入&#xff0c;已經被麻煩了兩年了&#xff0c;今天突然想寫寫一個…

【自學】Vues基礎

學習目錄 Vues基礎本地應用網絡應用綜合應用 工具的準備 我個人比較喜歡使用HTMLDROWNER&#xff0c;學習資料推薦使用VC&#xff0c;僅供選擇吧 前置知識 HTMLCSSJSAJAX&#xff1a;這個是學習資料博主推薦的 個人感覺認真學好HTMLCSSJS理解vues基礎很容易上手 官方網址…

Scratch 消滅字母小游戲

背景 最近嘗試一邊自學Scratch&#xff0c;一邊嘗試教給小孩&#xff0c;看他打字時在鍵盤上亂打一氣&#xff0c;想起來自己小時候玩過的學習機打字母游戲&#xff0c;就想給他下載一個。結果網上看到的代碼&#xff0c;要么質量太差&#xff08;有26個字母就要寫 26 個判斷&…

python調用matlab函數(內置 + 自定義) —— 安裝matlab.engine

文章目錄 一、簡介二、安裝matlab.engine2.1、基于 CMD 安裝2.2、基于 MATLAB 安裝&#xff08;不建議&#xff09; 三、python調用matlab函數&#xff08;內置 自定義&#xff09; 一、簡介 matlab.engine&#xff08;MATLAB Engine API for Python&#xff09;&#xff1a;…