vue中使用指令解決iphonex底部的適配問題

在網上也看了很多的博客,怎麼去解決iphoneX底部自適配的,最通用還是去用css的env(safe-area-inset-bottom)樣式去解決,具體的用法我就不多說了,大家可以看下csdn env ,今天在畫公司的ui圖的時候遇到下面這幾種情況:

  1. 距離底部用固定定位或者絕對定位寫的
    在這裏插入圖片描述
  2. 距離底部用margin-bottom寫的
    在這裏插入圖片描述
  3. 距離底部用padding-bottom並且帶背景色寫的
    在這裏插入圖片描述
    那麼問題來了,剛開始的時候我會想,利用scss中minxin結合css屬性env(safe-area-inset-bottom)寫成一個混合函數傳入參數解決。最終沒成功。最後想着還是用指令解決問題,爲了後面的人知道怎麼用,不用每次添加safe-area-inset-bottom屬性,這樣的操作。下面就是我實現的具體過程

1.全局自動化加載指令

1.1 在src新建directives文件夾,並且新建index.js

在這裏插入圖片描述
代碼如下,特別注意的我採用的是vw的形式去做適配,具體的計算方法爲100vw/設計稿的寬度 * 設計稿的元素像素,比如說我們ui的設計稿是375,我一個盒子的寬度是75px,那麼我得到自適應寬度爲 100vw/375 * 75
type主要是三種傳參bottom,padding,margin分別對應我上面的三種情況
src/directives/index.js

/**
 * @description fitIphoneX 主要是爲了適配iphoneX自適配的問題,可以設置padding,maring,bottom
 * @params setValue 需要設置的值  | type 設置的類型,比如說padding
 * @useage  v-fitIphoneX="{ type: 'padding', pxNum: 10 }"
 */
const fitIphoneX = {
  bind(el, binding) {
    let ua = window.navigator.userAgent
    let isIos = !!ua.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)
    let designWidth = 375 // 設計稿高度
    let iphoneXNum = (binding.value.pxNum || 30) + 34
    let setValue = (100 / designWidth) * iphoneXNum // 轉化成vw
    if (isIos) {
      if (window.screen.height === 812 && window.screen.width === 375) {
        // 在iphonex 中
        switch (binding.value.type) {
          case 'padding':
            el.style.paddingBottom = `${setValue}vw`
            break
          case 'margin':
            el.style.marginBottom = `${setValue}vw`
            break
          default:
            el.style.bottom = `${setValue}vw`
            break
        }
      }
    }
  }
}

export default {
  fitIphoneX
}

1.2 在main.js引入directives/index,用Object.keys()遍歷,然後循環,用Vue.directive指定插入指定

main.js

import directives from './directives'
Object.keys(directives).forEach(item => {
  // console.log( directives[item])
  Vue.directive(item, directives[item])
})

2.使用

其實後面如果需要iphonex的頂部適配可以使用動態指令,分是頂部還是底部

<div
      class="sticky-box"
      v-fitIphoneX="{ type: 'padding', pxNum: 10 }"
    >
</div>

這樣使用起來還比較簡單的。大家可以試一下。

發佈了33 篇原創文章 · 獲贊 24 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章