移动端调起软键盘导致 position:fixed 偏移

移动端调起软键盘导致 position:fixed 偏移,第1张

概述1. 问题描述 app内打开H5页面,页面包含input输入框,点击input调起软键盘,输入完成点击下方提交按钮d出toast时,会出现t toast 跳动的现象,其中:toas 1. 问题描述

app内打开H5页面,页面包含input输入框,点击input调起软键盘,输入完成点击下方提交按钮d出toast时,会出现t toast 跳动的现象,其中:toast采用 position: fixed 进行固定定位

 

2. 分析原因关于 position: fixed

首先来看,MDN 中对 position: fixed 的说明:

不为元素预留空间,而是通过指定元素相对于屏幕视口(vIEwport)的位置来指定元素位置。元素的位置在屏幕滚动时不会改变。

注意到,position: fixed 是相对屏幕视口(vIEwport)的位置来定位的。 那么toast跳动是否是因为 vIEwport 的改变呢?

 

关于 vIEwport

MDN 中对 vIEwport 的说明:

@vIEwport 规则让我们可以对文档的大小进行设置 vIEwport 。这个特性主要被用于移动设备。 按百分比计算尺寸的时候,就是参照的初始视口(vIEwport)。初始视口指的是任何用户代理和样式对它进行修改之前的视口。桌面浏览器如果不是全屏模式的话,一般是基于窗口大小。

在移动设备上(或者桌面浏览器的全屏模式),初始视口通常就是应用程序可以使用的屏幕部分。它可能是全屏或者减去由 *** 作系统或者其它应用程序所占用的部分(例如状态栏)。

我们注意到,vIEwport 是会随着 *** 作系统或者应用程序占用而变化的,那是不是在调起软键盘的时候,改变了vIEwport 呢

 

验证猜想

Js 提供了Window.innerHeight 方法,用来获取浏览器窗口的视口高度。
经过验证,在调起软键盘时,确实改变了vIEwport ,此时的视口高度是 我们看到的可视屏幕高度-键盘高度,所以我们看到的toast跳动是因为 vIEwport的改变而导致

 

3. 解决办法

通过绝对定位position: absolute 来替代 position: fixed

通常 toast 是直接插入到body元素下面的(当然可以是别的任何元素),即 toast 是body元素的直接子元素,因此,可以设置toast 相对body元素进行绝对定位。

代码如下:

body {    position: relative;}.toast {   //  固定屏幕中间    position: absolute;    top: 50%;     left: 50%;    transform: translate3d(-50%,-50%,0);}

东莞vi设计https://www.houdianzi.com/dgvi/ 豌豆资源网站大全https://55wd.com

4. 注意事项

在使用通过绝对定位position: absolute 来替代 position: fixed的解决方案时,如果top、left 设置百分比,就需要注意设置绝对定位元素的 offsetParent 的 height 及 wIDth 值。

因为,绝对定位是相对离它最近的position 属性值不为static的父元素(即 offsetParent )来进行定位,并且top、left 设置百分比是以offsetParent 的height 和 wIDth 来计算的。

比如上述动图中的例子,可以看到body的内容高度远远不到屏幕高度,因此想要实现 toast 在屏幕居中,就需要为 body元素设置合理的高度(通过设置 min-height 或者 height )。

上述例子的完整代码:

HTML{    height: 100%;  // 设置HTML为浏览器窗口高度(不设100%的话,HTML 高度就等于body的高度)}body {    position: relative;    min-height: 600px;  // 设置最小高度}.toast {   //  固定屏幕中间    position: absolute;    top: 50%;     left: 50%;    transform: translate3d(-50%,0);}
offsetParent 概念补充
The HTMLElement.offsetParent read-only property returns a reference to the object which is the closest (nearest in the containment hIErarchy) positioned containing element. If the element is non-positioned,the nearest td,th,table or the body is returned.

 

5. 总结

针对移动端调起软键盘导致 position:fixed 偏移的问题,可以通过绝对定位(position: absolute)替代固定定位( position:fixed)来曲线救国。 如果topleft 设置百分比,则同时注意设置绝对定位元素的 offsetParent 的height和 wIDth 值。

总结

以上是内存溢出为你收集整理的移动端调起软键盘导致 position:fixed 偏移全部内容,希望文章能够帮你解决移动端调起软键盘导致 position:fixed 偏移所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1028149.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存