移动端h5开发,华为手机输入法键盘影响页面布局的问题。

探讨了在华为手机上,当输入法弹出时,页面布局被挤压的问题及解决方案。通过监听输入框聚焦事件并调整body高度来解决布局变形。

在做移动端h5的时候,有些简单的页面,我们一般都会给body写上:

width:100%;
height:100%;

然后给一个满屏的背景图,简单方便的适应不同屏幕的手机。


有时候为了采集用户信息,页面上会放置几个input框让用户填写,那么问题就来了。
如图,一个100%布局的页面,上面有一个input





在input没有获得焦点(即没有弹出输入法)的时候,我们的华为手机和其他机型表现的都很完美





这是iphone的样式


别高兴的太早,我们点击input试试看





看起来Iphone好像也没什么问题,input获得了焦点,页面自动滚动到了合适的位置,将input正好置于页面的中间(请忽略那个安全警告,快下班了,截图截的很心急….)
那我们再来看看华为:





what the xxxx?整个页面感觉像被输入法给挤扁了,由于此时我的input是垂直&&水平居中的,所以跟随着被挤扁的body一起上来了,页面也不能滚动。
如果在实际场景中input使用top定位,则很有可能出现这种情况





果然,body已经装不下input了,是什么导致了这种情况?
借助vconsole工具看了一下,window,document,body,input等的容器的高度都没有发生变化,clientHeight,offsetHeight等的属性值也没有发生改变,暂且只能认为:


输入法的弹出并没有实际影响页面元素的数值,只是改变了屏幕的显示方式


所以看上去很扁的页面,实际上没有任何改变,如果有哪位大神深入研究过这个问题也请不吝赐教,但是话说回来,要怎么解决这个问题?


与上面的那个不一定正确的结论相悖的是:


如果在input获得焦点时,手动给body重新赋值,可以达到解决问题的效果

var h = window.innerHeight;
var myInput = document.getElementById('myInput');

myInput.addEventListener('focus',handler,false);

function handler(){
    $('body').height(h);
}



效果如下:





跟iphone上一样,input获得了焦点,页面自动滚动到了合适的位置,将input正好置于页面的中间。(这里的input是top定位,距离写死)


如果你使用的是bottom或者top距离使用的百分比,那么又会出问题,虽然看起来页面没有被挤扁,但是input的位置会改变,需要注意





不止输入法,部分华为机型屏幕下边会有虚拟键,也会产生类似的改变页面布局问题,我这里没有这些手机,不再贴图。


在面对华为用户时谨慎使用bottom定位以及百分比数值定位!
在面对华为用户时谨慎使用bottom定位以及百分比数值定位!
在面对华为用户时谨慎使用bottom定位以及百分比数值定位!


三遍!!!

### H5 页面在华为鸿蒙手机上出现闪屏问题的原因和解决方法 H5 页面在华为鸿蒙设备上运行时,可能会遇到屏幕闪烁的问题。这种现象通常与页面布局、软键盘弹出导致的视口变化、以及系统对 WebView 的渲染优化有关。以下从原因分析和解决方案两个方面进行详细说明。 #### 原因分析 - **软键盘弹出导致视口变化**:当 H5 页面中存在输入框(如 `<input>` 或 `<textarea>`)并触发软键盘弹出时,页面高度会发生变化,从而导致内容重新渲染并产生视觉上的“闪动”现象。这是由于部分设备浏览器在处理视口调整时未保持原有布局稳定性所致[^3]。 - **页面重绘频率过高**:如果页面中有频繁的 DOM 操作或动画效果,可能引发高频的重排重绘,进而造成视觉上的闪烁。 - **WebView 渲染机制差异**:鸿蒙系统中的 WebView 引擎可能与安卓或其他平台存在实现细节上的差异,尤其是在处理页面加载、缩放、滚动等行为时,可能导致特定场景下的视觉异常。 #### 解决方案 - **固定页面高度防止抖动** 在 Vue 等前端框架中,可以通过监听窗口大小变化事件,并在软键盘弹出时保持 `body` 高度不变,避免页面整体发生位移: ```javascript mounted () { window.onresize = () => { return (() => { document.body.style.height = document.body.clientHeight + 'px'; })(); }; } ``` 该方式通过固定页面容器的高度,有效减少因软键盘弹出而导致的视口变化带来的闪动问题[^3]。 - **使用 CSS 防止页面抖动** 在全局样式中添加如下 CSS 代码,可以防止页面因软键盘弹出而自动缩放: ```css html, body { height: 100%; overflow: hidden; } ``` 同时,在 JavaScript 中监听 `focus` 和 `blur` 事件,动态调整页面的 `height` 属性以适配软键盘状态: ```javascript document.querySelectorAll('input, textarea').forEach(el => { el.addEventListener('focus', () => { document.body.style.height = window.innerHeight + 'px'; }); el.addEventListener('blur', () => { document.body.style.height = 'auto'; }); }); ``` - **优化页面渲染性能** 对于频繁更新的页面元素,建议采用虚拟 DOM 技术或使用 `requestAnimationFrame` 来控制更新节奏,降低重绘频率。此外,避免在页面加载过程中执行大量同步脚本,可将非关键逻辑延迟执行或异步加载。 - **启用 WebView 硬件加速** 在原生应用中嵌入 H5 页面时,确保 WebView 启用了硬件加速功能,以提升渲染效率并减少卡顿和闪烁现象。可通过以下方式配置: ```java webView.getSettings().setHardwareAccelerated(true); ``` - **检测鸿蒙 WebView 特性并做兼容处理** 针对鸿蒙系统特有的 WebView 内核特性,建议在前端逻辑中识别用户代理(User-Agent),并对特定版本的鸿蒙 WebView 进行针对性优化,例如关闭自动缩放、强制使用固定宽度等策略。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值