Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >移动端输入框填坑系列(一)

移动端输入框填坑系列(一)

作者头像
腾讯AlloyTeam
修改于 2017-06-30 10:04:24
修改于 2017-06-30 10:04:24
7.1K01
代码可运行
举报
运行总次数:1
代码可运行

作者:yana

输入在移动端是一个很常用的功能,那么输入框必然是一个很重要的部分。然而,移动端输入框总会遇到各种各样的问题,无论是样式还是ios和android两端体验不一致都是很让我们头疼的问题,那么如何使移动web的输入框体验更贴近原生也成了一个需要我们多多思考和研究的问题。

一、文字输入限制问题

我们拿最多可输入16个字为例。当输入字数(注意,不是字符长度)超过16字时,会触发 tips 提示,并且不能继续输入。

办法一: textarea 可以使用 maxlength 进行输入字数限制。 但是这个办法只能单纯的限制 length ,有时并不能真正的结局问题。

办法二: 在将第二个办法之前先来讲讲下面的几种情况:

1、非直接的文字输入

什么叫做非直接的文字输入呢?

当输入汉字时必然会是非直接输入,需要我们点选才能正式输入。

当我们字数限制为16个字,需要实时检查是否到16字。输入文字时,当有非直接的文字输入时,监听 keydown 事件和 input 事件都会直接触发判断字数逻辑,会截断我们正在输入的文字。

解决办法:

监听 compositionend (当直接的文字输入时触发)这时,当没选中中文的时候不会进行字数判断。 ``

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    $('#input').on('compositionend', function(e) {
        var len = $(this).val().length;
        if (len > 16) {
            // 提示超过16字
        }
    });

2、emoji 表情的输入

当输入 emoji 的时候,但是,当输入 emoji 表情的时候,js 中判断 emoji 表情的 length 为2,因此 emoji 正常应该最多只能输入8个,但是 ios 端却把 emoji 的 length 算为1,可以输入16个 emoji 。这样就导致了两端的体验不同。因此需要在 js 中来进行字数限制。

再加上汉字输入问题,那么就加入一个标记位,来判断是否是直接的文字输入。然后监听 input ,限制字数,当超过字数限制的时候,把前16个字截断显示出来就ok了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
``

var cpLock;
$('#input').on('compositionstart', function(e) {
    cpLock = true});
$('#input').on('compositionend', function(e) {
    cpLock = false;
});
$('#input').on('input', function(e) {
    if (!cpLock) {
        if (e.target.value.length - 17 >=0) {
            var txt = $(e.target).val().substring(0, 16);
            $(e.target).val(txt);
            // 超过16字提示
        }
    }
});

二、textarea置底展示问题

ios 中的输入体验永远伴随着一个问题,就是当唤起键盘后,整个页面会被键盘压缩,也就是说页面的高度变小,并且所有的fixed全部变为了absolute。 android效果:

使用 fixed 定位。

可见 android 中唤起键盘是覆盖在页面上,不会压缩页面。

在 ios 上的效果:

那么如果我们需要将输入框固定在屏幕下方,而当键盘被唤起同时输入框固定在键盘上方(如下图样式)该如何解决呢?

首先我们来看下 ios 的表现。

可以看出,键盘会将页面顶上去。那么如果希望可以将输入框和键盘完全贴合,我们可以使用div模拟一个假的输入框,使用定位将真正的输入框隐藏掉,当点击假的输入框的时候,将真正的输入框定位到键盘上方,并且手动获取输入框焦点。

在实现过程中需要注意下面几个问题:

1、真正的输入框的位置计算

首先记录无键盘时的 window.innerHeight,当键盘弹出后再获取当前的 window.innerHeight ,两者的差值即为键盘的高度,那么定位真输入框自然就很容易了。

2、在 ios 下手动获取焦点不可以用 click 事件,需要使用 tap 事件才可以手动触发

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    ``

    $('#fake-input').on($.os.ios?'tap' : 'click', function() {
        initHeight = window.innerHeight;
        $('#input').focus();
    });

3、当键盘收起的时候我们需要将真输入框再次隐藏掉,除了使用失去焦点(blur)方法,还有什么方法可以判断键盘是否收起呢?

这里可以使用 setInterval 监听,当当前 window.innerHeight 和整屏高度相等的时候判断为键盘收起。 注意:键盘弹起需要一点时间,所以计算当前屏幕高度也需要使用setInterval。

4、因为 textarea 中的文字不能置底显示,当输入超过一行textarea需要自动调整高度,因此将scrollHeight赋值给textarea的height。当删除文字的时候需要height也有变化,因此每次input都先将height置0,然后再赋值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    $('#textarea').css('height', 0);
    $('#textarea').css('height', $('#textarea')[0].scrollHeight);

未完待续...

本文系转载,如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
移动端问题收集和解决
绑定tap方法的dom元素,触发该方法时,该dom元素下方同一位置的dom元素会触发click事件或者有浏览器认为可以被点击交互的dom元素(input的focus事件),称为tap击穿现象。
Tiffany_c4df
2019/09/04
2K0
移动端Webapp中的那些Bug
持续更新… 测试浏览器 Chrome: 61.0.3163.73 Safari: 10.0(IOS 10.3.3) Github: webapp-bugs 1. IOS overflow: scrol
糊糊糊糊糊了
2018/05/09
3.1K0
移动端Webapp中的那些Bug
挥别web移动端开发差异和经典坑
在 iOS Safari (其他浏览器和 Android 均不会)上会对那些看起来像是电话号码的数字处理为电话链接,比如:
张炳
2020/05/11
3.1K0
H5页面前端开发常见的兼容性问题解决方法
问题描述:input输入框光标,在安卓手机上显示没有问题,但是在苹果手机上当点击输入的时候,光标的高度和父盒子的高度一样,看起来很怪异。例如下图,左图是正常所期待的输入框光标,右边是IOS的 input 光标。
越陌度阡
2022/05/06
3K0
H5页面前端开发常见的兼容性问题解决方法
【H5】344- 微信 H5 页面兼容性解决方案
当点击输入的时候,光标的高度和父盒子的高度一样。例如下图,左图是正常所期待的输入框光标,右边是ios的input光标。
pingan8787
2019/09/09
2.8K0
【H5】344- 微信 H5 页面兼容性解决方案
收藏 | 移动端H5开发常用技巧总结
在 iOS Safari (其他浏览器和 Android 均不会)上会对那些看起来像是电话号码的数字处理为电话链接,比如:
@超人
2021/03/18
4.3K0
移动端那些戳中你痛点的软键盘问题及解决方法
在ios手机中,当页面中包含有输入框时,点击输入框,键盘弹起,会让页面中被fixed的元素失效。所以造成了底部吸底和顶部吸顶的元素错位的问题。下面的视频中就出现了这个问题,吸顶元素被推到可视区之外去了,而吸底元素也被推到了键盘之上。
wade
2021/05/28
9.2K0
移动端那些戳中你痛点的软键盘问题及解决方法
移动端H5页面开发坑点指南
前言 在平时的H5移动端开发时,我们难免会遇到各种各样的坑点,这篇文章就带着大家来看看怎么解决,文章较长,建议收藏方便以后查阅!
Javanx
2019/10/28
3.2K0
微信小程序开发实战(9):单行输入和多行输入组件
input组件用于录入单行文本,尽管input的基本功能是文本录入,但该组件的属性还是比较多的,也比较复杂。下面是input属性的属性及其含义。
蒙娜丽宁
2020/07/16
3.1K0
微信小程序开发实战(9):单行输入和多行输入组件
可能这些是你想要的H5软键盘兼容方案
最近一段时间在做 H5 聊天项目,踩过其中一大坑:输入框获取焦点,软键盘弹起,要求输入框吸附(或顶)在输入法框上。需求很明确,看似很简单,其实不然。从实验过一些机型上看,发现主要存在以下问题:
桃翁
2019/06/20
8.3K1
可能这些是你想要的H5软键盘兼容方案
【移动端bug】iOS 下 Input 和 fixed 的问题
最近在项目中碰到了移动端 IOS 下的一些问题,就打算完整总结一下,以便后续碰到相关问题就不用浪费时间了
神仙朱
2021/05/13
4.9K0
【移动端bug】iOS 下 Input 和 fixed 的问题
h5软键盘挡住输入框问题解决(android)
在部分android机型上测试点击靠下的输入框时遇到弹出的软键盘挡住输入框问题,ios可自身弹起(ios自身的调整偶尔也会出问题,例如第三方键盘会遮挡,原因是第三方输入法的tool bar或者键盘也被当做可视区域,这里不做讨论)
mcq
2018/08/17
6.7K0
h5软键盘挡住输入框问题解决(android)
移动端爬坑记 --- (1)布局与样式上的奇葩偶遇
这些前缀很少手动去写,一般都用构建工具处理,我用的是gulp+autoprefixer来处理,这里我的处理范围
CRPER
2024/01/30
1560
前端开发技巧:Vue 项目中如何实现全局和局部禁止input输入框输入 Emoji 的最佳实践
在现代前端开发中,限制输入框禁止输入 Emoji 表情符号 是一项常见而重要的需求,尤其在需要高数据质量的场景中(如用户注册、表单提交、内容发布、后台管理等)。Emoji 的存在可能会导致数据库存储问题、前后端解析错误,甚至影响用户体验。因此,确保输入框的内容符合预期显得尤为关键。
猫头虎
2024/11/28
3950
前端开发技巧:Vue 项目中如何实现全局和局部禁止input输入框输入 Emoji 的最佳实践
原生JS解决 安卓机 input/textarea输入键盘遮盖输入框
h5开发时,input/textarea输入框在安卓手机中,获取焦点时,键盘会直接在页面上方弹出,如果你的输入框刚好在页面下方就会被弹出的键盘遮挡,也无法向上滑动使其显示,如下图所示:
王念博客
2019/07/24
4.3K0
【实战】我是如何在输入框实现@ At功能的
作者:InfinityTomorrow 授权转载 链接:https://juejin.cn/post/6982251438332182542 一、前言 最近接手了一个需求,在评论框中实现 @At通知用户的功能。这个可以说是我的知识盲点了,但是其实很多应用都有这类功能了,例如:QQ空间、微博搜索、企业微信的TAPD...但是一看就不想不做~😭(产品经理ps:为什么别人可以做你不可以做?) 明确目标 二、技术方案分析 在寻求我们的技术方案的时候、我们首先要明确我们想要的功能是什么 你知道自己想要什么,知道要
coder_koala
2021/12/22
2.9K0
【实战】我是如何在输入框实现@ At功能的
移动端H5 input输入完成后页面底部留白问题
说明 最近在用vue写几个H5页面在微信上展示,遇到一个在弹窗上input输入完成之后点击键盘的完成,页面底部留出一片空白的问题 [20190521155136.png] 出现原因分析 当键盘抬起时,window.scrollY会从0变到键盘的高度,所以解决办法就是当input失去焦点的时候,将window.scrollY重新设置为0 解决 给所有的input``textarea组件设置获取焦点和设置焦点事件,失去焦点的时候将window.scrollY`设置为0 因为的是vue所以结合vue来写代码 <t
w候人兮猗
2020/06/24
1.3K0
Textarea输入框失去焦点时隐藏手机键盘
今天在做公司年会的手机端上墙页面,发现在输入完成后,点击输入框以外的任何区域,键盘收起输入框没有自动回弹。
越陌度阡
2020/11/26
2.7K0
手机端页面在项目中遇到的一些问题及解决办法
首先你可能会给页面的 html 和 body 增加了 height: 100%, 然后就可能造成 IOS 上页面滑动的卡顿问题。解决方案是:
前端教程
2018/07/27
3.6K0
手机端页面在项目中遇到的一些问题及解决办法
JS - 可自动伸缩高度的文本框
change事件的现象是,输入框失去焦点的时候才会触发。如果文本框内容超出高度然后用户还在输入的时候,体验就会很不好。而且如果用户一直不点击别的地方让textarea失去焦点,这个事件就永远不会触发,文本框的高度就不变。
xing.org1^
2018/09/20
9.8K0
JS - 可自动伸缩高度的文本框
推荐阅读
相关推荐
移动端问题收集和解决
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验