Ipad中100vh 和 100%踩坑記

最近遇到了一個小bug,在ipad上編輯word文件的虛擬鍵盤收回時,會導致頁面的導航條隱藏,且頁面的下面會出現一塊空白

自己嘗試的解決方案

  • 通過focusin和focusout對虛擬鍵盤的彈入彈出進行監聽,但發現基本沒什麼用。我的理解是:focusin和focusout比較適合於監聽對於文本輸入框的鍵盤事件。

  • 通過比較screen.availHeight和screen.height進行比較。如果在虛擬鍵盤彈出時元素的高度等有變化,那麼可以嘗試通過這種方式判斷虛擬鍵盤是不是彈出來了.

  • 另一種方法是:監聽一個事件,比如我監聽的就是scroll事件,對會發生隱藏的元素設置scrollIntoView或者scrollIntoViewIfNeeded,通過設置不同的參數,可以使得作用的元素與視口的上面或下面對齊。

  • resizeObserver

  • MutationObserver 用來監聽DOM的變化,包括結構,屬性這些。

後來發現,是css屬性值的問題。


`<style>`

`#container {`

`display: flex;`

`width: 100vh;`

`height: 100vw;`

`}`

`#child {`

`    flex: 1;`

`    position: absolute;`

`    top: 0;`

`    left: 0;`

`    right:0 ;`

`    height: 100%;`

`    overflow: hidden;`

`}`

`</style>`

`<div  id = "container">`

 `<div  id = "child">`

 `</div>`

`</div>`

  • 這裏主要有兩點需要注意:

  • 在移動端設備中,尤其是ipad和iOS,100vh其實是比視口大,即100vh包含了下面的狀態欄的高度。

  • 另外,如上面的代碼所示,父元素設置了display:flex, 子元素設置了flex: 1,按理說,子元素設置了這個屬性之後,就和父元素的寬高相同了,但是要注意,在這裏,子元素還設置了position: absolute。我們看一下W3C的文檔怎麼說

即,flex容器中的絕對定位子元素會脫離flex佈局流,也就是說flex: 1對子元素來說已經失效了。因此他的高度爲絕對定位中的100%設置的高度,但是又設置了overflow:hidden,因此纔會在虛擬鍵盤隱藏時出現一部分空白,從而導致了導航條的隱藏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章