tui-slide-verify.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <template>
  2. <view class="tui-slide-vcode" :style="{width:slideBarWidth+'px',height:slideBlockWidth+'px',backgroundColor:backgroundColor}">
  3. <text class="tui-text-flashover" :style="{fontSize:size+'rpx',background:getBgColor}">拖动滑块验证</text>
  4. <view class="tui-slide-glided" :style="{backgroundColor:activeBgColor}">
  5. <text :style="{fontSize:size+'rpx',color:activeColor}" v-if="isPass">{{passText}}</text>
  6. </view>
  7. <view class="tui-slider-block" :style="{width:slideBlockWidth+'px',height:slideBlockWidth+'px',borderColor:isPass?activeBorderColor: borderColor}"
  8. :change:prop="parse.slidereset" :prop="reset" :data-slideBarWidth="slideBarWidth" :data-slideBlockWidth="slideBlockWidth"
  9. :data-errorRange="errorRange" :data-disabled="disabled" @touchstart="parse.touchstart" @touchmove="parse.touchmove"
  10. @touchend="parse.touchend">
  11. <text class="tui-slide-icon tui-icon-double_arrow" :style="{fontSize:iconSize+'rpx',color:arrowColor}" v-if="!isPass"></text>
  12. <text class="tui-slide-icon tui-icon-check_mark" :style="{fontSize:iconSize+'rpx',color:checkColor}" v-if="isPass"></text>
  13. </view>
  14. </view>
  15. </template>
  16. <script src="./tui-slide-verify.wxs" module="parse" lang="wxs"></script>
  17. <script>
  18. export default {
  19. name: "tuiSlideVerify",
  20. emits: ['success'],
  21. props: {
  22. //滑动条宽度 px
  23. slideBarWidth: {
  24. type: [Number, String],
  25. default: 300
  26. },
  27. //滑块宽度 px = 滑动条高度
  28. slideBlockWidth: {
  29. type: [Number, String],
  30. default: 40
  31. },
  32. //滑块border颜色
  33. borderColor: {
  34. type: String,
  35. default: '#E9E9E9'
  36. },
  37. //通过验证后滑块border颜色
  38. activeBorderColor: {
  39. type: String,
  40. default: '#19be6b'
  41. },
  42. //误差范围 px 距离右侧多少距离验证通过
  43. errorRange: {
  44. type: [Number, String],
  45. default: 2
  46. },
  47. //重置滑动
  48. resetSlide: {
  49. type: Number,
  50. default: 0
  51. },
  52. //提示文字大小
  53. size: {
  54. type: Number,
  55. default: 30
  56. },
  57. //提示文字颜色
  58. color: {
  59. type: String,
  60. default: "#444"
  61. },
  62. //验证通过后提示文字颜色
  63. activeColor: {
  64. type: String,
  65. default: "#fff"
  66. },
  67. //图标字体大小 rpx
  68. iconSize: {
  69. type: Number,
  70. default: 32
  71. },
  72. //箭头图标颜色
  73. arrowColor: {
  74. type: String,
  75. default: "#cbcbcb"
  76. },
  77. checkColor: {
  78. type: String,
  79. default: "#19be6b"
  80. },
  81. //滑动条背景色
  82. backgroundColor: {
  83. type: String,
  84. default: "#E9E9E9"
  85. },
  86. //滑过区域背景颜色
  87. activeBgColor: {
  88. type: String,
  89. default: "#19be6b"
  90. },
  91. //通过提示文字
  92. passText: {
  93. type: String,
  94. default: '验证通过'
  95. }
  96. },
  97. computed: {
  98. getBgColor() {
  99. return `-webkit-gradient(linear, left top, right top, color-stop(0, ${this.color}), color-stop(.4, ${this.color}), color-stop(.5, white), color-stop(.6, ${this.color}), color-stop(1, ${this.color}))`
  100. }
  101. },
  102. watch: {
  103. resetSlide(val) {
  104. if (val > 0) {
  105. this.slideReset()
  106. }
  107. }
  108. },
  109. data() {
  110. return {
  111. isPass: false,
  112. disabled: false,
  113. reset: 0
  114. }
  115. },
  116. methods: {
  117. success() {
  118. //验证成功
  119. this.isPass = true;
  120. this.disabled = true;
  121. this.$emit('success', {})
  122. },
  123. slideReset() {
  124. this.isPass = false;
  125. this.disabled = false;
  126. this.reset++;
  127. }
  128. }
  129. }
  130. </script>
  131. <style scoped>
  132. @font-face {
  133. font-family: 'tuiSlideVcode';
  134. src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAUYAA0AAAAAB1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAE/AAAABoAAAAci6lfG0dERUYAAATcAAAAHgAAAB4AKQALT1MvMgAAAaAAAABCAAAAVjxuSCZjbWFwAAAB+AAAAEUAAAFK5n3pi2dhc3AAAATUAAAACAAAAAj//wADZ2x5ZgAAAkwAAAD8AAABJDQ/n7JoZWFkAAABMAAAADAAAAA2GSR8FGhoZWEAAAFgAAAAHQAAACQHygOFaG10eAAAAeQAAAARAAAAEgwUAD5sb2NhAAACQAAAAAwAAAAMAFQAkm1heHAAAAGAAAAAHgAAACABEQA6bmFtZQAAA0gAAAFJAAACiCnmEVVwb3N0AAAElAAAAD0AAABPYJEgVXjaY2BkYGAA4oqPSw3j+W2+MnCzMIDAbaY5nHBa5P905jfMeUAuBwMTSBQAHycKCHjaY2BkYGBu+N/AEMPCAALMbxgYGVABCwBYegNYAAAAeNpjYGRgYGBl0GNgYgABEMkFhAwM/8F8BgANfQFMAAB42mNgZGFgnMDAysDA1Ml0hoGBoR9CM75mMGLkAIoysDIzYAUBaa4pDA7PGJ6ZMDf8b2CIYW5gaAAKM4LkAN6ZDA8AAHjaY2GAABYItmMQAQABaABfAAAAeNpjYGBgZoBgGQZGBhBwAfIYwXwWBg0gzQakGRmYnjE8M/n/n4EBQksxS16AqgcCRjYGOIeRCUgwMaACRoZhDwDR6wnSAAAAAAAAAAAAAAAAVACSeNpFzjFOwzAYxfHv2Yodu4ozxHEq2qoSEilLQYoqh6lIIBaugMTC3hswMcPQhYmBjV4AMSFxAppjQDmDSzJle9L7DX9itNx/8i9+QY7mRPDn8ItTlDOcQLhCwcBVtWLCOl/D10v0L5vHnAGMx+EuLSctvQ8PBpMyxWU30/GxwUvMwXqDW6lkNIikllgnGM1MeAqPyWxkeNktczRGgrXUXOkeETGy+2f+x1c0oGnbKUg6KjzVJWUQh23TwlfTrhW+cpZRE3ZCIG8a5EKE3U34yM/sRttCb5hiuNLDjK+i8PO9Db8igmu2cOE1vNsWDTP9xhiuVXZARP+yvTqbeNp9kD1OAzEQhZ/zByQSQiCoXVEA2vyUKRMp9Ailo0g23pBo1155nUg5AS0VB6DlGByAGyDRcgpelkmTImvt6PObmeexAZzjGwr/3yXuhBWO8ShcwREy4Sr1F+Ea+V24jhY+hRvUf4SbuFUD4RYu1BsdVO2Eu5vSbcsKZxgIV3CKJ+Eq9ZVwjfwqXMcVPoQb1L+EmxjjV7iFa2WpDOFhMEFgnEFjig3jAjEcLJIyBtahOfRmEsxMTzd6ETubOBso71dilwMeaDnngCntPbdmvkon/mDLgdSYbh4FS7YpjS4idCgbXyyc1d2oc7D9nu22tNi/a4E1x+xRDWzU/D3bM9JIbAyvkJI18jK3pBJTj2hrrPG7ZynW814IiU68y/SIx5o0dTr3bmniwOLn8owcfbS5kj33qBw+Y1kIeb/dTsQgil2GP5PYcRkAAAB42mNgYoAALjDJyIAOWMGiTIxMjMyCOalpJbop+aVJOam6iUVF+eUCKaWZ6fmlJZmJeckZ+XnpugDvDw1eAAAAAAAAAf//AAIAAQAAAAwAAAAWAAAAAgABAAMABAABAAQAAAACAAAAAHjaY2BgYGQAgqtL1DlA9G2mOZwwGgA1wQSuAAA=) format('woff');
  135. font-weight: normal;
  136. font-style: normal;
  137. font-display: swap;
  138. }
  139. .tui-slide-icon {
  140. font-family: "tuiSlideVcode" !important;
  141. font-size: 34rpx;
  142. font-style: normal;
  143. -webkit-font-smoothing: antialiased;
  144. }
  145. .tui-icon-check_mark:before {
  146. content: "\e634";
  147. }
  148. .tui-icon-double_arrow:before {
  149. content: "\e600";
  150. }
  151. .tui-slide-vcode {
  152. background-color: #EAEEF1;
  153. position: relative;
  154. display: flex;
  155. align-items: center;
  156. justify-content: center;
  157. }
  158. .tui-slide-glided {
  159. width: 0;
  160. height: 100%;
  161. background-color: #19BE6B;
  162. position: absolute;
  163. left: 0;
  164. top: 0;
  165. z-index: 1;
  166. display: flex;
  167. align-items: center;
  168. justify-content: center;
  169. }
  170. .tui-slider-block {
  171. position: absolute;
  172. z-index: 2;
  173. background-color: #FFFFFF;
  174. height: 100%;
  175. display: flex;
  176. align-items: center;
  177. justify-content: center;
  178. border: 1rpx solid;
  179. box-sizing: border-box;
  180. left: 0;
  181. top: 0;
  182. transition: border-color 0.08s;
  183. }
  184. .tui-text-flashover {
  185. -webkit-background-clip: text !important;
  186. -webkit-text-fill-color: transparent !important;
  187. -webkit-animation: animate 1.8s infinite;
  188. }
  189. @-webkit-keyframes animate {
  190. from {
  191. background-position: -90rpx;
  192. }
  193. to {
  194. background-position: 90rpx;
  195. }
  196. }
  197. @keyframes animate {
  198. from {
  199. background-position: -90rpx;
  200. }
  201. to {
  202. background-position: 90rpx;
  203. }
  204. }
  205. </style>