drag.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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. bottom:'auto',
  68. right:'inherit',
  69. })
  70. }
  71. }
  72. /**
  73. * 鼠标弹起弹窗不在跟随鼠标移动
  74. */
  75. function handleUp(){
  76. isDrag = false;
  77. return
  78. }
  79. /**
  80. * @param {拖动元素/清除拖动事件监听} type add:添加事件监听 del:移除事件监听
  81. * @param {展开元素id} addDom
  82. */
  83. function dragBox(dragWrap,dragTop,type,addDom) {
  84. let drag = $("#"+dragTop); //拖拽区域
  85. let wrap = $("#"+dragWrap); //被拖拽的元素
  86. width = getWindowInnerWidth();
  87. height = getWindowInnerHeight();
  88. addPart = addDom||null;
  89. dragWrapper = dragWrap;
  90. if (type === 'del') {
  91. $(document).off('mousemove', handleMove)
  92. $(document).off('mouseup', handleUp)
  93. } else {
  94. drag.on('mousedown', function (event) {
  95. let page = getPageCoordinate(event, '0');
  96. mouseX = page.boxLeft - wrap.offset().left; //鼠标到拖拽元素的左边界的距离
  97. mouseY = page.boxTop - wrap.offset().top; //鼠标到拖拽元素的上边界的距离
  98. isDrag = true
  99. })
  100. $(document).on('mousemove', handleMove)
  101. $(document).on('mouseup', handleUp)
  102. }
  103. }
  104. /**
  105. * 同时出现两个弹窗,第二个弹窗写死
  106. */
  107. let mouseXS = 0,mouseYS = 0,dragXS = 0,dragYS = 0,canDrag = false;
  108. function dragBoxs(type){
  109. let drag = $("#drugTitle"),wrap = $("#drugWrapper");
  110. if(type == 'del'){
  111. $(document).off('mousemove', handleMoves)
  112. $(document).off('mouseup', handleUps)
  113. return
  114. }else{
  115. drag.on('mousedown',function(event){
  116. let page = getPageCoordinate(event,'0');
  117. mouseXS = page.boxLeft - wrap.offset().left;
  118. mouseYS = page.boxTop - wrap.offset().top;
  119. canDrag = true;
  120. })
  121. $(document).on('mousemove',handleMoves)
  122. $(document).on('mousemove',handleUps)
  123. }
  124. }
  125. function handleUps(){
  126. $(document).on('mouseup',function(){canDrag = false;return;})
  127. }
  128. function handleMoves(event){
  129. let wrap = $("#drugWrapper");
  130. let wrapHeight = wrap[0].offsetHeight,wrapWidth = wrap[0].offsetWidth;
  131. let width = getWindowInnerWidth(),height = getWindowInnerHeight(),page = getPageCoordinate(event,'0');
  132. let maxDragY = height - wrapHeight;
  133. let maxDragX = width - wrapWidth
  134. if(canDrag){
  135. dragXS = page.boxLeft - mouseXS;
  136. dragYS = page.boxTop - mouseYS;
  137. if(dragXS < 0){dragXS = 0}
  138. if(dragYS < 0){dragYS = 0}
  139. if(width-dragXS < wrapWidth){dragXS = maxDragX}
  140. if(height-dragYS < wrapHeight){dragYS = maxDragY}
  141. wrap.css({left:dragXS + 'px',marginLeft:0 + 'px',top:dragYS + 'px'})
  142. }
  143. }
  144. module.exports = {
  145. dragBox,
  146. dragBoxs
  147. }