H5 手机键盘兼容

2023-11-04

键盘弹起页面表现

  • ios表现

    • 是页面(webview)整体往上滚了,且最大滚动高度(scrollTop)为软键盘高度。
  • 安卓表现

    • 页面(webview)高度会发生改变,一般来说,高度为可视区高度(原高度减去软键盘高度)

监听软键盘弹起和收起

// 判断设备类型
var judgeDeviceType = function () {
  var ua = window.navigator.userAgent.toLocaleLowerCase();
  var isIOS = /iphone|ipad|ipod/.test(ua);
  var isAndroid = /android/.test(ua);

  return {
    isIOS: isIOS,
    isAndroid: isAndroid
  }
}()
  • ios监听focus、blur事件

// 监听输入框的软键盘弹起和收起事件
function listenKeybord($input) {
  if (judgeDeviceType.isIOS) {
    // IOS 键盘弹起:IOS 和 Android 输入框获取焦点键盘弹起
    $input.addEventListener('focus', function () {
      console.log('IOS 键盘弹起啦!');
      // IOS 键盘弹起后操作
    }, false)

    // IOS 键盘收起:IOS 点击输入框以外区域或点击收起按钮,输入框都会失去焦点,键盘会收起,
    $input.addEventListener('blur', () => {
      console.log('IOS 键盘收起啦!');
      // IOS 键盘收起后操作
    })
  }
  • 安卓还可见监听页面高度

 // Andriod 键盘收起:Andriod 键盘弹起或收起页面高度会发生变化,以此为依据获知键盘收起
  if (judgeDeviceType.isAndroid) {
    var originHeight = document.documentElement.clientHeight || document.body.clientHeight;

    window.addEventListener('resize', function () {
      var resizeHeight = document.documentElement.clientHeight || document.body.clientHeight;
      if (originHeight < resizeHeight) {
        console.log('Android 键盘收起啦!');
        // Android 键盘收起后操作
      } else {
        console.log('Android 键盘弹起啦!');
        // Android 键盘弹起后操作
      }

      originHeight = resizeHeight;
    }, false)
  }
}

获取软键盘高度

  • 通过window.visualViewport异步获取

 //异步是因为键盘唤起有动画时间
 setTimeout(() => {
   this.keyBoardHeight = window.innerHeight - window.visualViewport.height;
 }, 800);

唤起软键盘始终让焦点元素滚动到可视区

  • 当输入框位于页面下部位置时,在 ios 上,会将 webview 整体往上滚一段距离,使得该获取焦点的输入框自动处于可视区,而在 Android 则不会这样,它只会改变页面高度,而不会去滚动到当前焦点元素到可视区。
  • document.activeElement配合scrollIntoView()

// 获取到焦点元素滚动到可视区
function activeElementScrollIntoView(activeElement, delay) {
  var editable = activeElement.getAttribute('contenteditable')

  // 输入框、textarea或富文本获取焦点后没有将该元素滚动到可视区
  if (activeElement.tagName == 'INPUT' || activeElement.tagName == 'TEXTAREA' || editable === '' || editable) {
    setTimeout(function () {
      activeElement.scrollIntoView();
    }, delay)
  }
}

// ...
// Android 键盘弹起后操作
activeElementScrollIntoView($input, 1000);
// ...

某些版本键盘收起,但页面未恢复

  • 在软键盘收起后,将页面(webview)滚回到窗口最底部位置(clientHeight位置)
console.log('IOS 键盘收起啦!');
// IOS 键盘收起后操作
// 微信浏览器版本6.7.4+IOS12会出现键盘收起后,视图被顶上去了没有下来
var wechatInfo = window.navigator.userAgent.match(/MicroMessenger\/([\d\.]+)/i);
if (!wechatInfo) return;

var wechatVersion = wechatInfo[1];
var version = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);

if (+wechatVersion.replace(/\./g, '') >= 674 && +version[1] >= 12) {
  setTimeout(function () {
    window.scrollTo(0, Math.max(document.body.clientHeight, document.documentElement.clientHeight));
  })
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

H5 手机键盘兼容 的相关文章

随机推荐

  • 抖音rpc调用生成x-gorgon、x-argus签名学习记录

    一 通过jadx gui分析apk 找到签名入口函数如下 先hook下这个函数 能看到有结果 接下来就是构造参数模拟调用就行 有两个参数 第一个是url的拼接 第二个是headers里面的一些参数构成的map 这个参数每个接口可能不一样 我
  • 若依ruoyi改皮肤-主题(二)

    一 风格等基础设置 有深色和浅色风格两种 根据设计图考虑是否需要 如果不需要 去掉一种风格 这里以浅色风格为主 在 布局设置 里 可以设置主题风格 深浅 主题颜色 直接下拉修改主色 隐藏菜单 顶部标签等等 如果想在css里修改 1 主题风格
  • 30套JSP网站源代码合集

    JSP技术是以Java语言作为脚本语言的 JSP网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP的应用程序 我收集了一些JSP开发的网站源代码 从实践中学习 希望对大家有用 资料名称 下载地址 网上购物系统 jsp mysq
  • 原根

    定义 在数论 特别是整除理论中 原根是一个很重要的概念 对于两个正整数 由欧拉定理可知 存在正整数 比如说欧拉函数 即小于等于的正整数中与互素的正整数的个数 使得 由此 在时 定义对模的指数 为使 成立的最小的正整数 由前知 一定小于等于
  • nodejs接收form-data数据

    nodejs接收form data类型的数据 不能使用body parser来解析接收 multiparty有多个监听方法 这只是其中一种 var multiparty require multiparty var fs require f
  • 软件压力测试和性能测试分析方法论

    压测和性能分析方法论 性能测试基础 性能测试的常见分类 性能测试 用来验证系统的性能是否满足设计的预期 一般来说对系统的压力会比较小 不会压垮系统 只是进行简单的验证 负载测试 通过不断施加负载压力 寻找系统最优的处理能力 最好的性能状态
  • 北京题库插件:没法登陆又何妨?

    背景介绍 什么是北京题库 北京题库 是专注于中小学教学产品研发的教研平台 拥有试卷 资料等优质资源 致力于为教师备课 教研提供一站式服务 百度百科 简单来说 收录的很多资料 相对好用一点 但是 其使用是有一定限制的 比如网页端必须要微信扫码
  • void与void*

    void与void void关键字的使用规则 1 如果函数没有返回值 那么应声明为void类型 2 如果函数无参数 那么应声明其参数为void 3 如果函数的参数可以是任意类型指针 那么应声明其参数为void 4 void不能代表一个真实的
  • SISD、MIMD、SIMD、MISD计算机的体系结构的Flynn分类法

    1 计算平台介绍 Flynn于1972年提出了计算平台的Flynn分类法 主要根据指令流和数据流来分类 共分为四种类型的计算平台 如下图所示 单指令流单数据流机器 SISD SISD机器是一种传统的串行计算机 它的硬件不支持任何形式的并行计
  • Elasticsearch 开启https鉴权

    Elasticsearch 早期的版本配置鉴权 由于插件收费 所以配置起来比较麻烦 但是最近发现Elasticsearch的8 2版本中可以配置https及鉴权的操作 所以记录一下给想要获取该知识的人 分享一下 第一步 修改elastics
  • Android开发屏幕适配方案

    由于Android系统的开放性 任何用户 开发者 硬件厂商和运营商都可以对Android系统和硬件进行定制 修改成他们自己所需要的样子 使得随着Android设备的增多 设备碎片化 系统碎片化 屏幕尺寸碎片化和屏幕碎片化的程度也在不断加深
  • 竞赛知识点4【搜索】

    文章目录 复习 栈和队列的概念 树 1 1 深度优先搜索 dfs 1 1 1 概念 1 1 2 例题 1 输出n个数的全排列 2 输出n个数中选m个的组合 3 N皇后 8皇后的升级版 4 马踏棋盘 1 1 3 DFS大体框架 1 1 4 剪
  • Springboot-MDC+logback实现日志追踪

    一 MDC介绍 MDC Mapped Diagnostic Contexts 映射诊断上下文 该特征是logback提供的一种方便在多线程条件下的记录日志的功能 某些应用程序采用多线程的方式来处理多个用户的请求 在一个用户的使用过程中 可能
  • Linux 安装cento

    在虚拟机中安装CentOS7 http www centoscn com image text setup 2014 0723 3341 html CentOS 7 下 ifconfig command not found 解决办法 htt
  • localStorage.setItem()使用

    localStorage setItem 使用
  • python自测100题

    如果你在寻找python工作 那你的面试可能会涉及Python相关的问题 通过对网络资料的收集整理 本文列出了100道python的面试题以及答案 你可以根据需求阅读测试 python基础 Q1 什么是Python Python是一种面向对
  • Scala学习第一天(十三):映射(可变/不可变Map;Map基本操作)

    学习目标 映射 不可变Map 可变Map Map基本操作 映射 Map可以称之为映射 它是由键值对组成的集合 在Scala中 Map也分为 不可变Map 可变Map 不可变Map 语法 val var map Map 键 gt 值 键 gt
  • Spring @ComponentScan 自定义扫描规则

    Spring ComponentScan 组件中扫描规则使用场景 package org example cap2 config import org springframework context annotation Bean impo
  • Apache Beam简介及相关概念

    文章目录 一 简介 二 基本概念 1 Pipelines 2 PCollection 3 Transforms 4 ParDo 5 Pipeline I O 6 Aggregation 7 User defined functions UD
  • H5 手机键盘兼容

    文章目录 键盘弹起页面表现 ios表现 安卓表现 监听软键盘弹起和收起 ios监听focus blur事件 安卓还可见监听页面高度 获取软键盘高度 通过window visualViewport异步获取 唤起软键盘始终让焦点元素滚动到可视区