1、项目背景:vue项目,手机加短信验证码登录;

2、问题: 在ios中input吊起软键盘,输入完成后,收起软件盘,页面不会回弹,导致页面下方出现空白,也就是页面变形;

3、最开始的解决方案是,用input的失去焦点事件@focusout,在input失去焦点的时候让页面回滚到顶部,具体代码如下:

// 首先,判断触发事件的目标元素是否是input输入框,我们只关注输入框的行为。
if (e && e.target && e.target.tagName && e.target.tagName.toLowerCase() === 'input') {
window.scrollTo(0, 0)
}

  这样可以解决页面变形问题,但是切换input的时候,会出现页面先滚动然后又回到光标位置,就是页面先执行了失去焦点事件,回到顶部,然后input又获取焦点,重新回到当前位置;

表现形式如下:

4、最终优化方案是:用定时器延时执行@focusout,在添加一个@focusin事件;

如果是input切换,则直接取消定时器,不在执行回到顶部的代码,这样页面就不会回滚;

如果时输入完成,则延时20ms后再回到页面顶部,这样完美解决该问题;

具体代码如下:

<div class="login" v-if="isLogin"  @focusout="handleInputBlur" @focusin="handleInputBin">
<div>
<input class="phone" v-model="phone" type="number" placeholder="请输入">
</div>
<div class="sms-body">
<div>
<input class="sms" type="number" placeholder="请输入">
</div>
<div>
<button class="smsBtn" v-if='sendAuthCode' @click="handleGetSms">{{smsBtn}}</button>
<button class="timeBtn" v-else >{{smsBtn}}</button>
</div>
</div>
<div>
<button class="post-phone-btn" @click="handlePostBtn">绑定</button>
</div>
</div>
// 针对ios键盘导致页面变形的处理----冒泡获取所有失去焦点事件
// 将获得失去焦点时间延时执行,如果再重新获取焦点则清除定时器,不将页面回滚到顶部,避免出现页面来回滚动的情况
// 如果输入完成之后,没有在重新获取焦点,则延时20ms后再将页面回弹到顶部
handleInputBlur (e) {
if (this.timer) {
clearTimeout(this.timer)
}
// 首先,判断触发事件的目标元素是否是input输入框,我们只关注输入框的行为。
if (e && e.target && e.target.tagName && e.target.tagName.toLowerCase() === 'input') {
this.timer = setTimeout(() => {
window.scrollTo(0, 0)
}, 20)
}
},
// 获得焦点事件
handleInputBin (e) {
if (this.timer) {
clearTimeout(this.timer)
}
}

  

h5项目中关于ios手机软键盘导致页面变形的完美解决方案的更多相关文章

  1. 解决h5底部输入框在ios被软键盘顶飞 软键盘消失还下不来

    好吧,其实不是顶飞,准确点说应该是h5页面fiexed定位在底部的输入框在ios软键盘弹起的时候软键盘跟输入框有时会有一段悬空的距离,无法紧贴.在安卓机子上则没有这样的情况. 解决方法是通过h5的sc ...

  2. js对手机软键盘的监听

    js还没有办法对手机软键盘直接进行监听的,但是可以有其他角度来判断软键盘是否弹起.比如输入框是否获取焦点等.focusin和focusout支持冒泡,对应focus和blur, 使用focusin和f ...

  3. ios键盘弹起 body的高度拉长,页面底部空白问题。ios软键盘将页面抵到上面后,关闭软键盘页面不回弹的问题。

    js 监听ios手机键盘弹起和收起的事件 /* js 监听ios手机键盘弹起和收起的事件 */ document.body.addEventListener('focusin', () => { ...

  4. js防止安卓手机软键盘弹出挤压页面导致变形的方法

    5防止安卓手机软键盘弹出挤压页面导致变形的方法 输入框定位在底部,手机端打开,输入框聚焦后软键盘打开为什么会瞬间自动关闭呢? 先看看问题: 1.原来是这样的: 2.在苹果手机里面是正常的: 3.到了安 ...

  5. input固定定位后,当input框获取到焦点时,会离开手机软键盘的解决方法

    前些天做页面时候遇到这样一个问题,将input框用position:fixed固定定位在最底部的时候,当Input获取焦点的时候,input框离开了手机软键盘,而不是吸附在软键盘上,效果如下图: 找了 ...

  6. ios获取软键盘完成事件

    ios获取软键盘完成事件,通过判断input的onBlur事件即可

  7. 在UniApp的H5项目中,生成二维码和扫描二维码的操作处理

    在我们基于UniApp的H5项目中,需要生成一些二维码进行展示,另外也需要让用户可以扫码进行一定的快捷操作,本篇随笔介绍一下二维码的生成处理和基于H5的扫码进行操作.二维码的生成,使用了JS文件wea ...

  8. h5 input失去焦点软键盘把页面顶起

    var broswer=localStorage.getItem('temp') //浏览器环境 var u = navigator.userAgent var isiOS = !!u.match(/ ...

  9. Android之监听手机软键盘弹起与关闭

    背景: 在很多App开发过程中需要在Activity中监听Android设备的软键盘弹起与关闭,但是Android似乎没有提供相关的的监听API给我们来调用,本文提供了一个可行的办法来监听软键盘的弹起 ...

随机推荐

  1. springboot&mybatis 增删改查系列(一)

    创建父项目 首先,我们需要创建一个Maven项目. 在这个项目的pom文件中加入以下几个依赖: <!-- spring boot --> <parent> <groupI ...

  2. vue-awesome-swiper轮播插件的使用方法及问题。

    在使用vue-awesome-swiper的时候,遇到一些问题,记录一下!       1.npm 安装 npm install vue-awesome-swiper --save 2.使用 在mai ...

  3. 使用jquery.form.js的ajaxsubmit方法提交数据的Bug

    周五同事遇到一个很奇怪的问题,调到下班,虽然问题解决了,但是不知道问题的具体原因,回来翻了翻代码,才发现症结所在,下面就分享出来,供遇到同样问题的同行们参考: 先把问题描述一下,做的功能是使用ajax ...

  4. 使用模块定义AngularJS组件

    一.模块创建/查找 module 当创建一个模块时,必须指定name和requires参数,即使你的模块并不存在依赖 var myApp=angular.module("exampleApp ...

  5. BraveOS正式版发布,希望大家下载使用

    废话不多说,直接贴图才是王道 这里是DOS系统+默认官方(Platform系统) 下载地址:http://pan.baidu.com/s/1eQINwx8 (引导进Platform系统后,默认管理员帐 ...

  6. Python--day20--序列化模块

    序列化:转向一个字符串数据类型 序列   ———— 字符串 序列化和反序列化的概念: 序列化三种方法:json pickle shelve json模块:json模块提供了四个方法dumps和load ...

  7. HDU 1568

    - - 我自己开始以为是数值范围是1到100000000.... 搞了半天才发现是斐波那契数列的项数1到100000000 坑爹.!! 不会,只能看网上大牛的题解. 具体解释请看:http://www ...

  8. vs code 如何修改默认主题的注释颜色

    平时喜欢将注释的颜色调成绿色,既不刺眼,也比较醒目,在大型项目中,能很容易的根据注释找道想要的部分:但是,每次修改完使用一段时间后,当vs code 自动更新了,又变成默认的颜色了,为了方便每次快速修 ...

  9. SVN 树冲突解决详解

    https://blog.csdn.net/xgf415/article/details/75196714 SVN 冲突包括 内容冲突:当两名(或更多)开发人员修改了同一个文件中相邻或相同的行时就会发 ...

  10. php_sphinx安装使用

    Sphinx的简介: Sphinx是一个独立的全文索引引擎,意图为其他应用提供高速.低空间 占用.搜索结果高相关度的全文搜索功能.Sphinx可以非常容易的与 SQL数据库和脚本语言集成.内置MySQ ...