drag.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /**
  2. * 弹窗页面同一时间只能渲染一个,可拖拽元素的id都一样'dragModalWrap','dragModalTitle'
  3. * 保证能在关闭的时候移除move事件
  4. */
  5. import $ from 'jquery';
  6. import {
  7. getWindowInnerHeight,
  8. getWindowInnerWidth,
  9. getPageCoordinate
  10. } from './tools'
  11. let width = '',//屏幕宽度
  12. height = '', //屏幕高度
  13. dragWrapper = '',//拖拽元素
  14. mouseX = 0,//鼠标距离页面左侧
  15. mouseY = 0,//鼠标距离页面上部
  16. dragX = 0,//鼠标可拖拽到左边的最大距离(元素定位左侧距离)
  17. dragY = 0,//鼠标可拖拽到上边的最大距离(元素定位上边距离)
  18. isDrag = false,//元素是否处于拖拽中
  19. addPart = null;//展开区域,这个展开的宽度应当是固定宽度了
  20. /**
  21. *
  22. * @param {事件对象} event
  23. * @param {被拖动的元素} dragModalWrap
  24. * @param {可拖动的区域} dragModalTitle
  25. */
  26. function handleMove(event) {
  27. let wrap = $("#"+dragWrapper); //被拖拽的元素
  28. let dragDes = $("#"+addPart); //展開区域
  29. let page = getPageCoordinate(event, '0');//获取鼠标位置
  30. let maxDragX = 0,dragDesWidth = 0;
  31. let wrapHeight = wrap[0].offsetHeight;//直接用.height()获取的高度不准确
  32. let wrapWidth = wrap[0].offsetWidth;
  33. let maxDragY = height - wrapHeight; //最大可拖拽y方向距离
  34. if (dragDes[0]) { //存在就有类似治疗方案的弹窗,最大可推拽x方向距离
  35. dragDesWidth = dragDes[0].offsetWidth//展开元素的宽度
  36. maxDragX = width - wrapWidth - dragDesWidth
  37. } else {
  38. maxDragX = width - wrapWidth
  39. }
  40. if (isDrag) {
  41. dragX = page.boxLeft - mouseX //鼠标可拖拽到左边的最大距离
  42. dragY = page.boxTop - mouseY //鼠标可拖拽到上边的最大距离
  43. if (dragX < 0) { //不能超出左边界
  44. dragX = 0
  45. }
  46. if (dragY < 0) { //不能超出上边界
  47. dragY = 0
  48. }
  49. if (dragDes[0]) {
  50. if (width - dragX - dragDesWidth < wrapWidth) { //不能超出右边界
  51. dragX = maxDragX
  52. }
  53. } else {
  54. if (width - dragX < wrapWidth) { //不能超出右边界
  55. dragX = maxDragX
  56. }
  57. }
  58. if (height - dragY < wrapHeight) { //不能超出下边界
  59. dragY = maxDragY
  60. }
  61. // isMove = true
  62. wrap.css({
  63. left: dragX + 'px',
  64. marginLeft: 0 + 'px',
  65. marginTop: 0 + 'px',
  66. top: dragY + 'px'
  67. })
  68. }
  69. }
  70. /**
  71. * 鼠标弹起弹窗不在跟随鼠标移动
  72. */
  73. function handleUp(){
  74. isDrag = false;
  75. return
  76. }
  77. /**
  78. * @param {拖动元素/清除拖动事件监听} type add:添加事件监听 del:移除事件监听
  79. * @param {展开元素id} addDom
  80. */
  81. function dragBox(dragWrap,dragTop,type,addDom) {
  82. let drag = $("#"+dragTop); //拖拽区域
  83. let wrap = $("#"+dragWrap); //被拖拽的元素
  84. width = getWindowInnerWidth();
  85. height = getWindowInnerHeight();
  86. addPart = addDom||null;
  87. dragWrapper = dragWrap;
  88. if (type === 'del') {
  89. $(document).off('mousemove', handleMove)
  90. $(document).off('mouseup', handleUp)
  91. } else {
  92. drag.on('mousedown', function (event) {
  93. let page = getPageCoordinate(event, '0');
  94. mouseX = page.boxLeft - wrap.offset().left; //鼠标到拖拽元素的左边界的距离
  95. mouseY = page.boxTop - wrap.offset().top; //鼠标到拖拽元素的上边界的距离
  96. isDrag = true
  97. })
  98. $(document).on('mousemove', handleMove)
  99. $(document).on('mouseup', handleUp)
  100. }
  101. }
  102. /**
  103. * 同时出现两个弹窗,第二个弹窗写死
  104. */
  105. let mouseXS = 0,mouseYS = 0,dragXS = 0,dragYS = 0,canDrag = false;
  106. function dragBoxs(type){
  107. let drag = $("#drugTitle"),wrap = $("#drugWrapper");
  108. if(type == 'del'){
  109. $(document).off('mousemove', handleMoves)
  110. $(document).off('mouseup', handleUps)
  111. return
  112. }else{
  113. drag.on('mousedown',function(event){
  114. let page = getPageCoordinate(event,'0');
  115. mouseXS = page.boxLeft - wrap.offset().left;
  116. mouseYS = page.boxTop - wrap.offset().top;
  117. canDrag = true;
  118. })
  119. $(document).on('mousemove',handleMoves)
  120. $(document).on('mousemove',handleUps)
  121. }
  122. }
  123. function handleUps(){
  124. $(document).on('mouseup',function(){canDrag = false;return;})
  125. }
  126. function handleMoves(event){
  127. let wrap = $("#drugWrapper");
  128. let wrapHeight = wrap[0].offsetHeight,wrapWidth = wrap[0].offsetWidth;
  129. let width = getWindowInnerWidth(),height = getWindowInnerHeight(),page = getPageCoordinate(event,'0');
  130. let maxDragY = height - wrapHeight;
  131. let maxDragX = width - wrapWidth
  132. if(canDrag){
  133. dragXS = page.boxLeft - mouseXS;
  134. dragYS = page.boxTop - mouseYS;
  135. if(dragXS < 0){dragXS = 0}
  136. if(dragYS < 0){dragYS = 0}
  137. if(width-dragXS < wrapWidth){dragXS = maxDragX}
  138. if(height-dragYS < wrapHeight){dragYS = maxDragY}
  139. wrap.css({left:dragXS + 'px',marginLeft:0 + 'px',top:dragYS + 'px'})
  140. }
  141. }
  142. module.exports = {
  143. dragBox,
  144. dragBoxs
  145. }