前言
React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站。做出来以后,发现这套东西很好用,就在2013年5月开源了。
本文主要介绍了关于react在安卓输入框被键盘遮挡的相关内容,分享出来动大家参考学习,下面话不多说了,来一起看看详细的介绍吧
问题概述
今天遇到了一个问题,在安卓手机上,当我要点击输入“店铺名称”时,手机软键盘弹出来刚好把输入框挡住了;挡住就算了,关键是页面还不能向上滑动,整个手机窗口被压为原来的二分之一左右;
然后
然后找了一些方案,不过不大适用,或者是有点麻烦;所以需要整合一下,
首先,我想一下我要实现的效果(2018/9/3补充:评论区有更加简单的实现方法)
想要实现的效果
如图,当手机键盘出现时,页面是可以自由滚动的,而且当前聚焦的输入框往红线处靠齐,这样就刚好在剩下的窗口的垂直正中间,这样就不会出现输入框被挡住,看不到自己输入的内容了 ;
第一步,使屏幕压小时,页面内容可以滚动查看
如下图所示,黑色框代表屏幕,蓝色框代表页面大小,当屏幕被压小时,页面内容必须保持原来的高度:
实现原理,页面一进来时,我就获取窗口的高度,给最外层的div设置一个最小高度,这样就算窗口压小了,页面还能维持原来的高度,可以滚动浏览:
let initWindowHeight=window.innerHeight let wrapDiv=document.getElementsByClassName('animated-router-forward-enter-done')[0] wrapDiv.style.minHeight =initWindowHeight+'px'
第二步,滚到红线处
由于我们不能直接知道软键盘什么时候出来,不过软键盘出来的时候窗口高度会缩小,所以我们可以通过监听窗口大小变化事件来判断软键盘是否弹出,比如浏览器窗口高度突然缩小25%以上,那么我们就认为是软键盘出来了,然后我们获取聚焦input距离页面顶部的距离,计算距离红线有多少距离,假设距离是60,那么我们就让页面向上滚动60,这时input就刚刚好到了红线处;
window.onresize=function(){ if(initWindowHeight-window.innerHeight>initWindowHeight/4&&document.querySelectorAll(':focus').length>0){ //offset是封装好的一个获取元素距离页面顶部滚动距离的方法 if(offset(document.querySelectorAll(':focus')[0]).top>initWindowHeight/4){ document.body.scrollTop=offset(document.querySelectorAll(':focus')[0]).top-initWindowHeight/4 } }else if(window.innerHeight-initWindowHeight<20){ document.body.scrollTop=0 } };
完整代码
因为可能有多个页面要调用,所以我把代码放到一个单独的js文件中:
function pageInputScroll() { let initWindowHeight=window.innerHeight setTimeout(() => { let wrapDiv=document.getElementsByClassName('animated-router-forward-enter-done')[0] //console.log(wrapDiv.style) wrapDiv.style.minHeight =initWindowHeight+'px' }, 500); //由于我们不能直接知道软键盘什么时候出来,不过软键盘出来的时候窗口高度会缩小,所以我们可以通过监听窗口大小变化事件来判断软键盘是否弹出 window.onresize=function(){ //如果浏览器窗口高度缩小25%以上,就认为是软键盘出来了 if(initWindowHeight-window.innerHeight>initWindowHeight/4&&document.querySelectorAll(':focus').length>0){ if(offset(document.querySelectorAll(':focus')[0]).top>initWindowHeight/4){ document.body.scrollTop=offset(document.querySelectorAll(':focus')[0]).top-initWindowHeight/4 } }else if(window.innerHeight-initWindowHeight<20){ document.body.scrollTop=0 } }; } function offset(element) { var offest = { top: 0, left: 0 }; var _position; getOffset(element, true); return offest; // 递归获取 offset, 可以考虑使用 getBoundingClientRect function getOffset(node, init) { // 非Element 终止递归 if (node.nodeType !== 1) { return; } _position = window.getComputedStyle(node)['position']; // position=static: 继续递归父节点 if (typeof(init) === 'undefined' && _position === 'static') { getOffset(node.parentNode); return; } offest.top = node.offsetTop + offest.top - node.scrollTop; offest.left = node.offsetLeft + offest.left - node.scrollLeft; // position = fixed: 获取值后退出递归 if (_position === 'fixed') { return; } getOffset(node.parentNode); } } export {pageInputScroll};
在react页面中引入js并调用:
import {pageInputScroll} from '../../util/pageInputScroll' ...... componentDidMount(){ pageInputScroll() }
如果只是想在安卓下使用,可以加一个判断:
if(/Android/i.test(navigator.userAgent)){ pageInputScroll() }
效果动图
我在pc端的谷歌浏览器模拟一下实现的效果:
备注
offset()方法是使用js实现类似jquery的offset()的一个方法,参考自:原生js实现offset方法
总结:
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 罗大佑-无法盗版的青春套装版10CD【WAV】
- 张学友《意乱情迷》蜚声环球 2024 [WAV+CUE][1G]
- 柏菲《好歌30年特别版2CD》最好听的影视歌曲[低速原抓WAV+CUE][1G]
- 张学友《世纪10星·永恒篇》香港版[WAV+CUE][1G]
- 模拟之声慢刻CD《刘德海.琵琶独奏精逊【低速原抓WAV+CUE】
- Jamettone-18052023—improv(EDit)(2024)【FLAC】
- 【索尼精芽20首最棒的苏格兰歌曲集【FLAC】
- 池约翰C.J《少年白马醉春风2 动画原声带》[320K/MP3][26.67MB]
- 池约翰C.J《少年白马醉春风2 动画原声带》[FLAC/分轨][144.13MB]
- 陈致逸《幻想乐园 Fantasyland》[320K/MP3][120.54MB]
- 席卷全球最红舞曲《火辣辣DJ[英文版]》[DTS-WAV]
- 群星-席卷全球最红舞曲《火辣辣DJ中文版》【WAV】
- 模拟之声慢刻CD《声入人心[年度发烧人声严选]》[低速原抓WAV+CUE]
- 陈致逸《幻想乐园 Fantasyland》[FLAC/分轨][554.27MB]
- Rhymist / LusciousBB《年轮》[320K/MP3][76.52MB]