slide-verify.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. import $ from 'jquery'
  2. export class SlideVerify {
  3. constructor(ele, opt) {
  4. this.$ele = $(ele)
  5. //默认参数
  6. this.defaults = {
  7. initText: '请按住滑块,拖动到最右边',
  8. sucessText: '验证通过',
  9. getSuccessState: function () {},
  10. }
  11. this.settings = $.extend({}, this.defaults, opt)
  12. this.touchX = 0
  13. this.slideFinishState = false
  14. this.init()
  15. }
  16. init() {
  17. var _this = this
  18. const inlineCss =
  19. '*{margin:0;padding:0;box-sizing:border-box}.verify-wrap{width:350px;height:40px;background-color:#e5e5e5;border:1px solid #f7f7f7;margin:0 auto;position:relative}.verify-wrap .drag-btn{position:absolute;left:-1px;top:-1px;width:50px;height:40px;background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAiCAYAAAApkEs2AAAA/UlEQVRYhe3XLc9GYBjG8eN6dkdFIQuqoCiCbj6ob2CCIplRaJKqEHT3c/kAz66Xc/fLnvO3UY7N/jNmxDAMF77AQ57iOH53x5/GccTPuyNUcSg1DqXGodQ4lNr/CC3LEsuyaG8mrEKzLEPXdZjnWWszYRXq+z7yPMc0Tej7XnkzYf2Muq6LoiiwrivatsV1XUrby0Mlx3Huu7fvO5qmUd50kL31QgijTdXD+gq/zvNEVVXwPA9pmipvOqxDj+O4Q4IgQJIkypsuq9Bt21DXNaIoug/VzYRVqHw55J0Kw1BrMyHkXyj/3BHiUGocSo1DqXEota8Jvb/18hP16Z7qL3h/w53n4AAAAABJRU5ErkJggg==) no-repeat center center;background-size:100% 100%;z-index:2;cursor:move;}.verify-wrap .suc-drag-btn{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAiCAYAAAApkEs2AAACA0lEQVRYhe2Y2yuDYRzHv7PJYc5zKspYSRMymStXu5NCs5W4csEfwJ+gSA53csg1F4R/gSu0OcWSmNIQkfMcEvu9tdpY79793leo91Nbbft993x6nj2/52kal8v1gX+Ajp4sFstve4jidrsR99sSUlFFlUYVVRpVVGl0SnyJ934VaxczOLpdwd3bufBeWnw+StLrYc1tQ3FqnewxZIk+vz9g7rAHO9dL3z67efXBfTkrPCqymtBqGkaiNoU9FnvpSXJyzx5R8itUQ7WU4cIWnT/qhe9xS3I91VKGC0uUfpPbV4uSajUhQ1CGshxYorRxpGDObECf1Ysm40DM2a+wNhPt7mhUZzvhMI1Aq9HBkFgUUzYSrBkNtiDCkGBES/Eg8pLKwiSdplFB8uRhEzMH3RGzsSC7j9oKe1CT4wi0oEZMeRzITy4XJOM0WkFy2uOE//1O7jA8UWrm1CeJ5dMxlGXYoI/PQrd5AQlavagkZTmwlt4UOHGCnPs9wkw+vl0jSZcWdSZDsz8uas1tD3t99rSL8b0W3Lz4cHy/LrrctYEjlQNr6Y2ptag0NIf10gv/Pvo3akRzlOGe++yTyV4yhAJ9leR6qqUMF7YoXTC6zPPChSMaVEO1ci4lstoTDdxROhE4Fjv/9jUvCIkoISPGv7nhq6JKo4oqjSqqNEIfpf8f/zqf+36643RPeo8AAAAASUVORK5CYII=) no-repeat center center;background-size:100% 100%}.verify-wrap .drag-progress{position:absolute;left:0;top:-1px;height:40px;border-top:1px solid #7ac23c;border-top:1px solid #7ac23c;width:0;background-color:#7ac23c;color:#fff;font-size:18px;text-align:center;line-height:40px}.verify-wrap .fix-tips,.verify-msg{width:100%;position:absolute;right:0;left:1px;height:100%;color:#51555c;z-index:1;line-height:38px;font-size:12px;text-align:center}.verify-wrap .verify-msg{background-color:#7ac23c;color:#fff;display:none}'
  20. const styleObj = $('<style type="text/css">' + inlineCss + '</style>')
  21. $('head').prepend(styleObj)
  22. _this.initDom()
  23. _this.initStyle()
  24. _this.initEle()
  25. _this._mousedown()
  26. _this._mouseup()
  27. _this._touchstart()
  28. _this._touchmove()
  29. _this._touchend()
  30. }
  31. initDom() {
  32. var html = $(
  33. '<div class="drag-progress dragProgress">' +
  34. '</div>' +
  35. '<span class="drag-btn dragBtn">' +
  36. '</span>' +
  37. '<span class="fix-tips fixTips">' +
  38. this.settings.initText +
  39. '</span>' +
  40. '<span class="verify-msg sucMsg">' +
  41. this.settings.sucessText +
  42. '</span>'
  43. )
  44. this.$ele.append(html)
  45. }
  46. initStyle() {
  47. if (this.settings.wrapWidth) {
  48. this.$ele.css({
  49. width: this.settings.wrapWidth,
  50. })
  51. } else {
  52. this.$ele.css({
  53. width: '100%',
  54. })
  55. }
  56. }
  57. initEle() {
  58. this.slideBtn = this.$ele.find('.dragBtn')
  59. this.slideProEle = this.$ele.find('.dragProgress')
  60. this.slideSucMsgEle = this.$ele.find('.sucMsg')
  61. this.slideFixTipsEle = this.$ele.find('.fixTips')
  62. this.maxSlideWid = this.calSlideWidth()
  63. }
  64. _mousedown() {
  65. var _this = this
  66. var ifThisMousedown = false
  67. _this.slideBtn.on('mousedown', function (e) {
  68. var distenceX = e.pageX
  69. e.preventDefault()
  70. if (_this.slideFinishState || _this.ifAnimated()) {
  71. return false
  72. }
  73. ifThisMousedown = true
  74. $(document).mousemove(function (e) {
  75. if (!ifThisMousedown) {
  76. return false
  77. }
  78. var curX = e.pageX - distenceX
  79. if (curX >= _this.maxSlideWid) {
  80. _this.setDragBtnSty(_this.maxSlideWid)
  81. _this.setDragProgressSty(_this.maxSlideWid)
  82. _this.cancelMouseMove()
  83. _this.slideFinishState = true
  84. if (_this.settings.getSuccessState) {
  85. _this.settings.getSuccessState(_this.slideFinishState)
  86. }
  87. _this.successSty()
  88. } else if (curX <= 0) {
  89. _this.setDragBtnSty('0')
  90. _this.setDragProgressSty('0')
  91. } else {
  92. _this.setDragBtnSty(curX)
  93. _this.setDragProgressSty(curX)
  94. }
  95. })
  96. $(document).mouseup(function () {
  97. if (!ifThisMousedown) {
  98. return false
  99. }
  100. ifThisMousedown = false
  101. if (_this.slideFinishState) {
  102. _this.cancelMouseMove()
  103. return false
  104. } else {
  105. _this.failAnimate()
  106. _this.cancelMouseMove()
  107. }
  108. })
  109. })
  110. }
  111. _mouseup() {}
  112. _touchstart() {
  113. var _this = this
  114. _this.slideBtn.on('touchstart', function (e) {
  115. _this.touchX = e.originalEvent.targetTouches[0].pageX
  116. if (_this.slideFinishState || _this.ifAnimated()) {
  117. return false
  118. }
  119. })
  120. }
  121. _touchmove() {
  122. var _this = this
  123. _this.slideBtn.on('touchmove', function (e) {
  124. e.preventDefault()
  125. var curX = e.originalEvent.targetTouches[0].pageX - _this.touchX
  126. if (curX >= _this.maxSlideWid) {
  127. _this.setDragBtnSty(_this.maxSlideWid)
  128. _this.setDragProgressSty(_this.maxSlideWid)
  129. _this.cancelTouchmove()
  130. _this.successSty()
  131. _this.slideFinishState = true
  132. if (_this.settings.getSuccessState) {
  133. _this.settings.getSuccessState(_this.slideFinishState)
  134. }
  135. _this.slideFinishState = true
  136. } else if (curX <= 0) {
  137. _this.setDragBtnSty('0')
  138. _this.setDragProgressSty('0')
  139. } else {
  140. _this.setDragBtnSty(curX)
  141. _this.setDragProgressSty(curX)
  142. }
  143. })
  144. }
  145. _touchend() {
  146. var _this = this
  147. _this.slideBtn.on('touchend', function () {
  148. if (_this.slideFinishState) {
  149. _this.cancelTouchmove()
  150. return false
  151. } else {
  152. _this.failAnimate()
  153. }
  154. })
  155. }
  156. getDragBtnWid() {
  157. //获取滑块的宽度,
  158. return parseInt(this.slideBtn.width())
  159. }
  160. getDragWrapWid() {
  161. //获取 本容器的的宽度,以防万一
  162. return parseFloat(this.$ele.outerWidth())
  163. }
  164. calSlideWidth() {
  165. var _this = this
  166. return _this.getDragWrapWid() - _this.getDragBtnWid()
  167. }
  168. ifAnimated() {
  169. //判断 是否动画状态
  170. return this.slideBtn.is(':animated')
  171. }
  172. getDragBtnLeft() {
  173. //判断当前 按钮 离左侧的距离
  174. return this.slideBtn.css('left')
  175. }
  176. ifSlideRight() {
  177. var _this = this
  178. if (parseInt(_this.getDragBtnLeft()) == parseInt(_this.calSlideWidth())) {
  179. return true
  180. } else {
  181. return false
  182. }
  183. }
  184. setDragBtnSty(left) {
  185. this.slideBtn.css({
  186. left: left,
  187. })
  188. }
  189. setDragProgressSty(wid) {
  190. this.slideProEle.css({
  191. width: wid,
  192. })
  193. }
  194. cancelMouseMove() {
  195. $(document).off('mousemove')
  196. }
  197. cancelTouchmove() {
  198. this.slideBtn.off('touchmove')
  199. }
  200. successSty() {
  201. this.slideSucMsgEle.show()
  202. this.slideBtn.addClass('suc-drag-btn')
  203. }
  204. failAnimate() {
  205. this.slideBtn.animate(
  206. {
  207. left: '-1px',
  208. },
  209. 200
  210. )
  211. this.slideProEle.animate(
  212. {
  213. width: 0,
  214. },
  215. 200
  216. )
  217. }
  218. resetVerify() {
  219. this.slideSucMsgEle.hide()
  220. this.slideBtn.removeClass('suc-drag-btn')
  221. this.slideFinishState = false
  222. this.slideProEle.css({
  223. width: 0,
  224. })
  225. this.slideBtn.css({
  226. left: '-1px',
  227. })
  228. this._touchmove()
  229. }
  230. }