亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > HTML5 > 正文

iPhoneX安全區域(Safe Area)底部小黑條在微信小程序和H5的屏幕適配

2024-09-05 07:23:22
字體:
來源:轉載
供稿:網友

最近寫小程序時,遇到了 iPhoneX 底部小黑線與內容重疊的問題,實際上是iPhoneX安全區域的適配問題,了解清楚這個問題花了挺多時間的,也實操出了結果,忍不住來總結總結。

前言

在蘋果 iPhoneX 、iPhone XR等設備上,可以看到物理Home鍵被取消,改為底部小黑條替代home鍵功能。微信小程序和 h5 網頁需要針對這種情況進行適配,否則可能會遇到底部按鈕或選項卡欄與底部黑線重疊的情況,如下圖。

1. 安全區域是什么意思?

想要解決內容與小黑線重疊的問題,我們需要先了解清楚蘋果對于安全區域的定義。

安全區域

安全區域指的是一個可視窗口范圍,處于安全區域的內容不受圓角(corners)、齊劉海(sensor housing)、小黑條(Home Indicator)的影響。

看看蘋果官方給的這2張圖就明白了,中間藍色區域即為安全區域。也就是說,適配安全區域也就是讓小程序或者H5的內容顯示在藍色區域部分。

同時安全區域是在IOS11之后并且是iPhoneX及以上機型才有的,所以需要適配的是這一類機型(為了方便,下文中統稱這類需要適配的機型為iPhoneX),更老的機型則不需要考慮適配問題。

2. 在微信小程序上適配安全區域

三種方案:

  • 使用已知底部小黑條高度34px/68rpx來適配(不推薦)
  • 使用微信官方API,getSystemInfo()中的safeArea對象進行適配(推薦)
  • 使用蘋果官方推出的css函數env()、constant()適配(推薦)函數env()、constant()適配(推薦)的css函數env()、constant()適配(推薦)

方案一:使用已知底部小黑條高度34px/68rpx來適配(不推薦)

這是比較老的方法,跟方案2、3比已經不推薦了,大家可以了解了解,著急可以直接看方案2和3。

從網上了解到,iPhone底部的小黑條(Home Indicator)高度是34px,實際我也在真機確認了是34px,所以可以根據該值,設置底部按鈕或選項卡的margin-bottom、padding-bottom、height等,或者添加一個div來占位小黑條的位置。

這樣做要有一個前提,需要判斷當前機型是需要適配安全區域的機型。

問題:如何判斷當前機型是需要適配安全區域

2種方案:

  • 使用wx.getSystemInfoSync()model屬性判斷
  • 使用wx.getSystemInfoSync()中的screenHeightsafeArea對象的bottom屬性判斷

方法一:使用wx.getSystemInfoSync()model屬性判斷

已知市面上已有的帶安全區域的蘋果設備包括iPhone X、iPhone XR、iPhone XS Max、iPhone 11、iPhone 11 Pro、iPhone 11 Pro Max,所以可以直接從getSystemInfoSync()方法中拿到model屬性進行判斷。iPhone系列微信還未適配手機的model返回值為unknown(iphone),也可以提前做適配。

let IPHONE_X = /iphone x/ilet IPHONE_X_11 = /iphone 11/ilet IPHONE_UNKNOWN = /unknown/(iphone/)/i//方法一:使用model判斷是否是IPhoneX及其他包含安全區域的機型手機const isIPhoneX = () => {  let model = wx.getSystemInfoSync().model  return (model.search(IPHONE_X) > -1 || model.search(IPHONE_X_11) > -1 ||    model.search(IPHONE_UNKNOWN) > -1)}//也可以使用正則表達式判斷const isIPhoneXRegex = () => {  let model = wx.getSystemInfoSync().model  return (/iphone/sx/i.test(model)    || (/iphone/i.test(model) && /unknown/.test(model))    || /iphone/s11/i.test(model)) }

方法二:使用wx.getSystemInfoSync()中的screenHeightsafeArea對象的bottom屬性判斷

這里使用screenHeight而不是windowHeight,因為bottom是以屏幕左上角為原點開始計算的,所以需要的是屏幕高度,對比screenHeightbottom,如果相等則說明不需要適配,不相等則需要適配。

注意:如果使用微信開發者工具中的模擬器,screenHeight和bottom始終是相等的,需要用真機來測試。

//方法二:使用wx.getSystemInfoSync()中的screenHeight和safeArea的bottom判斷const isIPhoneX = () => {  let screenHeight = wx.getSystemInfoSync().screenHeight  let bottom = wx.getSystemInfoSync().safeArea.bottom  return screenHeight !== bottom}

解決了如何判斷設備是iPhoneX的問題,就可以寫代碼了。

<view class="bottom-button {{isIpX ? 'view-IPX' : ''}}">底部按鈕</view>

方案二:使用微信官方API,getSystemInfo()中的safeArea對象進行適配(推薦)

使用wx. getSystemInfo()中的safeArea對象獲取底部小黑條的高度

step 1:使用上面講的方法先判斷是否是需要適配的iPhone機型
step 2:如果是需要適配的機型,使用safeArea中的bottom,得到安全區域底部縱坐標,然后使用screenHeight減去bottom就能得到小黑條的高度。保存到localstorage里面,全局都可以使用。

方案三:使用蘋果官方推出適配方案css函數env()、constant()來適配 (推薦)

蘋果官方推薦使用env(),constant()來適配,建議使用該方案,不需要管數值具體是多少。這2個方法是什么呢?

env()和constant(),是IOS11新增特性,Webkit的css函數,用于設定安全區域與邊界的距離,有4個預定義變量:

  • safe-area-inset-left:安全區域距離左邊邊界的距離
  • safe-area-inset-right:安全區域距離右邊邊界的距離
  • safe-area-inset-top:安全區域距離頂部邊界的距離
  • safe-area-inset-bottom :安全距離底部邊界的距離

因為目標是需要對底部小黑條做適配,所以只需要關注safe-area-inset-bottom這個值。

而env()和constant()函數有個必要的使用前提,當網頁設置viewport-fit=cover的時候才生效,根據微信小程序的表現和我在實際真機測試時這兩個函數生效,推測小程序里的viewport-fit默認是cover。

有一點要注意,在IOS11.2系統以前,可以使用constant()函數,但是在IOS11.2系統以后,這個函數就被廢棄了,被env()函數替代了。官方原話如下:

The env() function shipped in iOS 11 with the name constant(). Beginning with Safari Technology Preview 41 and the iOS 11.2 beta, constant() has been removed and replaced with env(). You can use the CSS fallback mechanism to support both versions, if necessary, but should prefer env() going forward.

所以我們在做屏幕適配時,需要這樣寫:

padding-bottom: constant(safe-area-inset-bottom); /*兼容 IOS<11.2*/padding-bottom: env(safe-area-inset-bottom); /*兼容 IOS>11.2*/

注意:env()和constant()需要同時存在,而且順序不能換。

3. 在H5上適配安全區域

在H5上適配安全區域就方便多了,采用viewport+env+constant方案。

viewport-fit 默認有3個值:

  • contain:可視窗口完全包含網頁內容(左圖)
  • cover:網頁內容完全覆蓋可視窗口(右圖)
  • auto:默認值,此值不影響初始布局視圖端口,并且整個web頁面都是可查看的。

contain和cover具體區別如下圖:

而我們需要將viewport設置為cover,env和constant才能生效。設置代碼如下:

<meta name="viewport" content="width=device-width,initial-scale=1.0,viewport-fit=cover">

同時設置env和constant代碼,同樣env()和constant()需要同時存在,而且順序不能換。

/* 可以通過增加padding-bottom來適配 */padding-bottom: constant(safe-area-inset-bottom); /*兼容 IOS<11.2*/padding-bottom: env(safe-area-inset-bottom); /*兼容 IOS>11.2*//* 可以通過margin-bottom來適配 */margin-bottom: constant(safe-area-inset-bottom);margin-bottom: env(safe-area-inset-bottom);/* 或者改變高度*/height: calc(55px +  constant(safe-area-inset-bottom));height: calc(55px +  env(safe-area-inset-bottom));

也可以在底部添加一個空白的div顏色塊來做適配。

還有一種是使用 @supports 隔離兼容樣式

可以使用 @supports 來隔離兼容樣式,當瀏覽器支持bottom: constant(safe-area-inset-bottom)或者bottom: env(safe-area-inset-bottom)的時候,bottom-button類就會新增margin-bottom的樣式

@supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {     .bottom-button {        margin-bottom: constant(safe-area-inset-bottom);        margin-bottom: env(safe-area-inset-bottom);      }}

以上就是我對iPhoneX安全區域(Safe Area)底部小黑條在微信小程序和H5適配的總結。

如果對你有幫助的話,點贊、評論、贊賞都是對我的鼓勵,也是支持我寫下去的動力,謝謝!

參考文章:

網頁適配 iPhoneX,就是這么簡單

蘋果官方開發者文檔關于屏幕適配的說明

微信小程序吸底區域適配iPhone X

微信小程序適配 iPhone X 總結

到此這篇關于iPhoneX安全區域(Safe Area)底部小黑條在微信小程序和H5的屏幕適配的文章就介紹到這了,更多相關iPhoneX底部H5的屏幕適配內容請搜索武林網以前的文章或繼續瀏覽下面的相關文章,希望大家以后多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产午夜精品麻豆| 久久99久国产精品黄毛片入口| 欧美视频在线观看免费| 国产精品国模在线| 亚洲丝袜一区在线| 国产成人精品在线播放| 91九色综合久久| 久久九九有精品国产23| 中文字幕日韩欧美在线视频| 欧美高清视频在线| 欧美大尺度在线观看| 一区二区亚洲精品国产| 国内精品模特av私拍在线观看| 欧美成人免费观看| 中文字幕精品av| 国产精品都在这里| 久久久久久久久久国产精品| 日韩免费黄色av| 欧美大片大片在线播放| 久久精品成人动漫| 日韩av网站电影| 午夜精品久久久久久久99热浪潮| 亚洲黄页视频免费观看| 免费成人高清视频| 激情久久av一区av二区av三区| 亚洲精品欧美日韩专区| 亚洲色图美腿丝袜| 色综合91久久精品中文字幕| 欧美日韩综合视频网址| 国产成人精品网站| 欧美日韩国产一区二区三区| 欧美日韩久久久久| 国产精品日韩欧美| 日韩欧美在线视频日韩欧美在线视频| 精品久久久久久久大神国产| 91av在线播放视频| 久久亚洲精品国产亚洲老地址| 国产视频久久久| 欧美国产亚洲精品久久久8v| 91精品视频在线| 久久久国产视频91| 北条麻妃一区二区三区中文字幕| 色妞一区二区三区| 午夜精品福利在线观看| 亚洲福利在线视频| 6080yy精品一区二区三区| 亚洲最大福利视频网| 亚洲午夜精品久久久久久久久久久久| 成人性生交大片免费看视频直播| 国产午夜精品一区二区三区| 亚洲电影在线观看| 成人黄色片网站| 91美女片黄在线观| 日韩中文字幕久久| 少妇高潮久久久久久潘金莲| 欧美综合在线第二页| 91在线免费观看网站| 狠狠色狠狠色综合日日五| 亚洲欧美中文在线视频| 亚洲免费影视第一页| 国产精品久久久一区| 亚洲天堂成人在线视频| 国产亚洲精品久久久久动| 国产精品网红直播| 久久久精品中文字幕| 国产亚洲视频中文字幕视频| 国产精品久久久久久久久久ktv| 国产午夜精品视频免费不卡69堂| 亚洲精品美女久久| 精品高清美女精品国产区| 中文字幕一区二区精品| 日日狠狠久久偷偷四色综合免费| 亚洲欧洲美洲在线综合| 91精品在线观看视频| 91亚洲国产成人久久精品网站| 国产国语刺激对白av不卡| 国产伦精品免费视频| 91视频免费网站| 最新国产成人av网站网址麻豆| 成人观看高清在线观看免费| 91精品视频免费看| 中文字幕av一区中文字幕天堂| 亚洲一区二区久久久久久久| 久久久91精品国产一区不卡| 国产精品视频精品视频| 国产成+人+综合+亚洲欧美丁香花| 亚洲午夜女主播在线直播| 久久久久久久久久久久av| 91九色在线视频| 成人欧美在线观看| 免费av在线一区| 国产成人在线一区二区| 亚洲综合中文字幕68页| 一区二区av在线| 久久国产精品首页| 一个人看的www久久| 色综合老司机第九色激情| 国产精品高精视频免费| 国产精品久久久久一区二区| 亚洲成人av片| 日韩一级裸体免费视频| 5566成人精品视频免费| 中文字幕精品影院| 欧美亚洲激情在线| 亚洲色图激情小说| 亚洲国产美女精品久久久久∴| 国产精品久久久久久久久免费看| 日韩成人在线视频网站| 亚洲欧美日韩精品久久亚洲区| 91成人福利在线| 欧美二区乱c黑人| 日韩在线免费视频观看| 欧美裸体xxxx极品少妇| 一色桃子一区二区| 亚洲а∨天堂久久精品9966| 91av成人在线| 中文字幕九色91在线| 亚洲欧洲国产精品| 热门国产精品亚洲第一区在线| 麻豆一区二区在线观看| 91高清免费视频| 国产日本欧美在线观看| 日韩美女主播视频| 欧美片一区二区三区| 亚洲欧美精品在线| 亚洲aaa激情| 91精品国产综合久久久久久久久| 亚洲精品久久久久久久久久久久久| 久久精品亚洲一区| 欧美成年人在线观看| 欧美精品第一页在线播放| 欧美国产第一页| 欧美一级黄色网| 一二美女精品欧洲| 国产99视频在线观看| 日韩精品在线观看网站| 久久亚洲电影天堂| 一区二区三区视频在线| 久久亚洲精品一区| 国产精品久久久| 亚洲精品自拍视频| 一区二区三区 在线观看视| 欧美日韩视频在线| 97碰碰碰免费色视频| 精品在线观看国产| 日产精品久久久一区二区福利| 91av在线精品| 国产成人亚洲综合青青| 欧美高清激情视频| 亚洲精品中文字幕有码专区| 欧美成人免费全部观看天天性色| 欧美日韩国产精品专区| 视频一区视频二区国产精品| 国产福利视频一区| 亚洲精品成人久久电影| 久久精品2019中文字幕| 欧美性猛交xxxxx免费看| 国产ts人妖一区二区三区| 久久久久久久网站| 国产精品入口夜色视频大尺度| 日本韩国欧美精品大片卡二| 伊人男人综合视频网| 欧美激情手机在线视频| 国产在线播放91|