當前位置:
首頁 > 最新 > 剖析 iOS 11 網頁適配問題

剖析 iOS 11 網頁適配問題

前言

前天剛分享一個比較變態的交互實現:【第1062期】藉助CSS Shapes實現元素滾動自動環繞iPhone X的劉海。今日早讀文章由@鄧映山投稿分享。

正文從這開始~

北京時間 9 月 12 日凌晨,蘋果在喬布斯劇院發布了 iPhone X。iPhone X 正面的全面屏上方有一條劉海,對於如何適配 iPhone X,蘋果的 Human Interface Guidelines 文檔已經給出詳細的說明。

蘋果對於 iPhone X 的設計布局意見如下:

核心內容應該處於 Safe area 確保不會被設備圓角(corners),感測器外殼(sensor housing,齊劉海) 以及底部的 Home Indicator 遮擋。

本文將剖析兩則在 iPhone X 異形屏和 iOS 11 網頁適配中遇到的問題及解決方案。

iPhone X Safari 橫屏顯示左右白邊問題

iPhone X Safari 在橫屏狀態下,網頁左右兩側可能會出現白邊,如下:

因為 iPhone X 會將網頁內容顯示在 Safe area 導致的,解決這一問題,我們需要將背景顏色填充整個屏幕區域,而網頁內容處於 Safe area。

解決方案一:background-color

如果網頁設置了一個背景顏色,那麼最簡單解決方案是,在 body 節點設置 background-color,使背景顏色填充整個屏幕,從而解決橫屏顯示左右白邊的問題

解決方案二:viewport-fit + safe-area-inset-*

在 iOS 11 中蘋果為 Web 新增兩個內容 viewport-fit + safe-area-inset-*

注意:viewport-fit 和 safe-area-inset-* 只對於 WKWebView 有效,在 UIWebView 中無效

viewport-fit 用於設置網頁在可視窗口的布局方式

文檔:CSS Round Display Spec

這個屬性可設置為:

contain: The viewport should fully contain the web content. 可視窗口完全包含網頁內容

cover: The web content should fully cover the viewport. 網頁內容完全覆蓋可視窗口

auto: The default value, contain

對於 iPhone X 之前的 iPhone 設備屏幕為規則的矩形,網頁內容都可以完整展示;但是對於 iPhone X 是異形屏幕,通過 viewport-fit 可以設置網頁內容在可視窗口中的顯示規則,通過下圖可以輔助理解

我們知道默認情況下 viewport-fit=auto 即為 viewport-fit=contain,在 iPhone X 中,相當於網頁內容展示在 Safe area,這樣也就是橫屏顯示時出現白邊的原因了,所以我們可以設置 viewport-fit=cover 即可解決問題

注意到應用 viewport-fit=cover 之後,網頁右上角,menu 按鍵和 in 按鍵被圓角,感測器外殼(齊劉海)裁剪掉了

safe-area-inset-*

在設置 viewport-fit=cover 之後,Web 中會新增四個常量:

safe-area-inset-top

safe-area-inset-right

safe-area-inset-left

safe-area-inset-bottom

分別表示 Safe area 和可視窗口 viewport 頂部,右邊,左邊,底部的間距,可以用於設置 margin, padding, 或者絕對定位時 left, top

注意:在橫屏和豎屏狀態下,safe-area-inset-* 的值不同

為了解決應用 viewport-fit=cover 之後,有些顯示內容被裁剪的問題,我們可以通過添加邊距使得網頁主要內容處於 Safe area 中不被裁剪,解決方式如下:

padding:constant(safe-area-inset-top)constant(safe-area-inset-right)constant(safe-area-inset-bottom)constant(safe-area-inset-left);

iOS 11 WebView 中狀態欄問題

問題描述:

在 iOS 11 由於 safe area,狀態欄的表現有點不同。如果頁面頂部有一個 header bar,設置 position: fixed; top: 0px; 那麼頁面滾動過程中,會出現如下問題:

GIF/1353K

header bar 沒有固定在最頂部,上下滾動過程中,我們可以看到網頁內容從 status bar 下方穿過

重現問題:

創建一個 iOS 項目,視圖中添加一個 WKWebView,載入百度首頁

-(void)viewDidLoad{

[superviewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

WKWebView*webView=[[WKWebView alloc]initWithFrame:self.view.bounds];

[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.baidu.com"]]];

[self.view addSubview:webView];

}

剖析問題:

1、這個問題同樣也是由於 safe area 導致,雖然 header bar 位置信息為 position: fixed; top: 0px;,但這個位置也是相對於 safe area 而言的,所以看到 header bar 並沒有位於屏幕最頂部。 在 viewport meta 標籤,添加 viewport-fit=cover 即可解決此問題

雖然 header bar 固定到屏幕最上方,但是很明顯在 iPhone X 中卻被圓角和齊劉海裁剪了內容,這怎麼辦呢? 為 header bar 添加 padding-top 即可解決此問題

header{

/* ... */

/* Status bar height on iOS 10 */

padding-top:20px;

/* Status bar height on iOS 11+ */

padding-top:constant(safe-area-inset-top);

}

參考鏈接

Human Interface Guidelines-iPhone X

Removing the White Bars in Safari on iPhone X

Understanding the WebView Viewport in iOS 11

關於本文

作者:@鄧映山

原文:https://objcer.com/2017/09/21/Understanding-the-WebView-Viewport-in-iOS-11-iPhone-X/

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 前端早讀課 的精彩文章:

Redux 還是 Mobx,讓我來解決你的困惑!
服務端與客戶端同構——Vue.js 應用框架 Nuxt.js
高階函數:利用Filter、Map和Reduce來編寫更易維護的代碼
騰訊 Web UI 解決方案 QMUI Web——探索與沉澱
組件庫設計實戰-複雜組件設計

TAG:前端早讀課 |