mpvue實(shí)現(xiàn)對蘋果X安全區(qū)域的適配

mpvue實(shí)現(xiàn)對蘋果X安全區(qū)域的設(shè)配

一、業(yè)務(wù)背景

最近在利用mpvue+ts開發(fā)小程序的過程中,由于蘋果X等手機(jī)會出現(xiàn)底部的按鈕,會遮蓋掉需要操作的按鈕。由于在小程序開發(fā),微信爸爸已經(jīng)做了對機(jī)型的檢查,相對與H5的處理來說方便很多了。下面就稍微羅列一下解決方案。

二、實(shí)現(xiàn)思路

  • 判斷機(jī)型方法
  • 注入全局組件mixin
  • 加入全局安全距離css
  • 頁面上進(jìn)行class類處理

三、實(shí)現(xiàn)過程

1、判斷機(jī)型方法

小程序的官方文檔提供了一個方法wx.getSystemInfo,我們可以利用該方法來對小程序的對應(yīng)的手機(jī)型號進(jìn)行判斷,是否需要加上安全距離。在工具類文件新建safe-area.js文件,編寫下面代碼,這里返回一個Project,方便取值。

let cache = null;
export default function getSafeArea() {
    return new Promise((resolve, reject) => {
        if (cache != null) {
        // 如果有緩存不行行調(diào)用
            resolve(cache);
        }
        else {
        // 獲取系統(tǒng)信息
            wx.getSystemInfo({
                success: ({ model, screenHeight, statusBarHeight }) => {
                    const iphoneX = /iphone x/i.test(model);
                    const iphoneNew = /iPhone11/i.test(model) && screenHeight === 812;
                    cache = {
                        isIPhoneX: iphoneX || iphoneNew,
                        statusBarHeight
                    };
                    resolve(cache);
                },
                fail: reject
            });
        }
    });
}

2、注入全局組件mixin

因?yàn)閙pvue是具有mixin這個屬性的,我們可以利用混入安全距離的處理方法。用法基本跟vue一致。新建mixins.js,注入插件,在這個過程中需要注意一點(diǎn),就是如果不進(jìn)行頁面類型的判斷,會出現(xiàn)如果引用組件也會進(jìn)行注入該方法。所以需要加入進(jìn)行判斷

  Vue.prototype.$isPage = function isPage() {
    return this.$mp && this.$mp.mpType === 'page'
  }

mounted過程中進(jìn)行處理,可以避免不必要的注入。

import getSafeArea from '../utils/safe-area'
let MyPlugin = {};
MyPlugin.install = function (Vue) {
  // 添加全局方法或?qū)傩?  Vue.prototype.$isPage = function isPage() {
    return this.$mp && this.$mp.mpType === 'page'
  }
  // 注入組件
  Vue.mixin({
    data() {
      return {
        isIPhoneX: this.isIPhoneX,
      }
    },
    mounted() {
      if (this.$isPage()) {
        getSafeArea().then(({ isIPhoneX, statusBarHeight }) => {
          this.isIPhoneX = isIPhoneX
        });
      }
    }
  })
}
export default MyPlugin

main.js中注冊該插件

import MyPlugin from './minxins'
Vue.use(MyPlugin)

3、加入全局安全距離css

為了我們不需要在每一個文件進(jìn)行樣式的聲明,我們可以在全局樣式中寫入安全距離的類

.safeArea {
  padding-bottom: 34px!important;
}

4、頁面上進(jìn)行class類處理

處理完以上部分我們可以對頁面上需要處理的區(qū)域,加入:class="{safeArea: isIPhoneX}"進(jìn)行修改,例如:

    <div class="handle" :class="{safeArea: isIPhoneX}">
      <div class="home" @click="goHome"></div>
      <div class="submit" @click="buy">立即購買</div>
    </div>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容