uniapp自定义验证码输入框,隐藏光标
创始人
2024-06-02 10:42:19

一. 前言

先看下使用场景效果图:

  1. 点击输入框唤起键盘,蓝框就相当于input的光标,验证码输入错误或者不符合格式要求会将字体以及边框改成红色提示,持续1s,然后清空数据,恢复原边框样式;
  2. 5位验证码输入完毕,点击页面其他位置,隐藏键盘;这时如果发现验证码有误,再次点击输入框又唤起键盘,也能正常删除数字(这里其实做的时候遇到了bug,再次聚焦不能删除错误数字,下文会讲到)。
    在这里插入图片描述

二. 实现思路

具体实现思路:

  1. 将input标签相对于父元素做绝对定位,与父元素左边距设置为负的本身宽度即可(position: absolute; top: 0; left:-100%; width: 100%; height: 100%;)。
  2. 动态去设置input的focus属性。
  3. input同级使用for循环去创建5个正方形的view标签。
  4. 给input同级创建的view标签绑定点击事件,在点击事件方法实现中去设置input的focus属性为true,即可弹出键盘。
  5. 在键盘输入的时候,即可触发input属性的一系列方法,利用v-model双向绑定,将input输入的值赋值给循环的view方框即可。
    这样input也就不在屏幕中,但是又可以触发input的事件。

总的来说就是,使用for循环去创建5个正方形的view标签,然后创建一个input标签,type=tel,最大输入长度为5(根据需求来设置),再将input伪隐藏掉,获取的值分别放到5个view中展示。

验证码失败后利用v-model双向绑定,清空输入的值,增加错误提示文字和边框样式。

三. 代码实现

父组件




子组件


四. 过程中遇到的问题

1)input 的type=‘number’, ios手机正常,光标在内容最后,但Android手机光标有时候在内容最前面,导致聚焦内容删不掉。

修改input 的type = 'tel':cursor="intviation_code.length", 这样cursor属性才生效,并指定focus时光标的位置在内容最后;
type=‘tel’,也会有个小问题,可以输入一些字符,但是我们的需求只能是数字,所以代码中要做限制。就能解决这个问题了。

这个cursor无效的问题,在h5模式应该是type的原因,我试了在type是number或digit时cursor就无效,text、tel、idcard就有效

2)还有另外一种方法

  1. 设置input的type=“number”,就不需要设置光标位置了;然后隐藏input文字和光标,相当于间接隐藏了input框;
  2. 用到了css样式设置,color: transparent; caret-color: transparent;
  3. 最主要的还是相对于父元素做绝对定位,与父元素左边距设置为负的本身宽度的一半即可(position: absolute; top: 0; left:-100%; width: 200%; height: 100%;)with: 200%为了增大点击区域,解决Android机型再次唤起键盘不能聚焦,删不掉错误数字的问题。

张鑫旭的CSS改变插入光标颜色caret-color简介及其它变色方法
自我测试CSS : caret-color


还可参考:
6位验证码输入框、隐藏光标、letter-spacing失效、自定义光标,光标动画
uniapp 手机验证码输入框(随机数、倒计时、隐藏手机号码中间四位)可以直接使用

相关内容

热门资讯

广发证券2026年次级债(第一... 中访网数据  中诚信国际信用评级有限责任公司于2026年1月12日发布评级报告,评定广发证券股份有限...
五矿发展(600058.SH)... 五矿发展(600058.SH)发布公告,公司拟以原有业务相关的主要资产及负债(除保留资产、负债外)与...
泓博医药股价异常波动,公司提示... 中访网数据  上海泓博智源医药股份有限公司(股票代码:301230,简称:泓博医药)于2026年1月...
歪歪YY和游戏里骂人的话不带脏... 你有人的外表,却只有猪的智商。你就是一个猥琐且智力低下的生物。你瞅瞅你的脸都在天上飞了。你真是个笨蛋...
最新或2023(历届)北京化工... 最新或2023(历届)北京化工大学新生入学指南考试时间入学手册和军训注意事项北京化工大学最新或202...