移動端 iphonex适配
(一)簡介
iphoneX,螢幕頂部都有一個齊劉海,iPhoneX 取消了實體按鍵,改成底部小黑條,如果不做适配,這些地方就會被遮擋,是以本文講述下齊劉海與底部小黑條的适配方法
對于網頁而言,頂部(劉海部位)的适配問題浏覽器已經做了處理,是以我們隻需要關注底部與小黑條的适配問題即可(即常見的吸底導航、傳回頂部等各種相對底部 fixed 定位的元素)。
處理前後效果圖:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL4NGVPpXRU9EeRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0EDOzQjNzATM3EjNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
(二)幾個重要概念
安全區域:
一個可視視窗範圍,處于安全區域的内容不受圓角(corners)、齊劉海(sensor housing)、小黑條(Home Indicator)影響。
viewport-fit:
iOS11 新增特性,蘋果公司為了适配 iPhoneX 對現有 viewport meta 标簽的一個擴充,用于設定網頁在可視視窗的布局方式,可設定 三個值:
auto\contain\cover
auto\contain: 可視視窗完全包含網頁内容(左圖)。頁面内容顯示在safe area内
cover:網頁内容完全覆寫可視視窗(右圖)。頁面内容充滿螢幕。
constant 函數:
iOS11 新增特性,Webkit 的一個 CSS 函數,用于設定安全區域距離邊界的距離,有四個預定義的變量(機關是px):
body {
padding-top: constant(safe-area-inset-top);
padding-top: env(safe-area-inset-top);
padding-left: constant(safe-area-inset-left);
padding-left: env(safe-area-inset-left);
padding-right: constant(safe-area-inset-right);
padding-right: env(safe-area-inset-right);
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
}
注意:
1)需要适配 iPhoneX 必須設定 viewport-fit=cover,不然 constant 函數是不起作用的,這是适配的必要條件
2)env() 是官方文檔中提到将來要替換 constant (),目前還不可用。
為此目前我們可以看作 constant:針對iOS < 11.2以下系統,env:針對于iOS >= 11.2的系統
使用的時候 env() 必須寫在 constant () 後面
(三)适配方案
第一步:設定網頁在可視視窗的布局方式 (viewport-fit=cover")
第二步:頁面主體内容限定在安全區域内
body {
padding-top: constant(safe-area-inset-top);
padding-top: env(safe-area-inset-top);
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
}
第三步:相對底部 fixed 定位的元素适配
1、fixed吸底 元素(bottom = 0)
<div class="footer ipx-padding-safe-area"></div>
// 或者
<div class="footer ipx-height-safe-area"></div>
// 或者
<div class="footer ipx-margin-safe-area"></div>
<div class="ipx-footer-safe-area"></div>
/* 通過加内邊距 padding 擴充高度 */
.ipx-padding-safe-area{
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
}
/* 通過計算函數 calc 覆寫原來高度 */
.ipx-height-safe-area{
height: calc(1rem + constant(safe-area-inset-bottom));
height: calc(1rem + env(safe-area-inset-bottom));
}
/* 通過加外邊距 margin 增加底部距離 */
.ipx-margin-safe-area{
margin-bottom: constant(safe-area-inset-bottom);
margin-bottom: env(safe-area-inset-bottom);
}
/*
以上方式需要吸底條必須是有背景色的,因為擴充的部分背景是跟随外容器的,否則出現镂空情況。
還有一種方案就是,可以通過新增一個新的元素(空的顔色塊,主要用于小黑條高度的占位),然後吸底元素可以不改變高度隻需要調整位置
*/
.ipx-footer-safe-area{
position: fixed;
bottom: 0;
width: 100%;
height: constant(safe-area-inset-bottom);
height: env(safe-area-inset-bottom);
background-color: #fff;
}
2、fixed 非完全吸底元素(bottom ≠ 0),比如 “傳回頂部”、“側邊廣告” 等
第四步:使用 @supports 隔離相容樣式(可有可無)
@supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {
/* 通過加内邊距 padding 擴充高度 */
.ipx-padding-safe-area{
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
}
...
}