精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

我們一起聊聊如何巧妙應對iOS鍵盤難題?

移動開發 iOS
在移動端上,我們的H5頁面一般是運行在宿主APP提供的webview中,簡單點理解,你其實可以把它當作瀏覽器,就是用來展現頁面內容的。目前移動端主流系統分為Android與iOS,然而兩者提供的webview容器也存在著諸多差異,今天我們就只探討兩者軟鍵盤帶來的影響。

前言

寫過移動端的同學或多或少都遇到過軟鍵盤帶來的各種各樣的問題,最典型的就是輸入框被軟鍵盤遮擋、fixed元素失效等問題,并且這些問題在iOS上的表現讓人難以接受。

webview的差異

在移動端上,我們的H5頁面一般是運行在宿主APP提供的webview中,簡單點理解,你其實可以把它當作瀏覽器,就是用來展現頁面內容的。目前移動端主流系統分為Android與iOS,然而兩者提供的webview容器也存在著諸多差異,今天我們就只探討兩者軟鍵盤帶來的影響。

首先,我們先來寫個簡單的頁面布局:頭部fixed+中間自適應+底部fixed

圖片圖片

Android

事實上Android的表現并不會有太大問題,它只不過是在鍵盤彈起來之后把webview的高度減小了,變成了:原來的webview高度減去鍵盤的高度

圖片圖片

這樣的表現正是我們期待的,完全沒有影響整個頁面的布局

iOS

軟鍵盤

在iOS 8.2 之后,iOS 唯一指定瀏覽器內核、Webkit 鼻祖 Safari 將 fixed 元素的布局基準區域從鍵盤上方的可見區域改成了鍵盤背后的整個視窗,也就是說此時的webview高度并不會發生變化,鍵盤是直接蓋在webview上方的。

這樣是為了在鍵盤彈起來之后,不用重新渲染頁面,他們是方便了,但遭殃的是我們前端開發人員...

比如上面這個頁面,我們看看iOS的表現是怎樣的:

圖片圖片

可以看到,iOS為了不讓webview壓縮,并且為了不讓軟鍵盤遮擋輸入框,他們自作聰明地把webview整體往上移動,最大移動距離為軟鍵盤的高度。

這樣就導致我們的頭部以及頁面上半部分內容移動到了可視區之外,這個表現是難以接受的,至少頭部應該還要在可視區。(這就會讓我們誤以為fixed失效,實際上它相對于webview的位置并沒有變,只不過是webview發生了移動)

這個移動似乎沒有邏輯,不信大家可以試試把輸入框放到頁面的各個位置,我發現只有輸入框在最頂部,webview才不會發生上移,其它位置都或多或少的會產生移動。

還有一個問題就是,此時的webview是可以滑動的,那么就會出現有用戶會將輸入框滑動到鍵盤下方,想想這個體驗也是難以接受的...

圖片圖片

并且你會發現,在頁面的上方與下方都多出了一個不論是 Viewport 還是 VisualViewport 都無法到達的白色襯底區域,我們可以嘗試把頁面所有元素背景都改成黑色再來看,會更加明顯

圖片圖片

看到這些奇奇怪怪的問題你心里作何感想??

所有問題產生的根本原因是:iOS為了不用在鍵盤彈起之后重新渲染頁面,他們并沒有去壓縮webview容器的高度,而是對webview整體進行平移處理

軟鍵盤監聽

對于Android,我們通常可以通過監聽resize事件來實現,但對于iOS,我們從上面了解到鍵盤彈起,iOS的webview高度并不會發生變化,所以也就觸發不了resize事件。

在iOS中,可以通過focusin & focusout事件來進行監聽

export const watchKeyBoard = (callback: (isShow: boolean) => void) => {
  //  IOS
  if (isIOSByUA()) {
    document.body.addEventListener('focusin', () => {
      //軟鍵盤彈出的事件處理
      callback(true)
    })
    document.body.addEventListener('focusout', () => {
      //軟鍵盤收起的事件處理
      callback(false)
    })
  } else {
    //  Android
    const originalHeight =
      document.documentElement.clientHeight || document.body.clientHeight
    window.addEventListener('resize', () => {
      const resizeHeight =
        document.documentElement.clientHeight || document.body.clientHeight
      if (resizeHeight - 0 < originalHeight - 0) {
        // 鍵盤彈起事件
        callback(true)
      } else {
        // 鍵盤收起事件
        callback(false)
      }
    })
  }
}

解決方案

了解完產生問題的原因,我們就可以來嘗試著解決問題,但想要純前端去解決這個問題,或多或少都會存在一些體驗問題,也許你可以去推動你們的客戶端同學來協助處理這個問題,只要讓iOS的webview在鍵盤彈起時的表現與Android一致,就不會存在這些奇怪的問題了,但似乎他們處理起來也非常棘手...

模仿Android的處理

雖然我們改不了webview的高度,但我們可以改我們布局的高度,我們只需要將頁面高度改為頁面可視區的高度即可,如果頁面內容有滾動交互的話,需要額外處理,要與webview的滾動隔離開。

VisualViewport

先來了解下這個API,它可以用來獲取對應 window 的視覺視口

  • VisualViewport.offsetLeft :返回視覺視口的左邊框到布局視口的左邊框的 CSS 像素距離。
  • VisualViewport.offsetTop:返回視覺視口的上邊框到布局視口的上邊框的 CSS 像素距離。
  • VisualViewport.pageLeft:返回相對于初始的 viewport 屬性的 X 軸坐標所對應的 CSS 像素數。
  • VisualViewport.pageTop:返回相對于初始的 viewport 屬性的 Y 軸坐標所對應的 CSS 像素數。
  • VisualViewport.width:返回視覺視口的寬度所對應的 CSS 像素數。
  • VisualViewport.height:返回視覺視口的高度所對應的 CSS 像素數。
  • VisualViewport.scale:返回當前視覺視口所應用的縮放比例。

這里我們需要的就是這個VisualViewport.height,用來獲取可視區的高度。

但需要注意的是,這個API最低只支持iOS13,ios13以下的使用window.innerHeight兜底

頁面布局

整體布局采用flex布局,頭部和底部也就不需要fixed來定位了,中間自適應撐滿剩余高度,超長滾動

圖片圖片

鍵盤打開計算高度重新布局

我們需要在鍵盤彈起后,計算可視區的高度,并將最外層容器高度賦值為可視區高度

watchKeyBoard((status) => {
  setTimeout(() => {
    console.log(
      'status',
      status ? '鍵盤打開' : '鍵盤關閉',
    )
    const container = document.getElementById('container')
    if (status) {
      container.style.height = `${
      window.visualViewport.height || window.innerHeight
    }px`
      window.scrollTo(0, 0)
    } else {
      container.style.height = `100vh`
      document.removeEventListener('touchmove', this.stopMove)
    }
  }, 100)
})

這樣頁面展示算是正常了

圖片

但是隨之而來的是滾動問題??

圖片圖片

處理滾動

我們需要禁用全局的滾動,但對一些需要滾動的區域需要放開,比如中間的列表部分

if (utils.isIOSByUA()) {
  watchKeyBoard((status) => {
    setTimeout(() => {
      console.log(
        'status',
        status ? '鍵盤打開' : '鍵盤關閉',
        window.innerHeight,
      )
      const container = document.getElementById('container')
      if (status) {
        container.style.height = `${
        window.visualViewport.height || window.innerHeight
      }px`
        window.scrollTo(0, 0)
        document.addEventListener('touchmove', this.stopMove, {
          passive: false,
        })
        document.addEventListener('touchend', this.scroll)
      } else {
        container.style.height = `100vh`
        document.removeEventListener('touchmove', this.stopMove)
        document.removeEventListener('touchend', this.scroll)
      }
    }, 100)
  })
}
stopMove(e) {
 // 排除可以滾動的區域
  if (['content', 'keyboard_center'].includes(e.target?.className)) return
  e.preventDefault()
}
scroll() {
  window.scrollTo(0, 0)
}

完整體驗如下

圖片圖片

比起它原本帶來的遮擋、滾動、fixed失效等體驗,現在的體驗算是可以接受的(這里所有的操作我們只需要在iOS上執行即可)

責任編輯:武曉燕 來源: 前端南玖
相關推薦

2022-03-17 08:54:59

軟件系統重構

2024-11-27 16:07:45

2024-09-30 09:33:31

2023-06-30 08:18:51

敏捷開發模式

2023-08-10 08:28:46

網絡編程通信

2023-08-04 08:20:56

DockerfileDocker工具

2022-05-24 08:21:16

數據安全API

2023-09-10 21:42:31

2024-09-09 00:00:00

編寫技術文檔

2023-04-03 00:09:13

2024-02-20 21:34:16

循環GolangGo

2021-08-27 07:06:10

IOJava抽象

2024-12-10 00:00:25

2021-12-10 07:45:48

字節音頻視頻

2024-07-26 09:47:28

2022-10-08 00:00:05

SQL機制結構

2022-02-23 08:41:58

NATIPv4IPv6

2022-09-22 08:06:29

計算機平板微信

2024-11-28 09:57:50

C#事件發布器

2021-08-12 07:49:24

mysql
點贊
收藏

51CTO技術棧公眾號

国产一级理论片| 欧美激情在线一区二区| 亚洲日本欧美天堂| 热门国产精品亚洲第一区在线| 伊人久久大香线蕉综合75| 久久久久久久国产视频| 久久久久黄色| 久久久午夜精品理论片中文字幕| 欧美日韩国产91| 日日干夜夜操s8| 欧美在线一卡| 秋霞一区二区| 国产精品私人影院| 欧美在线一区二区三区四| 免费黄色片网站| 天堂电影一区| 成人免费高清在线| 久久夜色精品国产| 久久国产这里只有精品| 欧美精品videossex少妇| 韩国女主播成人在线观看| 一区二区三区四区在线观看视频| 欧美视频在线播放一区| 色窝窝无码一区二区三区成人网站| 综合激情一区| 日韩一区二区高清| 国产精品12p| 91禁在线观看| 欧美在线亚洲综合一区| 制服丝袜av成人在线看| 亚洲午夜精品久久久久久浪潮| 亚洲精品男人的天堂| 亚洲黄页网站| 一本久久a久久免费精品不卡| 国产欧美亚洲日本| 国产福利拍拍拍| 日本中文字幕在线一区| 欧美日韩中文字幕| 久久99欧美| 久久久免费高清视频| 牛夜精品久久久久久久99黑人| 国产亚洲一区精品| 日本 片 成人 在线| 国产无遮挡裸体视频在线观看| 成+人+亚洲+综合天堂| 97国产在线观看| 99久久久久久久久久| 久久久人成影片一区二区三区在哪下载| 91免费视频大全| 国产精品白嫩初高中害羞小美女| 国产极品视频在线观看| 国产精品视频一区二区三区综合 | 国产精品成人av在线| 日本熟妇色xxxxx日本免费看| 久久综合五月婷婷| 日韩欧美有码在线| 国产 日韩 亚洲 欧美| 加勒比一区二区三区在线| 另类人妖一区二区av| 欧美xxxx18国产| 亚洲精品第二页| 久久人体大尺度| 中文字幕中文字幕一区二区| 国产伦精品一区二区三| 国产一区二区视频免费| 91成人免费| 亚洲精品第一页| 日本888xxxx| 色婷婷在线播放| 久久久亚洲精品石原莉奈| 久久久久久久久久码影片| 天天摸天天碰天天爽天天弄| 不卡区在线中文字幕| 国产一区在线免费| 欧美xxx.com| 国产美女av一区二区三区| 欧美中文在线观看国产| 九九九在线观看| 亚洲女同在线| 欧美黄色成人网| 国产调教在线观看| 看全色黄大色大片免费久久久| 精品电影一区二区| 中文字幕12页| 日韩电影av| 亚洲va欧美va人人爽| 中文字幕乱码一区二区三区| 哥也色在线视频| 国产色综合一区| 国产精品日本一区二区| 日本福利在线观看| 中文字幕欧美日本乱码一线二线| 一区二区三区四区五区视频| 怡红院在线播放| 国产精品国产三级国产a| 国产又大又长又粗又黄| 成人性爱视频在线观看| av网站一区二区三区| 91成人伦理在线电影| 中文精品久久久久人妻不卡| 日韩一级大片| 久久久久久久爱| 国产1区2区3区4区| 国产精品久久久久蜜臀| 中文字幕不卡av| b站大片免费直播| 九九热爱视频精品视频| 精品电影一区二区三区| 成人无码av片在线观看| 一区二区三区午夜探花| 奇门遁甲1982国语版免费观看高清| 一区二区自拍偷拍| 三级欧美在线一区| 欧美日本高清一区| 久久久蜜桃一区二区| 国产一区二区伦理| 成人久久久久爱| 国产精品久久久久久免费 | 久久久国产视频91| 天天干天天舔天天操| 国一区二区在线观看| 欧美裸体男粗大视频在线观看| 影音先锋亚洲天堂| 一区二区久久| 91丝袜美腿美女视频网站| 97超视频在线观看| 久久免费精品国产久精品久久久久| 久久国产精品亚洲va麻豆| 777电影在线观看| 国产精品久久午夜夜伦鲁鲁| 水蜜桃亚洲精品| 在线免费观看黄色网址| 欧美日韩国产一区二区三区| 人妻精品无码一区二区三区 | 国产一区二区三区中文字幕 | 日韩一二在线观看| 国产又粗又猛又爽又黄av| 99re国产精品| 国产精品国产精品国产专区蜜臀ah | 青青草原国产在线| 欧美疯狂做受xxxx富婆| 亚洲最大天堂网| 四虎国产精品免费久久| 欧美一区二区在线免费播放| 中文字幕永久免费| 欧美精品中文字幕亚洲专区| 欧美大片第1页| 97国产成人无码精品久久久| 成人免费在线视频| a天堂资源在线观看| 精品极品在线| 精品国产凹凸成av人网站| 校园春色 亚洲| 国产麻豆成人传媒免费观看| 在线播放 亚洲| 涩涩涩久久久成人精品| 日韩在线视频网站| 国产亚洲小视频| 国产精品123区| 欧美成ee人免费视频| 麻豆tv入口在线看| 性做久久久久久免费观看欧美| wwwxxxx在线观看| 免费精品国产| 国产91色在线|免| 99国产精品久久久久久久成人| 99久久精品一区二区| 国内精品视频一区二区三区| 巨胸喷奶水www久久久| 日韩免费观看高清完整版| 高潮毛片无遮挡| 视频一区视频二区中文| 色噜噜狠狠色综合网| 粉嫩91精品久久久久久久99蜜桃| 精品国产乱子伦一区| 日本特黄特色aaa大片免费| 成人小视频免费观看| 成年人午夜免费视频| 欧美一区二区三区久久| 国产成人精品一区| 狠狠综合久久av一区二区| 中文字幕欧美国产| 中文字幕丰满乱码| 国语精品一区| 欧美日韩在线精品| 91九色美女在线视频| 欧美一区二区三区四区在线观看| 欧美人禽zoz0强交| 免费黄网站欧美| 欧美亚洲免费在线| jizz性欧美10| 亚洲国产欧美一区二区丝袜黑人 | 日产精品一区二区| 91国自产精品中文字幕亚洲| 国产成人av免费看| 国产精品久久久久久久久免费相片| 热久久久久久久久| 136国产福利精品导航网址| 成人欧美一区二区三区在线| 男人添女人下部高潮视频在线观看| 亚洲精品短视频| 91麻豆国产在线| 粉嫩av一区二区三区免费野| 日日操免费视频| 成人av手机在线观看| 国产精品无码一本二本三本色| 日韩手机在线| 欧美一区二区三区精品电影| 黄色小视频免费观看| 欧美影院一区二区三区| jizz中文字幕| 国产成人一级电影| 天天碰免费视频| 在线 亚洲欧美在线综合一区| 91九色蝌蚪嫩草| 欧美特黄aaaaaaaa大片| 欧美丰满片xxx777| 天堂中文8资源在线8| 欧美日韩aaaaaa| 精品在线观看一区| 激情综合一区二区三区| 久久美女福利视频| 久久不见久久见中文字幕免费| 91亚洲国产成人久久精品网站| 成人av三级| 欧美激情手机在线视频 | 无码人妻久久一区二区三区不卡| 亚洲欧美一区二区三区极速播放 | 久久久高清一区二区三区| 亚洲成a人无码| 欧美a级片一区| 色视频一区二区三区| 五月综合久久| 国产一区再线| 成人免费在线电影网| 97视频在线观看成人| 菠萝蜜视频国产在线播放| 国产午夜精品全部视频播放| 香蕉视频免费看| 欧美在线一区二区三区| av在线免费播放网址| xnxx国产精品| 蜜臀av一区二区三区有限公司| 成人免费精品视频| 久久久国产精品久久久| 国产又黄又大久久| 在线一区二区不卡| 欧美午夜精品| 精品伦精品一区二区三区视频| 欧美人体一区二区三区| 992tv成人免费影院| 免费在线中文字幕| 欧美高清在线观看| 天堂va在线| 欧美精品videosex牲欧美| 欧美色图天堂| 国内免费久久久久久久久久久 | 电影网一区二区| 日本久久久久久久久久久| 亚洲国产成人二区| 国产成人福利网站| 在线成人视屏| 国产欧美亚洲视频| av影院在线免费观看| 韩国一区二区电影| 在线黄色的网站| 欧美洲成人男女午夜视频| 日本电影欧美片| 国产精品嫩草影院久久久| 欧美xxxx视频| 97国产精品免费视频| 欧美成人ⅴideosxxxxx| 国产成人精品综合| 四虎成人精品一区二区免费网站| 51国偷自产一区二区三区的来源| 在线日韩成人| 国产精品一二三视频| 免费高潮视频95在线观看网站| 日韩一区av在线| 户外极限露出调教在线视频| 一区二区三区动漫| 中文字幕免费高清电视剧网站在线观看| 欧美麻豆久久久久久中文| 女厕盗摄一区二区三区| 国产精品视频网站| 日韩精品视频在线看| 久草精品电影| 97精品国产福利一区二区三区| 欧美12av| 97视频精品| 欧美一区二区视频在线播放| 久久狠狠婷婷| 欧美色图色综合| 蜜臀av一级做a爰片久久| 久久久久亚洲av片无码v| 久久久久综合网| 少妇人妻丰满做爰xxx| 五月天视频一区| 久久99久久98精品免观看软件| 国产精品久久久久9999吃药| 国产97免费视频| 日韩欧美极品在线观看| 国产乱码久久久| 亚洲毛片在线观看| 亚洲区小说区图片区| 最近2019中文免费高清视频观看www99| 午夜av在线播放| 国产精品久久久久久久久| 一区二区三区高清在线观看| 秋霞毛片久久久久久久久| 午夜日韩av| jizz大全欧美jizzcom| 99免费精品在线| 中国毛片直接看| 中文字幕一区三区| 亚洲综合一二三| 欧美一区二区福利视频| 国产精品一二三区视频| 亚洲天堂av综合网| 超碰在线影院| 97视频免费在线看| 视频在线亚洲| 不卡中文字幕在线| 免费观看在线综合| 丰腴饱满的极品熟妇| 精品久久久久久久久久国产| 国产极品久久久| 色婷婷综合久久久久| 日韩大尺度黄色| 玛丽玛丽电影原版免费观看1977 | 国产精品视频网站在线观看| 免费高清不卡av| 我不卡一区二区| 丁香五六月婷婷久久激情| 亚洲欧美黄色片| 免费不卡在线观看av| 日本精品久久| 亚洲午夜激情| 九九在线精品视频| 中文字幕一二三区| 成人欧美一区二区三区1314| 伊人久久亚洲综合| 中文字幕欧美日韩| 日韩影片中文字幕| 欧美日韩综合久久| 在线综合视频| 91av在线免费| 国产欧美视频一区二区| 国内精品福利视频| 国产视频精品xxxx| 免费黄色在线网站| 国产欧美日韩专区发布| 99久久夜色精品国产亚洲96| jizz大全欧美jizzcom| 国产精品美女一区二区| 在线播放一级片| 精品国产一区二区三区忘忧草 | 久久久久女教师免费一区| 日韩成人久久| 成人一级生活片| 成人三级在线视频| 国产成人精品a视频一区| 亚洲精品美女在线| 九七久久人人| 55夜色66夜色国产精品视频| 亚洲8888| 99久久国产宗和精品1上映| 中文无字幕一区二区三区| 亚洲天堂网在线观看视频| 久久国产精品影片| 第四色中文综合网| 一区二区三视频| 国产一区激情在线| 日本一区二区三区四区五区| 亚洲美女黄色片| 国产精品天堂蜜av在线播放| 久久av喷吹av高潮av| 国产不卡一区视频| 国产成人精品视频免费| 日韩午夜电影av| 牛牛精品一区二区| 亚洲日本一区二区三区在线不卡| 精品亚洲国产成人av制服丝袜| 欧美极品视频在线观看| 日韩av影视综合网| 99只有精品| 青青在线视频免费观看| 国内成人精品2018免费看| 欧美黄色一级网站| 亚洲人成在线观看网站高清| 欧美v亚洲v综合v国产v仙踪林| 欧美精品卡一卡二| 国产一区999| 中文字幕亚洲精品在线| 伊人亚洲福利一区二区三区| 日本高清久久| 亚洲爆乳无码专区| 2020国产精品久久精品美国| 国产污视频网站| 欧美成人免费观看|