h5软键盘挡住输入框问题解决(android)
问题
移动端浏览器中的表单在部分android机型上测试,点击靠下的输入框时会遇到弹出的软键盘挡住输入框问题
ios可自身弹起(ios自身的调整偶尔也会出问题,例如第三方键盘会遮挡,原因是第三方输入法的tool bar或者键盘也被当做可视区域,这里不做讨论)
问题分析及解决办法确立
最常见的是使用两个方法:scrollIntoViewIfNeeded()、scrollIntoView(),使用方法自行百度。在我这里无效。
经测试发现android弹出键盘时有两种效果:
1.将activity挤压,键盘也占一部分activity空间;
2.键盘弹出在浏览器上面覆盖一层,不影响浏览器大小。
第二种会出现遮挡问题
于是想到以下两种方案:
1.通过动态增加页面高度和设置scrollTop来使输入框到达合适的位置
2.设置相对定位,通过top来使输入框到达合适的位置
影响实现的两个点:
1.js拿不到键盘的弹出和收起事件;
2.覆盖一层的键盘弹出方式不会触发window.resize事件和onscroll事件。
解决
第一种经试验有些问题影响了实现,这里只讨论第二种。
直接上代码,这里是react项目(css设置absolute配合js改变top实现效果,transition过渡增强用户体验,这里就不放了)
getElementOffsetTop(el) {
let top = el.offsetTop
let cur = el.offsetParent
while(cur != null){
top += cur.offsetTop
cur = cur.offsetParent
}
return top
}
componentDidMount() {
const u = navigator.userAgent
const isAndroid=u.indexOf('Android')>-1||u.indexOf('Linux')>-1;//android终端
// alert('android'+isAndroid)
if(isAndroid){ // android统一处理,不影响ios的自身处理
const body = document.getElementsByTagName('body')[0] // 兼容获取body
const regDom = document.querySelector('.wrapper_register') // 获取页面根元素
const content = document.querySelector('.content') // 表单内容部分
// const scrollHeight = body.scrollHeight // 网页文档高
// const scrollTop = body.scrollTop// 卷上去的高
const clientHeight = body.clientHeight //可见高
const fixHeight = clientHeight/3 // 定位高,弹出键盘时input距浏览器上部的距离,自己定义合适的
// 符合需弹出键盘的元素query
const queryStr = 'input[type="text"], input[type="tel"], input[type="password"], textarea'
const inputs = content.querySelectorAll(queryStr)
// console.log(inputs)
const offsetTopArr = Array.prototype.map.call(inputs,item=>{
return this.getElementOffsetTop(item) // offsetTop只能获取到顶部距它的offsetParent的距离,需此方法获取到元素距顶部的距离
})
inputs.forEach((item, i)=>{
item.addEventListener('focus',()=>{
// 改变top上移页面
regDom.style.top = '-' + (offsetTopArr[i] - fixHeight) + 'px'
})
item.addEventListener('blur',()=>{
// 恢复top
regDom.style.top = 0
})
})
}
}
效果基本实现,这里还有两个问题:
第一,如果下面的提交按钮是fixed,有些手机键盘弹出时会把按钮顶上来,如果上述代码中fixHeight设置不合适,会导致这个按钮遮挡输入框。所以为了统一效果,将底部按钮取消fixed,随页面滚动。
第二,如果点击键盘上的收起键盘按钮,会导致页面top无法恢复,因为没有触发输入框失焦方法,需点击空白处恢复。(目前没找到解决办法)
后续
1.由于android弹出键盘存在一定延迟,所以可以给top更改添加setTimeout,设置合适的延迟时间。
2.两个h5框架,iScroll、Native.js(虽然在这个问题上没啥用)
3.最终奥义:修改设计稿,三招 -> 使输入框不在页面的下半部分、采用分页设计、弹出输入层(ps:要和产品和设计沟通,客户不一定会让步 0.0)
希望大家斧正,交流更好地解决方案,谢谢
h5软键盘挡住输入框问题解决(android)的更多相关文章
- Android爬坑之旅:软键盘挡住输入框问题的终极解决方案
前言 开发做得久了,总免不了会遇到各种坑.而在Android开发的路上,『软键盘挡住了输入框』这个坑,可谓是一个旷日持久的巨坑--来来来,我们慢慢看. 入门篇 Base 最基本的情况,如图所示:在页面 ...
- Android WebView 软键盘挡住输入框
解决方法一: 在所在的Activity中加入 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RES ...
- 安卓H5软键盘遮挡输入框
由于安卓app内嵌入H5页面,webview对于软键盘没有处理(如果不是产品强烈要求建议不要处理这种拆东墙补西墙的问题,因为其他的手机上可能会出现已经优化软键盘的情况) 1.input下方还有多余空位 ...
- 点击底部input输入框,弹出的软键盘挡住input(苹果手机使用第三方输入法 )
测试移动端页面的时候,偶然发现点击底部input输入框时,弹出的虚拟键盘偶尔会挡住input输入框. 输入框固定在页面底部,如图所示: input固定底部设计图.png 点击底部input输入框唤 ...
- Android各种键盘挡住输入框解决办法
方法一:windowSoftInputMode:adjustResize和adjustPan 主要实现方法:在 AndroidManifest.xml 对应的Activity里添加 android:w ...
- Android软键盘与输入框的设置
大家开发Android或者用app的时候会发现转到输入框就会自动弹出软键盘,切换别的页面就会自动的隐藏,下面几行代码用的熟练了就行了: 1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) I ...
- flutter TextField 输入框被软键盘挡住的解决方案
以前搞ionic1~4的开发中 和react-native flutter中的机制完全不同, 在flutter 中 当前页面如果存在元素被软键盘挡住 的情况 页面元素的最外层肯定得嵌套一层 S ...
- H5软键盘兼容方案
前言 最近一段时间在做 H5 聊天项目,踩过其中一大坑:输入框获取焦点,软键盘弹起,要求输入框吸附(或顶)在输入法框上.需求很明确,看似很简单,其实不然.从实验过一些机型上看,发现主要存在以下问题: ...
- 可能这些是你想要的H5软键盘兼容方案
前言 最近一段时间在做 H5 聊天项目,踩过其中一大坑:输入框获取焦点,软键盘弹起,要求输入框吸附(或顶)在输入法框上.需求很明确,看似很简单,其实不然.从实验过一些机型上看,发现主要存在以下问题: ...
随机推荐
- VS发布网站时,报错提示:“未能将文件xxx复制到xxx,未能找到文件xx”三种解决方案!
发布网站时候大家可能会遇到这样的情况,就是报错提示说:“未能将文件xxx复制到xxx,未能找到文件xx”,这个问题一般来说有三种解决方案,个人倾向第三种,如图: 解决方案如下: 方案一.把系统提示缺失 ...
- smbclient匿名访问win7共享文件夹
windows: 首先需要开启Guest用户,设置密码为空. 然后需要在管理工具下的本地安全策略中检查本地策略\用户权限分配\拒绝从网络访问这台计算机如果有Guest或Guests则删掉. 然后正常共 ...
- JAVA进阶22
1.接口默认方法的使用 ①接口的默认方法可以通过接口实现类对象直接调用. ②接口的默认方法也可以被接口实现类进行覆盖重写 package cn.intcast.demo17; public inter ...
- 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1 20165237
2018-2019-2 <网络对抗技术>Exp0 Kali安装 Week1 20165237 安装虚拟机 首先创建虚拟机 创建好虚拟机后,打开虚拟机进行安装.第一步选择Graphcal i ...
- SQL报错盲注
嗯哼,这几天篮球比赛,天天训练,学习都耽搁了,DDCTF做了一会心态就爆炸了,蓝瘦,明天再打一场,希望能赢呢,打完就疯狂继续学习了.今天抽空又做了一些基本的SQL注入题目,墨者学院的一道报错注入的题目 ...
- CV code references
转:http://www.sigvc.org/bbs/thread-72-1-1.html 一.特征提取Feature Extraction: SIFT [1] [Demo program][SI ...
- 分布式事务2PC_PENDING异常处理
set heading off;set feedback off;set echo off;Set lines 999;Spool rollback.sqlselect 'ROLLBACK FORCE ...
- C - Heavy Transportation && B - Frogger(迪杰斯变形)
Background Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand bus ...
- 20175226 2018-2019-2《java程序设计》结对编程-四则运算(第一周-阶段总结)
结对编程-四则运算(第一周-阶段总结) 需求分析 实现一个四则运算程序,要求: 自动随机生成小学四则运算题目(加,减,乘,除) 支持整数.真分数且支持多项式 能够利用栈的思想,将中缀转换为后缀表达式 ...
- C#基于websocket-sharp实现简易httpserver(封装)
一.背景 其实就是很简单的,公司会桌面开发的人员紧缺啊,项目又赶,而我们公司的前端人员人多还厉害(ps:吐槽下,后端的人真的少啊,会桌面开发的更少啊),所以萌生出了使用html+js来构建本地应用程序 ...