成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

uniapp自定義驗證碼輸入框并隱藏光標

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

一. 前言

先看下使用場景效果圖:

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

二. 實現思路

具體實現思路:

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

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

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

三. 代碼實現

父組件

<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 //防止接口請求還未返回數據,用戶多次點擊    }  },  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 }}位數</view>    <view v-if="codeColor == "#ff0000"&& isNum ">邀請碼必須是數字</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, // 動態獲取焦點的值      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()      }    },    // 輸入不符合規范,更改樣式并清空    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手機正常,光標在內容最后,但Android手機光標有時候在內容最前面,導致聚焦內容刪不掉。

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

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

2)還有另外一種方法

  • 設置input的type=“number”,就不需要設置光標位置了;然后隱藏input文字和光標,相當于間接隱藏了input框;
  • 用到了css樣式設置,color: transparent; caret-color: transparent;
  • 最主要的還是相對于父元素做絕對定位,與父元素左邊距設置為負的本身寬度的一半即可(position: absolute; top: 0; left:-100%; width: 200%; height: 100%;)with: 200%為了增大點擊區域,解決Android機型再次喚起鍵盤不能聚焦,刪不掉錯誤數字的問題。
<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; //改變插入光標顏色為透明  }  }  // 考慮兼容性  // 瀏覽器支持caret-color屬性,優先使用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位驗證碼輸入框、隱藏光標、letter-spacing失效、自定義光標,光標動畫
uniapp 手機驗證碼輸入框(隨機數、倒計時、隱藏手機號碼中間四位)可以直接使用

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

標簽: JavaScript
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品人人爽人人做我的可爱| 欧美日本精品一区二区三区| 欧美日韩视频在线一区二区| 亚洲欧美一区二区三区国产精品 | 国产精品高潮呻吟| 91亚洲精品乱码久久久久久蜜桃| 欧美一级二级在线观看| 精品一区免费av| 欧美色图天堂网| 狠狠色丁香九九婷婷综合五月| 欧美午夜视频网站| 日韩激情中文字幕| 久久精品女人的天堂av| 午夜欧美在线一二页| 国产一区二区高清视频| 亚洲激情五月婷婷| 国产一区二区三区的电影| 亚洲综合色成人| 亚洲欧美日韩在线综合| 亚洲国产精品综合小说图片区| 久久大逼视频| 亚洲电影你懂得| 亚洲综合国产| 日韩在线卡一卡二| 欧洲激情一区二区| 精品一区中文字幕| 欧美剧情电影在线观看完整版免费励志电影 | 久久久久亚洲蜜桃| 99精品国产视频| 国产精品麻豆久久久| 夜夜嗨av一区二区三区网站四季av| 一区二区日韩av| 色综合久久天天| 日本va欧美va欧美va精品| 在线免费观看日本欧美| 久久 天天综合| 欧美精品高清视频| 国产传媒一区在线| 久久久久久久免费视频了| hitomi一区二区三区精品| 久久久久久久久久看片| 欧美性久久久| 尤物av一区二区| 久久午夜精品| 激情国产一区二区| 欧美电视剧在线看免费| 欧美一区国产在线| 亚洲美女在线国产| 91久久免费观看| 国产高清亚洲一区| 日本一区二区免费在线| 在线一区视频| 免费视频一区二区| 精品国产乱码久久久久久蜜臀| 波多野结衣视频一区| 久久先锋影音av| 亚洲高清免费| 美女尤物国产一区| 久久只精品国产| 亚洲电影在线| 美女网站色91| 精品久久久三级丝袜| 亚洲午夜精品福利| 日韩成人av影视| 欧美不卡一区二区三区| 一区二区亚洲| 蜜桃av一区二区在线观看| 日韩欧美黄色影院| 亚洲国产精品毛片| 日韩和欧美一区二区三区| 日韩亚洲欧美在线观看| 黄色欧美成人| 麻豆一区二区三| 久久精品这里都是精品| 日韩视频精品| 国产伦精品一区二区三区视频青涩| 国产亚洲一区二区三区在线观看 | 99久久久无码国产精品| 亚洲女人小视频在线观看| 久久天堂精品| 99热99精品| 亚洲一区在线免费观看| 7777精品伊人久久久大香线蕉 | 亚洲国内精品| 国产一区二区福利| 综合亚洲深深色噜噜狠狠网站| 欧美日韩一区二区三区免费看| 91香蕉视频在线| 视频一区视频二区中文| 2020国产精品自拍| 久久久综合网| 国产一区在线精品| 日韩美女视频一区二区 | 国产毛片精品国产一区二区三区| 最新热久久免费视频| 欧美人xxxx| 99riav1国产精品视频| 国产成人免费在线观看| 亚洲综合网站在线观看| 国产高清不卡二三区| 亚洲精选视频在线| 欧美成人综合网站| 欧美亚洲免费| 欧美一区综合| 免费在线看一区| 国产精品久久久久久一区二区三区 | 午夜精品免费| 国产综合色在线视频区| 亚洲天堂网中文字| 日韩免费观看高清完整版在线观看| 免费在线观看成人av| 欧美黄污视频| 九九**精品视频免费播放| 一区二区三区精品视频在线观看| 国产69精品久久久久毛片| 丝袜美腿亚洲色图| 国产精品久久久久久久久免费桃花 | 日本欧美一区二区三区| 欧美激情一区二区三区蜜桃视频| 欧美日韩国产免费| 国产精品乱码| 欧美日韩精品免费看| 国产成人精品影院| 日韩精品亚洲一区| 亚洲人妖av一区二区| 日韩欧美aaaaaa| 欧美最猛性xxxxx直播| 狠狠色丁香久久综合频道| 丁香五精品蜜臀久久久久99网站| 午夜视频在线观看一区| 国产精品久久久久影院色老大| 91精品国产91久久久久久最新毛片 | 欧美成人欧美edvon| 欧美在线视频你懂得| 亚洲看片免费| 91视频免费观看| 国产精品一区免费在线观看| 亚洲国产一区视频| 国产精品国产自产拍高清av| 日韩欧美激情在线| 精品污污网站免费看| 欧美亚洲一级| 亚洲精品女人| 韩国精品一区二区三区| 99久久精品国产毛片| 国产精品一区在线观看你懂的| 奇米888四色在线精品| 亚洲国产精品久久艾草纯爱| 自拍偷拍亚洲综合| 欧美国产乱子伦| 欧美电视剧在线观看完整版| 欧美日韩精品欧美日韩精品一| 久久国产直播| 在线亚洲自拍| 亚洲毛片在线| 伊人影院久久| 欧美午夜免费| 国产精品s色| 欧美 日韩 国产精品免费观看| 高清视频一区二区| 国产一区二区三区精品欧美日韩一区二区三区| 日韩精彩视频在线观看| 亚洲成在线观看| 亚洲美女视频在线观看| 中文字幕在线观看不卡视频| 欧美国产日韩亚洲一区| 国产欧美精品日韩区二区麻豆天美| 精品欧美久久久| 日韩女优视频免费观看| 欧美一区二区在线观看| 欧美一区二区视频在线观看2020| 欧美日韩一区二区三区不卡| 欧美日韩一区二区不卡| 精品视频一区二区三区免费| 欧美亚洲自拍偷拍| 欧美三级在线视频| 欧美日韩国产在线观看| 欧美日韩在线精品一区二区三区激情 | 亚洲国产精品一区二区第四页av| 欧美视频在线观看| 欧美日韩系列| 韩日视频一区| 一区视频在线| 国产欧美欧美| 性xx色xx综合久久久xx| 久久狠狠一本精品综合网| 麻豆成人在线| 在线视频欧美精品| 欧美日韩久久不卡| 欧美一区二区精美| 欧美成人免费网站| 久久久亚洲精品石原莉奈| 亚洲国产精品传媒在线观看| 中文字幕在线观看不卡视频| 一区二区三区在线观看国产| 午夜a成v人精品| 经典三级在线一区| 成人av第一页| 国产精品高清一区二区三区| 亚洲另类视频|