移動(dòng)端安全區(qū)域適配方案
前言
什么是安全區(qū)域?
這個(gè)概念是蘋果??率先提出來(lái)的,因?yàn)閺膇Phone X開(kāi)始,iPhone正式進(jìn)入全面屏?xí)r代,iPhone手機(jī)也就開(kāi)始出現(xiàn)了劉海和底部的黑條的區(qū)域。Android不知道從什么時(shí)候開(kāi)始越來(lái)越喜歡模仿iPhone的設(shè)計(jì),這也就導(dǎo)致越來(lái)越多的機(jī)型都有這個(gè)安全區(qū)域的概念。
安全區(qū)域(safe area)
?
安全區(qū)域定義為視圖中未被導(dǎo)航欄、選項(xiàng)卡欄、工具欄或視圖控制器可能提供的其他視圖覆蓋的區(qū)域。
如上圖所示,安全區(qū)域?yàn)橹虚g藍(lán)色部分,也就是說(shuō)我們?cè)陧?yè)面布局時(shí)應(yīng)該保證頁(yè)面內(nèi)容在藍(lán)色安全區(qū)域內(nèi)。
所以對(duì)于這類機(jī)型,你如果不特殊處理,那么它將會(huì)是這樣的:
這樣就會(huì)導(dǎo)致底部輸入框的交互受影響
網(wǎng)頁(yè)布局方式(viewport-fit)
在處理安全區(qū)域之前,我們需要先來(lái)了解viewport-fit屬性,這是解決問(wèn)題的關(guān)鍵。
iOS帶來(lái)問(wèn)題的同時(shí)也帶來(lái)了解決問(wèn)題的方法,為了適配 iPhoneX等全面屏機(jī)型 對(duì)現(xiàn)有 viewport meta 標(biāo)簽進(jìn)行了擴(kuò)展,用于設(shè)置視覺(jué)視口的大小來(lái)控制裁剪區(qū)域。
用法
<meta name="viewport" cnotallow="width=device-width,initial-scale=1, user-scalable=0, viewport-fit=cover">
屬性值
該屬性包含三個(gè)值:
- auto:該值不會(huì)影響初始布局視口,并且整個(gè)網(wǎng)頁(yè)都是可見(jiàn)的。UA 在視口之外繪制的內(nèi)容是未定義的。它可以是畫布的背景顏色,或者 UA 認(rèn)為合適的任何其他顏色。(默認(rèn)值,與contain表現(xiàn)一致)
- contain:初始布局視口和視覺(jué)視口設(shè)置為設(shè)備顯示屏中內(nèi)接的最大矩形。UA 在視口之外繪制的內(nèi)容是未定義的。它可以是畫布的背景顏色,或者 UA 認(rèn)為合適的任何其他顏色。
- cover:初始布局視口和視覺(jué)視口設(shè)置為設(shè)備物理屏幕的外接矩形。
區(qū)別
在非矩形顯示器上(比如手表)設(shè)置視口邊界框的大小時(shí),我們必須考慮以下因素:
- 由于視口邊界框的面積大于顯示器的面積而導(dǎo)致的剪切區(qū)域
- 視口邊界框與顯示區(qū)域之間的間隙
contain
當(dāng)使用viewport-fit: contain時(shí),初始視口將應(yīng)用于顯示器的最大內(nèi)接矩形。
cover
當(dāng)使用viewport-fit: cover時(shí),初始視口將應(yīng)用于顯示器的外接矩形。
env
為了解決安全區(qū)域問(wèn)題,iOS 11 新增了一個(gè)新的 CSS 函數(shù)env()和四個(gè)預(yù)定義的環(huán)境變量
- safe-area-inset-left:安全區(qū)域距離左邊邊界距離
- safe-area-inset-right:安全區(qū)域距離右邊邊界距離
- safe-area-inset-top:安全區(qū)域距離頂部邊界距離
- safe-area-inset-bottom:安全區(qū)域距離底部邊界距離
?
iOS 11 中提供的 env() 函數(shù)名為 constant()。從 Safari 技術(shù)預(yù)覽版 41 和 iOS 11.2 beta 開(kāi)始,constant() 已被刪除并替換為 env()。如有必要,您可以使用 CSS 后備機(jī)制來(lái)支持這兩個(gè)版本,但以后應(yīng)該更喜歡使用 env()?!?來(lái)自webkit文檔
上面的意思是從iOS12開(kāi)始不再支持使用constant函數(shù),所以為了兼容處理,我們應(yīng)該這樣寫:
body {
padding-bottom: constant(safe-area-inset-bottom); /* 兼容 iOS < 11.2 */
padding-bottom: env(safe-area-inset-bottom); /* 兼容 iOS >= 11.2 */
}
使用該函數(shù)的前提是必須設(shè)置meta標(biāo)簽viewport-fit=cover ,并且對(duì)于不支持 env() 的瀏覽器,瀏覽器將會(huì)忽略它。
適配安全區(qū)域
第一步:
修改頁(yè)面布局方式
<meta name="viewport" content="width=device-width,initial-scale=1, user-scalable=0, viewport-fit=cover">
第二步:
底部適配
.keyboard_foot {
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
}
這樣安全區(qū)域問(wèn)題就解決了!