jq-slideVerify.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. $(document).ready(function () {
  2. (function (doc, win) {
  3. var docEl = doc.documentElement,
  4. resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
  5. recalc = function () {
  6. var clientWidth = docEl.clientWidth;
  7. if (!clientWidth) return;
  8. if (clientWidth >= 750) {
  9. docEl.style.fontSize = '100px';
  10. } else {
  11. docEl.style.fontSize = 100 * (clientWidth / 750) + 'px';
  12. }
  13. };
  14. if (!doc.addEventListener) return;
  15. win.addEventListener(resizeEvt, recalc, false);
  16. doc.addEventListener('DOMContentLoaded', recalc, false);
  17. })(document, window);
  18. (function (global, factory) {
  19. typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
  20. typeof define === 'function' && define.amd ? define(factory) :
  21. (window.slideVerifyPlug = factory());
  22. }(this, (function () {
  23. 'use strict';
  24. var SlideVerify = function (ele, opt) {
  25. this.$ele = $(ele);
  26. //默认参数
  27. this.defaults = {
  28. initText: '请按住滑块,拖动到最右边',
  29. sucessText: '验证通过',
  30. getSuccessState: function () {
  31. }
  32. }
  33. this.settings = $.extend({}, this.defaults, opt);
  34. this.touchX = 0;
  35. this.slideFinishState = false;
  36. this.init();
  37. }
  38. SlideVerify.prototype = {
  39. constructor: SlideVerify,
  40. init: function () {
  41. var _this = this;
  42. _this.initDom();
  43. _this.initStyle();
  44. _this.initEle();
  45. _this._mousedown();
  46. _this._mouseup();
  47. _this._touchstart();
  48. _this._touchmove();
  49. _this._touchend();
  50. },
  51. initDom: function () {
  52. var html = $(
  53. '<div class="drag-progress dragProgress">' +
  54. '</div>' +
  55. '<span class="drag-btn dragBtn">' +
  56. '</span>' +
  57. '<span class="fix-tips fixTips">' +
  58. this.settings.initText +
  59. '</span>' +
  60. '<span class="verify-msg sucMsg">' +
  61. this.settings.sucessText +
  62. '</span>');
  63. this.$ele.append(html);
  64. },
  65. initStyle: function () {
  66. if (this.settings.wrapWidth) {
  67. this.$ele.css({
  68. 'width': this.settings.wrapWidth
  69. })
  70. } else {
  71. this.$ele.css({
  72. 'width': '100%'
  73. })
  74. }
  75. },
  76. initEle: function () {
  77. this.slideBtn = this.$ele.find('.dragBtn');
  78. this.slideProEle = this.$ele.find('.dragProgress');
  79. this.slideSucMsgEle = this.$ele.find('.sucMsg');
  80. this.slideFixTipsEle = this.$ele.find('.fixTips');
  81. this.maxSlideWid = this.calSlideWidth();
  82. },
  83. _mousedown: function () {
  84. var _this = this;
  85. var ifThisMousedown = false;
  86. _this.slideBtn.on('mousedown', function (e) {
  87. var distenceX = e.pageX;
  88. e.preventDefault();
  89. if (_this.slideFinishState || _this.ifAnimated()) {
  90. return false;
  91. }
  92. ifThisMousedown = true;
  93. $(document).mousemove(function (e) {
  94. if (!ifThisMousedown) {
  95. return false;
  96. }
  97. var curX = e.pageX - distenceX;
  98. if (curX >= _this.maxSlideWid) {
  99. _this.setDragBtnSty(_this.maxSlideWid);
  100. _this.setDragProgressSty(_this.maxSlideWid);
  101. _this.cancelMouseMove();
  102. _this.slideFinishState = true;
  103. if (_this.settings.getSuccessState) {
  104. _this.settings.getSuccessState(_this.slideFinishState);
  105. }
  106. _this.successSty();
  107. } else if (curX <= 0) {
  108. _this.setDragBtnSty('0');
  109. _this.setDragProgressSty('0');
  110. } else {
  111. _this.setDragBtnSty(curX);
  112. _this.setDragProgressSty(curX);
  113. }
  114. })
  115. $(document).mouseup(function () {
  116. if (!ifThisMousedown) {
  117. return false;
  118. }
  119. ifThisMousedown = false;
  120. if (_this.slideFinishState) {
  121. _this.cancelMouseMove();
  122. return false;
  123. } else {
  124. _this.failAnimate();
  125. _this.cancelMouseMove();
  126. }
  127. });
  128. })
  129. },
  130. _mouseup: function () {
  131. },
  132. _touchstart: function () {
  133. var _this = this;
  134. _this.slideBtn.on('touchstart', function (e) {
  135. _this.touchX = e.originalEvent.targetTouches[0].pageX;
  136. if (_this.slideFinishState || _this.ifAnimated()) {
  137. // _this.cancelTouchmove();
  138. return false;
  139. }
  140. })
  141. },
  142. _touchmove: function () {
  143. var _this = this;
  144. _this.slideBtn.on('touchmove', function (e) {
  145. e.preventDefault();
  146. var curX = e.originalEvent.targetTouches[0].pageX - _this.touchX;
  147. if (curX >= _this.maxSlideWid) {
  148. _this.setDragBtnSty(_this.maxSlideWid);
  149. _this.setDragProgressSty(_this.maxSlideWid);
  150. _this.cancelTouchmove();
  151. _this.successSty();
  152. _this.slideFinishState = true;
  153. if (_this.settings.getSuccessState) {
  154. _this.settings.getSuccessState(_this.slideFinishState);
  155. }
  156. _this.slideFinishState = true;
  157. } else if (curX <= 0) {
  158. _this.setDragBtnSty('0');
  159. _this.setDragProgressSty('0');
  160. } else {
  161. _this.setDragBtnSty(curX);
  162. _this.setDragProgressSty(curX);
  163. }
  164. })
  165. },
  166. _touchend: function () {
  167. var _this = this;
  168. _this.slideBtn.on('touchend', function () {
  169. if (_this.slideFinishState) {
  170. _this.cancelTouchmove();
  171. return false;
  172. } else {
  173. _this.failAnimate();
  174. }
  175. })
  176. },
  177. getDragBtnWid: function () {//获取滑块的宽度,
  178. return parseInt(this.slideBtn.width());
  179. },
  180. getDragWrapWid: function () {//获取 本容器的的宽度,以防万一
  181. return parseFloat(this.$ele.outerWidth());
  182. },
  183. calSlideWidth: function () {
  184. var _this = this;
  185. return _this.getDragWrapWid() - _this.getDragBtnWid()
  186. },
  187. ifAnimated: function () {//判断 是否动画状态
  188. return this.slideBtn.is(":animated")
  189. },
  190. getDragBtnLeft: function () { //判断当前 按钮 离左侧的距离
  191. return this.slideBtn.css('left');
  192. },
  193. ifSlideRight: function () {
  194. var _this = this;
  195. if (parseInt(_this.getDragBtnLeft()) == parseInt(_this.calSlideWidth())) {
  196. return true;
  197. } else {
  198. return false;
  199. }
  200. },
  201. setDragBtnSty: function (left) {
  202. this.slideBtn.css({
  203. 'left': left
  204. })
  205. },
  206. setDragProgressSty: function (wid) {
  207. this.slideProEle.css({
  208. 'width': wid
  209. })
  210. },
  211. cancelMouseMove: function () {
  212. $(document).off('mousemove');
  213. },
  214. cancelTouchmove: function () {
  215. this.slideBtn.off('touchmove');
  216. },
  217. successSty: function () {
  218. this.slideSucMsgEle.show();
  219. this.slideBtn.addClass('suc-drag-btn');
  220. },
  221. failAnimate: function () {
  222. this.slideBtn.animate({
  223. 'left': '-1px'
  224. }, 200);
  225. this.slideProEle.animate({
  226. 'width': 0
  227. }, 200)
  228. },
  229. resetVerify: function () {
  230. this.slideSucMsgEle.hide();
  231. this.slideBtn.removeClass('suc-drag-btn');
  232. this.slideFinishState = false;
  233. this.slideProEle.css({
  234. 'width': 0
  235. });
  236. this.slideBtn.css({
  237. 'left': '-1px'
  238. })
  239. this._touchmove();
  240. },
  241. }
  242. var inlineCss = '*{margin:0;padding:0;box-sizing:border-box}.verify-wrap{border-radius:6px;width:352px;height:40px;background-color:rgba(255,255,255,.05);border:1px solid #C2C9D1;margin:5px auto;position:relative}.verify-wrap .drag-btn{position:absolute;left:-1px;top:-1px; border-radius: 8px;width:60px;height:40px;background:#ECECEC 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 #1DB23E;;border-top:1px solid #1DB23E;;width:0;background-color:#1DB23E;;color:#fff;font-size:18px;text-align:center;line-height:40px}.verify-wrap .fix-tips,.verify-msg{border-radius:6px;width:100%;position:absolute;right:0;left:1px;height:100%;color:rgba(0, 0, 0, 0.50);z-index:1;line-height:40px;font-size:15px;text-align:center}.verify-wrap .verify-msg{background-color:#1DB23E;;color:#fff;display:none}';
  243. var styleObj = $(
  244. '<style type="text/css">' + inlineCss + '</style>'
  245. )
  246. $('head').prepend(styleObj);
  247. var slideVerify = window.slideVerifyPlug || SlideVerify;
  248. return slideVerify;
  249. })));
  250. })