drawer.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. layui.define(['jquery', 'element'], function(exports) {
  2. "use strict";
  3. /**
  4. * Drawer component
  5. * */
  6. var MOD_NAME = 'drawer',
  7. $ = layui.jquery,
  8. element = layui.element;
  9. var drawer = new function() {
  10. /**
  11. * open drawer
  12. * */
  13. this.open = function(option) {
  14. var obj = new mSlider({
  15. dom: option.dom,
  16. direction: option.direction,
  17. distance: option.distance,
  18. time: option.time ? option.time : 0,
  19. maskClose: option.maskClose,
  20. callback: option.success
  21. });
  22. obj.open();
  23. return obj;
  24. }
  25. }
  26. exports(MOD_NAME, drawer);
  27. });
  28. /**
  29. * 源码
  30. * */
  31. (function(b, c) {
  32. function a(d) {
  33. this.opts = {
  34. "direction": d.direction || "left",
  35. "distance": d.distance || "60%",
  36. "dom": this.Q(d.dom),
  37. "time": d.time || "",
  38. "maskClose": (d.maskClose + "").toString() !== "false" ? true : false,
  39. "callback": d.callback || ""
  40. };
  41. this.rnd = this.rnd();
  42. this.dom = this.opts.dom[0];
  43. this.wrap = "";
  44. this.inner = "";
  45. this.mask = "";
  46. this.init()
  47. }
  48. a.prototype = {
  49. Q: function(d) {
  50. return document.querySelectorAll(d)
  51. },
  52. isMobile: function() {
  53. return navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i) ? true : false
  54. },
  55. addEvent: function(f, e, d) {
  56. if (f.attachEvent) {
  57. f.attachEvent("on" + e, d)
  58. } else {
  59. f.addEventListener(e, d, false)
  60. }
  61. },
  62. rnd: function() {
  63. return Math.random().toString(36).substr(2, 6)
  64. },
  65. init: function() {
  66. var g = this;
  67. if (!g.dom) {
  68. console.log("未正确绑定弹窗容器");
  69. return
  70. }
  71. var d = document.createElement("div");
  72. var e = document.createElement("div");
  73. var f = document.createElement("div");
  74. d.setAttribute("class", "mSlider-main ms-" + g.rnd);
  75. e.setAttribute("class", "mSlider-inner");
  76. f.setAttribute("class", "mSlider-mask");
  77. g.Q("body")[0].appendChild(d);
  78. g.Q(".ms-" + g.rnd)[0].appendChild(e);
  79. g.Q(".ms-" + g.rnd)[0].appendChild(f);
  80. g.wrap = g.Q(".ms-" + g.rnd)[0];
  81. g.inner = g.Q(".ms-" + g.rnd + " .mSlider-inner")[0];
  82. g.mask = g.Q(".ms-" + g.rnd + " .mSlider-mask")[0];
  83. g.inner.appendChild(g.dom);
  84. switch (g.opts.direction) {
  85. case "top":
  86. g.top = "0";
  87. g.left = "0";
  88. g.width = "100%";
  89. g.height = g.opts.distance;
  90. g.translate = "0,-100%,0";
  91. break;
  92. case "bottom":
  93. g.bottom = "0";
  94. g.left = "0";
  95. g.width = "100%";
  96. g.height = g.opts.distance;
  97. g.translate = "0,100%,0";
  98. break;
  99. case "right":
  100. g.top = "0";
  101. g.right = "0";
  102. g.width = g.opts.distance;
  103. g.height = document.documentElement.clientHeight + "px";
  104. g.translate = "100%,0,0";
  105. break;
  106. default:
  107. g.top = "0";
  108. g.left = "0";
  109. g.width = g.opts.distance;
  110. g.height = document.documentElement.clientHeight + "px";
  111. g.translate = "-100%,0,0"
  112. }
  113. g.wrap.style.display = "none";
  114. g.wrap.style.position = "fixed";
  115. g.wrap.style.top = "0";
  116. g.wrap.style.left = "0";
  117. g.wrap.style.width = "100%";
  118. g.wrap.style.height = "100%";
  119. g.wrap.style.zIndex = 9999999;
  120. g.inner.style.position = "absolute";
  121. g.inner.style.top = g.top;
  122. g.inner.style.bottom = g.bottom;
  123. g.inner.style.left = g.left;
  124. g.inner.style.right = g.right;
  125. g.inner.style.width = g.width;
  126. g.inner.style.height = g.height;
  127. g.inner.style.backgroundColor = "#fff";
  128. g.inner.style.transform = "translate3d(" + g.translate + ")";
  129. g.inner.style.webkitTransition = "all .2s ease-out";
  130. g.inner.style.transition = "all .2s ease-out";
  131. g.inner.style.zIndex = 10000000;
  132. g.mask.style.width = "100%";
  133. g.mask.style.height = "100%";
  134. g.mask.style.opacity = "0.1";
  135. g.mask.style.backgroundColor = "black";
  136. g.mask.style.zIndex = "9999998";
  137. g.mask.style.webkitBackfaceVisibility = "hidden";
  138. g.events()
  139. },
  140. open: function() {
  141. var d = this;
  142. d.wrap.style.display = "block";
  143. setTimeout(function() {
  144. d.inner.style.transform = "translate3d(0,0,0)";
  145. d.inner.style.webkitTransform = "translate3d(0,0,0)";
  146. d.mask.style.opacity = 0.1
  147. }, 30);
  148. if (d.opts.time) {
  149. d.timer = setTimeout(function() {
  150. d.close()
  151. }, d.opts.time)
  152. }
  153. },
  154. close: function() {
  155. var d = this;
  156. d.timer && clearTimeout(d.timer);
  157. d.inner.style.webkitTransform = "translate3d(" + d.translate + ")";
  158. d.inner.style.transform = "translate3d(" + d.translate + ")";
  159. d.mask.style.opacity = 0;
  160. setTimeout(function() {
  161. d.wrap.style.display = "none";
  162. d.timer = null;
  163. d.opts.callback && d.opts.callback()
  164. }, 300)
  165. },
  166. events: function() {
  167. var d = this;
  168. d.addEvent(d.mask, "touchmove", function(f) {
  169. f.preventDefault()
  170. });
  171. d.addEvent(d.mask, (d.isMobile() ? "touchend" : "click"), function(f) {
  172. if (d.opts.maskClose) {
  173. d.close()
  174. }
  175. })
  176. }
  177. };
  178. b.mSlider = a
  179. })(window);