您好,登錄后才能下訂單哦!
這篇文章主要介紹小程序橫屏方案對比分析,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
前言
隨著小程序api開放的功能日漸增多,小程序可以做到的功能和展現形式也越來越多,其中橫屏的展現形式就是其中的一種,而實現橫屏的方案也有多種,但是每種方案都有一定的缺陷,恰巧最近也在橫屏方案上踩了不少坑,接下來就來和大家分享一下小程序的不同橫屏方案的優劣(踩坑心得)
組件自帶橫屏方法
小程序中的媒體組件一般都會提供全屏的方法,而且全屏方法中會提供一個direction的全屏參數,可以通過這全屏參數將小程序旋轉90度橫屏展示,這是小程序中最簡單的橫屏方法。
這個方法優點在于調用的組件全屏方法做的橫屏,不需要考慮頭部導航欄的膠囊按鈕的顯示問題,媒體組件在做全屏顯示時,膠囊按鈕會自動隱藏不見,同時大多數媒體組件都已經支持了同層渲染,可以通過z-index調整組件層級,因此用此法在橫屏布局時可以在媒體組件上覆蓋其他組件布局
缺點:這個方法的缺點也很明顯,就是只能使用媒體相關組件才能有橫屏的全屏,場景很單一,如果不是媒體組件或者不想全屏,那么對不起,此法不可用
計算加速度判斷橫屏
這個方法是之前有人發在微信社區里的一個方法,通過小程序提供的wx.onAccelerometerChange方法監聽設備在x、y、z軸上的加速度,通過返回的重力加速度計算設備的旋轉角度,下面貼出代碼給大家參考:
// 0為豎屏,1為橫屏 let lastState = 0; let lastTime = Date.now(); wx.startAccelerometer(); wx.onAccelerometerChange((res) => { const now = Date.now(); // 500ms檢測一次 if (now - lastTime < 500) { return; } lastTime = now; let nowState; // 57.3 = 180 / Math.PI const Roll = Math.atan2(-res.x, Math.sqrt(res.y * res.y + res.z * res.z)) * 57.3; const Pitch = Math.atan2(res.y, res.z) * 57.3; // console.log('Roll: ' + Roll, 'Pitch: ' + Pitch) // 橫屏狀態 if (Roll > 50) { if ((Pitch > -180 && Pitch < -60) || (Pitch > 130)) { nowState = 1; }else { nowState = lastState; } }else if ((Roll > 0 && Roll < 30) || (Roll < 0 && Roll > -30)) { let absPitch = Math.abs(Pitch); // 如果手機平躺,保持原狀態不變,40容錯率 if ((absPitch > 140 || absPitch < 40)) { nowState = lastState; }else if (Pitch < 0) {/*收集豎向正立的情況*/ nowState = 0; }else { nowState = lastState; } } else { nowState = lastState; } // 狀態變化時,觸發 if (nowState !== lastState) { lastState = nowState; if (nowState === 1) { console.log('change:橫屏'); }else { console.log('change:豎屏'); } } });
更多的實現細節可以前往社區帖子查看,這個方法個人實際嘗試過,確實可以判斷設備處在橫屏還是豎屏
優點:這個方法的優點在于可以監聽到設備的橫豎屏情況,然后根據項目需要展示不同橫豎屏布局,自由度很高
缺點:這個方法的缺點在于在頁面內容橫屏時無法使頭部導航欄的膠囊按鈕橫屏展示,因為頭部導航欄的膠囊按鈕始終是固定屏幕右上角不動的,這樣會使得橫屏效果有點奇怪,橫屏是導航欄固定在左邊是豎屏時的布局,除非橫屏的布局是媒體組件的全屏,這樣就能遮住膠囊按鈕,自己自定義一個頭部導航,這樣就不會顯得布局奇怪
pageOrientation
pageOrientation是小程序提供的配置屬性,可以設置當前頁面是橫屏展示、豎屏展示、或者自動旋轉,同時提供一個onResize的監聽方法,當屏幕發生旋轉時會觸發onResize的回調,并且會在回調中返回當前是橫屏還是豎屏以及相應區域的大小。
優點:配置即可,手機旋轉觸發監聽事件,返回屏幕旋轉后的寬高和當前橫豎屏情況,橫屏時膠囊按鈕會自動旋轉,這樣頁面布局就不會有上一個方法所提及的怪異布局
缺點:
橫屏時響應區域變化產生布局變化的解決辦法
這個解決辦法只能解決橫屏時由于響應區域變化導致rpx重新的計算渲染的問題,既然rpx會在響應區域變化時重新計算渲染,那我們最直接粗暴簡單的方法就是不使用動態計算的單位px,這樣就不會在橫屏時重新渲染計算,但是這樣也有一個問題,就是在不同屏幕的大小的手機下也沒法動態計算了
那有沒有其他的更好辦法呢?vmax、vmin這兩個單位應該平時用的不多,個人也很少用,如果不是這次寫小程序橫屏,也不會關注到它
vmin:取值是當前vw和vh中較小的值,vmax:取值是當前vw和vh中較大的值
在豎屏時100vmin=375px,到了橫屏時100vmin=375px,這樣就能保證在橫豎屏切換的時候內容大小不變,在小程序中使用calc(vmin/7.5),假設大小為10px,那么css為calc(10vmin/7.5),如果你嫌這么寫麻煩,同時使用的是vs code,那么可以創建一個全局User Snippets:
"rpx to vmin" : { "prefix": "tovmin", "body": ["calc($0vmin / 7.5)"], "description": "rpx to vmin" }
這樣在寫css時直接寫tomin就會將calc($0vmin / 7.5)輸出
官方snippets創建步驟
以上是小程序橫屏方案對比分析的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。