iOS移动端软键盘弹起空白和滚动穿透问题解决方案

 更新时间:2023年07月28日 10:24:21   作者:幽丶墨  
这篇文章主要为大家介绍了iOS移动端软键盘弹起空白和滚动穿透问题解决方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

引言

在做h5移动端项目的时候,给用户一个十分友好的体验是很必要的。最近抽空整理了下移动端(iOS端)项目中经常碰到的两个问题

键盘弹起空白

在我们点击input等弹出手机键盘,在点击完成后经常会在底部出现跟键盘同大小的空白,但是当我们滚动下页面发现又好了,这个在iOS端可以说很常见的问题了(应该是布局定位造成的,具体原因没仔细研究),解决方法就是在结束输入的时候控制滚动条偏移下就好。

下面是相关代码:

.inTouch {
  -webkit-overflow-scrolling: auto;
}
.noTouch {
  -webkit-overflow-scrolling: touch;
}
import Vue from 'vue'
Vue.directive('resetPage', {
  inserted (el) {
    document.body.addEventListener('focusin', () => {
      if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {
        // 软键盘收起的事件处理
        setTimeout(() => {
          document.getElementsByTagName('body')[0].className = 'inTouch'
        }, 100)
      }
    })
    document.body.addEventListener('focusout', () => {
      if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {
        // 软键盘收起的事件处理
        setTimeout(() => {
          const scrollHeight = document.documentElement.scrollTop || document.body.scrollTop || 0
          window.scrollTo(0, Math.max(scrollHeight - 1, 0))
          document.getElementsByTagName('body')[0].className = 'noTouch'
        }, 100)
      }
    })
  }
})

在iOS端,当元素获得焦点的时候,我们把-webkit-overflow-scrolling的值设为auto,防止滚动穿透。当元素失去焦点的时候,我们把值恢复为touch,这样页面的滚动效果不会丢失,同时我们控制滚动条偏移了1像素,解决软键盘弹起空白的问题。

关于我设置的-webkit-overflow-scrolling属性可多说两句:

// -webkit-overflow-scrolling这个样式相信大家都很熟悉了,有auto、touch两个可选值
// auto:使用普通滚动, 当手指从触摸屏上移开,滚动会立即停止。
// touch:使用具有回弹效果的滚动, 当手指从触摸屏上移开,内容会继续保持一段时间的滚动效果。继续滚动的速度和持续的时间和滚动手势的强烈程度成正比。同时也会创建一个新的堆栈上下文。
// 为了增加滚动的流畅性,做iOS移动端适配的时候都会增加这个样式适配的
-webkit-overflow-scrolling: touch;

查看兼容性的事后素我们发现只在iOS端可用,但是出现的问题也很多,我这里加上主要原因是当input失去焦点的时候,有的时候整个页面会卡顿住(这个问题在webview中碰到的),我发现加上这个之后会解决这个问题,就把这两个放到一起了,不需要的可以不加上这个相关的。

我用的是mint-ui开发的移动端,所以在输入框的时候就可以这样使用

<mt-field class="l-modal-body-input" v-reset-page :attr="{ maxlength: 15 }" v-model="name" label="姓名:"></mt-field>

滚动穿透问题

这个可以说也是很常见的问题了,在我们做弹框滚动,如地址或时间picker选择器的时候,我们在滚动选择时候,底部的页面也会跟着一起滚动,一定程度上影响了用户的体验。经查找研究,当我们弹框的时候移除body的touchmove事件,是可以解决这个问题的:

// 锁定body滚动条--主要解决用户弹框滚动时的穿透
Vue.prototype.closeTouch = function () {
  document.getElementsByTagName('body')[0].addEventListener('touchmove', this.handler, {passive: false}) // 阻止默认事件
}
Vue.prototype.openTouch = function () {
  document.getElementsByTagName('body')[0].removeEventListener('touchmove', this.handler, {passive: false}) // 打开默认事件
}
handler: (e) => {
    e.preventDefault()
}

当我们打开picker等弹框的时候,调用this.closeTouch(),锁定滚动,阻止默认事件。关闭弹框的时候调用this.openTouch()打开默认事件。过程虽然比较麻烦,但能实际解决问题!

以上是我做iOS移动项目时遇到的比较常见的问题,更多关于iOS软键盘弹起空白滚动穿透的资料请关注程序员之家其它相关文章!

相关文章

  • ios开发Flutter构建todo?list应用

    ios开发Flutter构建todo?list应用

    这篇文章主要为大家介绍了ios开发Flutter构建todo?list应用实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Objective-C 宏定义详细介绍

    Objective-C 宏定义详细介绍

    这篇文章主要介绍了Objective-C 宏定义详细介绍的相关资料,这样开发起来,更有效率,更好,更简洁,需要的朋友可以参考下
    2016-10-10
  • iOS当多个网络请求完成后执行下一步的方法详解

    iOS当多个网络请求完成后执行下一步的方法详解

    在多线程中,有时候我们会遇到一个界面同时有多个网络请求(比如a,b,c,d四个网络请求),在这四个个请求结束后,在请求到数据去做其他操作(UI更新等),下面这篇文章主要给大家介绍了关于iOS当多个网络请求完成后执行下一步的相关资料,需要的朋友可以参考下。
    2017-12-12
  • IOS10 远程推送适配详细介绍

    IOS10 远程推送适配详细介绍

    这篇文章主要介绍了IOS10 远程推送适配详细介绍的相关资料,iOS10推送新增了UserNotifications Framework,这里主要介绍如何实现远程推送,需要的朋友可以参考下
    2016-12-12
  • iOS中的3种定时器汇总介绍

    iOS中的3种定时器汇总介绍

    这篇文章主要介绍了iOS中的3种定时器汇总介绍的相关资料,需要的朋友可以参考下
    2023-05-05
  • iOS渐变圆环旋转动画CAShapeLayer CAGradientLayer

    iOS渐变圆环旋转动画CAShapeLayer CAGradientLayer

    这篇文章主要介绍了iOS渐变圆环旋转动画CAShapeLayer CAGradientLayer的相关资料,需要的朋友可以参考下
    2016-09-09
  • iOS之基于FreeStreamer的简单音乐播放器示例

    iOS之基于FreeStreamer的简单音乐播放器示例

    这篇文章主要介绍了iOS之基于FreeStreamer的简单音乐播放器示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Swift项目集成QQ授权登录

    Swift项目集成QQ授权登录

    这篇文章主要介绍了Swift项目集成QQ授权登录的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-11-11
  • iOS将时间NSDate转化为毫秒时间戳的方法示例

    iOS将时间NSDate转化为毫秒时间戳的方法示例

    这篇文章主要给大家介绍了关于iOS将时间NSDate转化为毫秒时间戳的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • iOS代码瘦身实践之如何删除无用的类

    iOS代码瘦身实践之如何删除无用的类

    这篇文章主要给大家介绍了关于iOS代码瘦身实践之如何删除无用的类,文中通过示例代码介绍的非常详细,对大家各位iOS开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08

最新评论

?


http://www.vxiaotou.com