h5頁面適配iPhone X的方法
專案接近尾聲,測試時突然想起還有iphoneX需要適配,雖然頁面都是自適應,但是由於iPhone X的特殊性,還是需要特殊對待。因為這個h5專案嵌入在原生專案中,適配就會有有種方式:1.在原生中用原生的的方法適配 2.在前端頁面中用h5的方式適配。
一.原生適配iphoneX
原生適配很簡單,檢視機型圖:
只要用
#define KIsiPhoneX ([UIScreen mainScreen].bounds.size.height>800.0f
判斷是iPhone X的機型時,就在控制器的頂端,和底部留出 44px和34px的距離,然後webView裝在這個控制器內就OK!
優點:在原生中適配,h5頁面不用更改任何一句程式碼。
缺點:1)意味著如右圖某些通欄頁面無法實現,
2)頂部和底部顯色固定,無法適應頁面顏色,(王者榮耀用連結地址傳遞引數的形式在原生中完美適配,不太明白原理)
一.h5頁面適配iphoneX
1.viewport-fit適配方案
PhoneX的適配,在iOS 11中採用了viewport-fit的meta標籤作為適配方案;viewport-fit的預設值是auto。css 函式 env() 和 constant()這兩個函式都是 webkit 中 css 函式,可以直接使用變數函式,只有在 webkit 核心下才支援
env 函式
必須在 ios >= 11.2 才支援
constant 函式
必須 ios < 11.2 支援
viewport-fit取值如下:
safe-area-inset-top :視口頂部到安全區域的距離(以CSS畫素為單位),一般情況下是 0。
safe-area-inset-right :視口最右邊到安全區域的距離(以CSS畫素為單位),一般情況下是 0。
safe-area-inset-left :視口最左邊到安全區域的距離(以CSS畫素為單位)在劉海全屏的時候 top 為 88px
。
safe-area-inset-bottom :視口底部到安全區域的距離(以CSS畫素為單位)劉海全屏的條件下是 34px
constant() 是CSS的函式,可以把以上幾個距離轉換成我們常用的屬性值。
1) 當我們設定viewport-fit:contain,也就是預設的時候時;設定safe-area-inset-left, safe-area-inset-right, safe-area-inset-top和 safe-area-inset-bottom等引數時不起作用的。
2).當設定viewport-fit:cover時,具體使用方法為
<meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover">
body {
padding-top: constant(safe-area-inset-top); //為導航欄+狀態列的高度 88px
padding-top: env(safe-area-inset-top); //為導航欄+狀態列的高度 88px
padding-left: constant(safe-area-inset-left); //如果未豎屏時為0
padding-left: env(safe-area-inset-left); //如果未豎屏時為0
padding-right: constant(safe-area-inset-right); //如果未豎屏時為0
padding-right: env(safe-area-inset-right); //如果未豎屏時為0
padding-bottom: constant(safe-area-inset-bottom); //為底下圓弧的高度 34px
padding-bottom: env(safe-area-inset-bottom); //為底下圓弧的高度 34px
}
2.媒體查詢
@media screen and (device-width:375px) and (device-height:812px){
//在這裡做iPhone X的判斷
// #app {
//margin-top: 88px;
//}
}
[email protected] 隔離相容模式
@supports (bottom: env(safe-area-inset-top)) or (bottom: env(safe-area-inset-top)) {
/*在這裡做iphoneX的判斷*/
/*#app {*/
/*margin-top: 88px;*/
/*}*/
}
因為每個專案的具體寫法不同,只提供方法,具體使用自己選擇!
可以參考: https://vip.kingdee.com/article/9707