电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

uniapp自定義驗證碼輸入框并隱藏光標(biāo)

瀏覽:130日期:2022-06-01 08:47:15
目錄
  • 一. 前言
  • 二. 實現(xiàn)思路
  • 三. 代碼實現(xiàn)
  • 四. 過程中遇到的問題

一. 前言

先看下使用場景效果圖:

  1. 點擊輸入框喚起鍵盤,藍框就相當(dāng)于input的光標(biāo),驗證碼輸入錯誤或者不符合格式要求會將字體以及邊框改成紅色提示,持續(xù)1s,然后清空數(shù)據(jù),恢復(fù)原邊框樣式;
  2. 5位驗證碼輸入完畢,點擊頁面其他位置,隱藏鍵盤;這時如果發(fā)現(xiàn)驗證碼有誤,再次點擊輸入框又喚起鍵盤,也能正常刪除數(shù)字(這里其實做的時候遇到了bug,再次聚焦不能刪除錯誤數(shù)字,下文會講到)。

二. 實現(xiàn)思路

具體實現(xiàn)思路:

  • 將input標(biāo)簽相對于父元素做絕對定位,與父元素左邊距設(shè)置為負的本身寬度即可(position: absolute; top: 0; left:-100%; width: 100%; height: 100%;)。
  • 動態(tài)去設(shè)置input的focus屬性。
  • input同級使用for循環(huán)去創(chuàng)建5個正方形的view標(biāo)簽。
  • 給input同級創(chuàng)建的view標(biāo)簽綁定點擊事件,在點擊事件方法實現(xiàn)中去設(shè)置input的focus屬性為true,即可彈出鍵盤。
  • 在鍵盤輸入的時候,即可觸發(fā)input屬性的一系列方法,利用v-model雙向綁定,將input輸入的值賦值給循環(huán)的view方框即可。
  • 這樣input也就不在屏幕中,但是又可以觸發(fā)input的事件。

總的來說就是,使用for循環(huán)去創(chuàng)建5個正方形的view標(biāo)簽,然后創(chuàng)建一個input標(biāo)簽,type=tel,最大輸入長度為5(根據(jù)需求來設(shè)置),再將input偽隱藏掉,獲取的值分別放到5個view中展示。

驗證碼失敗后利用v-model雙向綁定,清空輸入的值,增加錯誤提示文字和邊框樣式。

三. 代碼實現(xiàn)

父組件

<uni-popup ref="codeInputPopup" background-color="#fff" :mask-click ="false" type="center">     <CodeInput	  :codeLength="5"	  :disabled="codeBtnDisabled"	  @codeInputClose="codeInputClose"	  @submitGoodCode="submitGoodCode"	 /></uni-popup><script>export default {  data() {    return {     	intviation_code:"", //邀請碼		codeBtnDisabled: false //防止接口請求還未返回數(shù)據(jù),用戶多次點擊    }  },  methods: {    // 提交邀請碼	async submitGoodCode(intviation_code){		this.codeBtnDisabled = true		this.intviation_code = intviation_code				const response =  await this.$api.post("/ebapi/pink_api/secret_intviation_check", {		  code: intviation_code		})		if(response.code === 200){			this.codeBtnDisabled = false			this.$refs.codeInputPopup.close()		}else{			this.codeBtnDisabled = false			this.$refs.codeInputPopup.close()			this.$api.msg(response.msg)		 }		},	codeInputClose(){	  this.$refs.codeInputPopup.close()	  this.codeBtnDisabled = false	}}</script>

子組件

<template>  <view>    <view>      <view>請輸入商品邀請碼</view>      <view @click="codeInputClose"><uni-icons type="closeempty" size="30" color="#999999" />      </view>    </view>    <!-- 錯誤提示 -->    <view v-if="codeColor == "#ff0000"&& !isNum">邀請碼必須{{ codeLength }}位數(shù)</view>    <view v-if="codeColor == "#ff0000"&& isNum ">邀請碼必須是數(shù)字</view>    <view>      <viewv-for="(item, index) in codeLength":key="index"       :style="(index == intviation_code.length? "border: 5rpx solid #1195db; width: 88rpx; height: 88rpx; line-height: 80rpx;":"color: " + codeColor + ";" +"border: 2rpx solid" + codeColor)"@click="focus = true"      >{{ intviation_code[index] && intviation_code[index] || "" }}</view>      <input       type="tel"v-model="intviation_code":maxlength="codeLength":focus="focus":cursor="intviation_code.length"@focus="focus = true "@blur="focus = false"      />    </view>    <button      :class="["submit_code_btn", disabled ? "btn_disabled" : ""]"      :disabled="disabled"      @click="submitGoodCode"    >確定</button>  </view></template><script>export default {  data() {    return {      codeColor: "#313131", //自定義錯誤碼顏色      intviation_code: "", //用戶輸入的驗證碼      focus: false, // 動態(tài)獲取焦點的值      isNum: false,    }  },  props: {    codeLength: {      type: Number,      default: 5,    },    disabled: {      type: Boolean,      default: false,    },  },  methods: {    codeInputClose() {      this.intviation_code = ""      this.$emit("codeInputClose")    },    submitGoodCode() {      if (this.intviation_code.length === this.codeLength) {if (Number(this.intviation_code)) {  this.$emit("submitGoodCode", this.intviation_code)} else {  this.isNum = true  this.publicErrorSetting()}      } else {this.publicErrorSetting()      }    },    // 輸入不符合規(guī)范,更改樣式并清空    publicErrorSetting() {      this.codeColor = "#ff0000"      setTimeout(() => {this.intviation_code = ""this.codeColor = "#313131"this.isNum = false      }, 1000)    },  },}</script><style lang="scss" scoped>.code-popup-top {  display: flex;  justify-content: space-between;  align-items: center;  margin-bottom: 50upx;  .code-title {    font-size: 34upx;    color: #333;    font-weight: bold;    position: relative;    &::before {      content: "";      position: absolute;      bottom: 0;      width: 40upx;      height: 19upx;      background: linear-gradient(to right,rgba(57, 181, 74, 1),rgba(57, 181, 74, 0.1)      );    }  }  .close-icon {    background: #f2f4f7;    border-radius: 50%;    display: flex;    align-items: center;    justify-content: center;  }}.code_errow {  font-size: 30upx;  color: #ff5500;  margin-bottom: 20upx;}.submit_code_btn {  width: 100%;  height: 83upx;  line-height: 83upx;  border-radius: 7upx;  background: #39b54a;  color: #fff;  font-size: 31upx;  text-align: center;  margin-top: 45upx;}.btn_disabled {  color: rgba(255, 255, 255, 0.5) !important;  background-color: rgba(57, 181, 74, 0.4) !important;}.code_input_con {  display: flex;  justify-content: space-around;  position: relative;  .code_input_item {    margin-left: 10upx;    text-align: center;    line-height: 88upx;    border-radius: 14upx;    width: 88upx;    height: 88upx;    font-size: 60upx;    font-weight: bold;    color: #333;    &:last-child {      margin-right: 0;    }  }  /*input隱藏掉*/  .cinput {    position: absolute;    top: 0;    left: -100%;     width: 100%;    height: 100%;  }}</style>

四. 過程中遇到的問題

1)input 的type=‘number’, ios手機正常,光標(biāo)在內(nèi)容最后,但Android手機光標(biāo)有時候在內(nèi)容最前面,導(dǎo)致聚焦內(nèi)容刪不掉。

修改input 的type = 'tel':cursor="intviation_code.length", 這樣cursor屬性才生效,并指定focus時光標(biāo)的位置在內(nèi)容最后;
type=‘tel’,也會有個小問題,可以輸入一些字符,但是我們的需求只能是數(shù)字,所以代碼中要做限制。就能解決這個問題了。

這個cursor無效的問題,在h5模式應(yīng)該是type的原因,我試了在type是number或digit時cursor就無效,text、tel、idcard就有效

2)還有另外一種方法

  • 設(shè)置input的type=“number”,就不需要設(shè)置光標(biāo)位置了;然后隱藏input文字和光標(biāo),相當(dāng)于間接隱藏了input框;
  • 用到了css樣式設(shè)置,color: transparent; caret-color: transparent;
  • 最主要的還是相對于父元素做絕對定位,與父元素左邊距設(shè)置為負的本身寬度的一半即可(position: absolute; top: 0; left:-100%; width: 200%; height: 100%;)with: 200%為了增大點擊區(qū)域,解決Android機型再次喚起鍵盤不能聚焦,刪不掉錯誤數(shù)字的問題。
<template>  <view>      <input       type="number"v-model="intviation_code":maxlength="codeLength":focus="focus"@focus="focus = true "@blur="focus = false"      />    </view>  </view></template><script>export default {  data() {    return {      intviation_code: "", //商品邀請碼      focus: false,    }  },  methods: {}</script><style lang="scss" scoped>.cinput {    position: absolute;    top: 0;    left: -100%;    width: 200%;    height: 100%;    color: transparent;  //輸入文字顏色透明    caret-color: transparent !important; //改變插入光標(biāo)顏色為透明  }  }  // 考慮兼容性  // 瀏覽器支持caret-color屬性,優(yōu)先使用caret-color(Chrome/Firefox/Opera);其次使用::first-line方法(Safari);最后忽略(如IE)。  @supports (-webkit-mask: none) and (not (caret-color: transparent)) {    .cinput {      color: transparent !important;    }    .cinput::first-line {      color: transparent !important;    }  }</style>

還可參考:
6位驗證碼輸入框、隱藏光標(biāo)、letter-spacing失效、自定義光標(biāo),光標(biāo)動畫
uniapp 手機驗證碼輸入框(隨機數(shù)、倒計時、隱藏手機號碼中間四位)可以直接使用

到此這篇關(guān)于uniapp自定義驗證碼輸入框,隱藏光標(biāo)的文章就介紹到這了,更多相關(guān)uniapp驗證碼輸入框內(nèi)容請搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

標(biāo)簽: JavaScript
主站蜘蛛池模板: 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 扒渣机,铁水扒渣机,钢水扒渣机,铁水捞渣机,钢水捞渣机-烟台盛利达工程技术有限公司 | 游泳池设计|设备|配件|药品|吸污机-东莞市太平洋康体设施有限公司 | 奇酷教育-Python培训|UI培训|WEB大前端培训|Unity3D培训|HTML5培训|人工智能培训|JAVA开发的教育品牌 | ph计,实验室ph计,台式ph计,实验室酸度计,台式酸度计 | 安全,主动,被动,柔性,山体滑坡,sns,钢丝绳,边坡,防护网,护栏网,围栏,栏杆,栅栏,厂家 - 护栏网防护网生产厂家 | 钢衬四氟管道_钢衬四氟直管_聚四氟乙烯衬里管件_聚四氟乙烯衬里管道-沧州汇霖管道科技有限公司 | 地图标注-手机导航电子地图如何标注-房地产商场地图标记【DiTuBiaoZhu.net】 | 太平洋亲子网_健康育儿 品质生活| 铜镍-康铜-锰铜-电阻合金-NC003 - 杭州兴宇合金有限公司 | 双段式高压鼓风机-雕刻机用真空泵-绍兴天晨机械有限公司 | 板式换热器_板式换热器价格_管式换热器厂家-青岛康景辉 | 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | 猪I型/II型胶原-五克隆合剂-细胞冻存培养基-北京博蕾德科技发展有限公司 | 数年网路-免费在线工具您的在线工具箱-shuyear.com | YT保温材料_YT无机保温砂浆_外墙保温材料_南阳银通节能建材高新技术开发有限公司 | 济南货架定做_仓储货架生产厂_重型货架厂_仓库货架批发_济南启力仓储设备有限公司 | 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | 江苏全风,高压风机,全风环保风机,全风环形高压风机,防爆高压风机厂家-江苏全风环保科技有限公司(官网) | 紫外可见光分光度计-紫外分光度计-分光光度仪-屹谱仪器制造(上海)有限公司 | 广州各区危化证办理_危险化学品经营许可证代办 | 利浦顿蒸汽发生器厂家-电蒸汽发生器/燃气蒸汽发生器_湖北利浦顿热能科技有限公司官网 | 阳光模拟试验箱_高低温试验箱_高低温冲击试验箱_快速温变试验箱|东莞市赛思检测设备有限公司 | 应急灯_消防应急灯_应急照明灯_应急灯厂家-大成智慧官网 | 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | 电销卡 防封电销卡 不封号电销卡 电话销售卡 白名单电销卡 电销系统 外呼系统 | 无硅导热垫片-碳纤维导热垫片-导热相变材料厂家-东莞市盛元新材料科技有限公司 | 全自动在线分板机_铣刀式在线分板机_曲线分板机_PCB分板机-东莞市亿协自动化设备有限公司 | 蓝鹏测控平台 - 智慧车间系统 - 车间生产数据采集与分析系统 | 翰墨AI智能写作助手官网_人工智能问答在线AI写作免费一键生成 | 广州展览制作|展台制作工厂|展览设计制作|展览展示制作|搭建制作公司 | 桐城新闻网—桐城市融媒体中心主办 | 连续密炼机_双转子连续密炼机_连续式密炼机-南京永睿机械制造有限公司 | 脉冲除尘器,除尘器厂家-淄博机械 | 哈尔滨京科脑康神经内科医院-哈尔滨治疗头痛医院-哈尔滨治疗癫痫康复医院 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 山东PE给水管厂家,山东双壁波纹管,山东钢带增强波纹管,山东PE穿线管,山东PE农田灌溉管,山东MPP电力保护套管-山东德诺塑业有限公司 | 苏州防水公司_厂房屋面外墙防水_地下室卫生间防水堵漏-苏州伊诺尔防水工程有限公司 | 螺旋压榨机-刮泥机-潜水搅拌机-电动泥斗-潜水推流器-南京格林兰环保设备有限公司 | 脑钠肽-白介素4|白介素8试剂盒-研域(上海)化学试剂有限公司 | 天一线缆邯郸有限公司_煤矿用电缆厂家_矿用光缆厂家_矿用控制电缆_矿用通信电缆-天一线缆邯郸有限公司 |