在項目中,須要針對iphone的劉海屏幕進行單獨的適配,這就須要看如何檢測劉海屏幕了。並且,同一款機型,得出來的屏幕分辨率還有可能不一樣,下面把處理劉海屏中踩過的坑進行總結。bash
某些狀況下,咱們在樣式方面須要對iphone的劉海屏機型須要作特殊的處理。目前有三款劉海屏iphone,分別是iphoneX
、iphoneXR
、iphoneXS max
三種。其中三者的分辨率和像素比是不一樣的,並且iphoneXR
和iphoneXS max
兩款手機還能夠選擇放大
的顯示模式,所以理論上有兩種不一樣的分辨率。關於顯示模式的介紹能夠看下面的內容。iphone
具體的分辨率狀況以下:ui
設備 | 像素比(dpr) | 屏幕分辨率 | 放大模式 |
---|---|---|---|
iphoneX | 3 | 1125*2436 | 無 |
iphoneXs max | 3 | 1242*2688 | 1125*2436 |
iphoneXr | 2 | 828 *1792 | 750*1624 |
綜上特色,所以須要根據ua中的信息,判斷當前手機的平臺,以及根據當前獲取到的分辨率,推斷當前是否爲劉海機型。直接貼代碼:this
// 得到手機平臺
OS: (function() {
const userAgent = navigator.userAgent;
if (/\bAndroid\b/i.test(userAgent)) {
return 'Android';
} else if (
/\bip[honead]+\b/i.test(userAgent) ||
/\biOS\b/i.test(userAgent)
) {
return 'IOS';
}
return null;
}()),
// 判斷機型
let ratio = window.devicePixelRatio || 1;
let screen = {
width: window.screen.width * ratio,
height: window.screen.height * ratio
};
const isX = screen.width === 1125 && screen.height === 2436;
const isXSMAX = screen.width === 1242 && screen.height === 2688;
const isXR = (screen.width === 750 && screen.height === 1624 || screen.width === 828 && screen.height === 1792);
// 那麼判斷是不是劉海屏
const isIOS = this.OS === 'IOS';
return isIOS && (isX || isXSMAX || isXR);
複製代碼
iphone的放大模式原理是使用較低以及的邏輯分辨率渲染,而後拉伸顯示到屏幕上。spa
例如新機推出時,若是有新的分辨率時,有一種比較簡單的適配就是適配以前相同比例下面的小屏,例如plus機型適配到同數字的機型,max機型適配到X機型等等。code
iPhone的16:9的屏幕的邏輯分辨率,一共有三種:320×480,375×667,414×736,分別對應4'',4.7'',5.5''的屏幕。 對於4.7''和5.5''的屏幕來講,更低一級的邏輯分辨率分別是320×480和375×667。同時,只要App適配這兩個分辨率(固然是適配的),那麼不須要作任何修改,就能夠直接運行。好了,爲何iPhone X沒有放大模式呢?由於iPhone X沒有現成的更低一級的邏輯分辨率,若是強行加上,那麼幾乎所有App都要針對一個新的、只有在iPhone X的放大模式下才會出現的邏輯分辨率進行適配,這個成本實在是太大了。固然,iPhone XS Max上是有放大模式的,由於iPhone X的邏輯分辨率,就是iPhone XS Max放大模式下的邏輯分辨率,一樣不須要針對性適配。ip