移动端 Web 页 input 控制软键盘

从交互层面上来讲,完成一个功能(获得想要的信息)的过程称之为用户路径。用户路径越长,完成功能的复杂度就越高,用户体验也就越差。因此当打开一个需要用户填写信息的表单界面时,为了提高可用性,PC 端一般会将光标聚焦到对应输入框(input),移动端也是同理,让对应的 input 获得 focus 状态,唤起软键盘,方便用户直接输入。
本文暂且不论 PC 端的场景,在移动端(iOS、Android)实现这个看似不起眼的效果其实是需要经过一番折腾,我们慢慢往下看以下三种常用场景。

一、当进入表单页时,让软键盘自动打开

这个需求比较常见,但是也是最棘手的。讲科学的话,我们可以直接在 JS 里获取 input ,给它 focus 下就搞定了。但是这在移动端浏览器里是行不通的。。
另外,H5 提供了 autofocus 属性,这个属性的兼容性在 caniuse 上显示并不支持 iOS Safari,Android 也是要到 4.4 才开始支持,因此我们可以忽略这个属性,不过下文会再次提到这个属性。
因此在 iOS 里想要在页面 load 完成后自动聚焦 input,打开键盘目前来讲不是很现实。
最难过的是 Android 也不行,目前进行了简单的测试系统浏览器和 App 内嵌 WebView,H5 中的 input 是聚焦状态,但是无法唤起键盘,键盘,键盘。。。
场景一,暂时无解......(下文提到在 Hybrid App 中可以实现)

二、当点击页面中某个元素唤起软键盘

这个相对于场景一,多了用户交互这一步。那么这样是不是就可以使用 JS 在 iOS 上成功的唤起键盘了呢?答案是肯定的。

<!-- HTML -->
<input id="input" type="text" 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个问题通常可以通过监听软键盘的打开和关闭事件来解决。可以使用 Vue.js 的 `$nextTick()` 方法和 `window.innerHeight` 属性来获取面高度和视口高度。具体实现步骤如下: 1. 在 `mounted()` 钩子函数中,添加软键盘打开和关闭事件的监听函数。 ```javascript mounted() { window.addEventListener('resize', this.handleResize) window.addEventListener('scroll', this.handleScroll) window.addEventListener('focusin', this.handleFocusIn) window.addEventListener('focusout', this.handleFocusOut) } ``` 2. 实现监听函数,根据软键盘的状态计算面高度和视口高度,并更新面的滚动位置。 ```javascript methods: { handleResize() { if (document.activeElement.tagName === 'INPUT' || document.activeElement.tagName === 'TEXTAREA') { this.isKeyboardOpened = true } else { this.isKeyboardOpened = false } this.updateViewportHeight() }, handleScroll() { if (!this.isKeyboardOpened) return this.updateViewportHeight() }, handleFocusIn() { this.isKeyboardOpened = true this.updateViewportHeight() }, handleFocusOut() { this.isKeyboardOpened = false this.updateViewportHeight() }, updateViewportHeight() { const height = window.innerHeight const input = this.$refs.input const inputHeight = input.offsetHeight const inputOffsetTop = input.getBoundingClientRect().top const offset = window.scrollY const scrollHeight = document.body.scrollHeight const keyboardHeight = height - inputHeight - inputOffsetTop + offset if (keyboardHeight > 0) { document.body.style.height = scrollHeight + keyboardHeight + 'px' document.body.style.overflow = 'hidden' window.scrollTo(0, keyboardHeight) } else { document.body.style.height = '' document.body.style.overflow = '' window.scrollTo(0, 0) } } } ``` 3. 在面中添加输入框,并绑定 ref 属性。 ```html <template> <div> <input type="text" ref="input"> </div> </template> ``` 这样,当软键盘打开时,面会自动调整滚动位置,避免输入框被遮挡。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值