drag.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. export default {
  2. bind(el, binding, vnode) {
  3. const dialogHeaderEl = el.querySelector('.pzTop')
  4. const dragDom = el
  5. dialogHeaderEl.style.cssText += ';cursor:move;'
  6. // dragDom.style.cssText += ';top:0px;'
  7. // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
  8. const getStyle = (function() {
  9. if (window.document.currentStyle) {
  10. return (dom, attr) => dom.currentStyle[attr]
  11. } else {
  12. return (dom, attr) => getComputedStyle(dom, false)[attr]
  13. }
  14. })()
  15. dialogHeaderEl.ontouchstart = (e) => {
  16. if(e.target.className != "pzClose"){
  17. e.preventDefault()
  18. }
  19. // 鼠标按下,计算当前元素距离可视区的距离
  20. const disX = e.touches[0].pageX - dialogHeaderEl.offsetLeft
  21. const disY = e.touches[0].pageY - dialogHeaderEl.offsetTop
  22. const dragDomWidth = dragDom.offsetWidth
  23. const dragDomHeight = dragDom.offsetHeight
  24. const screenWidth = document.body.clientWidth
  25. const screenHeight = document.body.clientHeight
  26. const minDragDomLeft = dragDom.offsetLeft
  27. const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth
  28. const minDragDomTop = dragDom.offsetTop
  29. const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight
  30. // 获取到的值带px 正则匹配替换
  31. let styL = getStyle(dragDom, 'left')
  32. let styT = getStyle(dragDom, 'top')
  33. if (styL.includes('%')) {
  34. styL = +document.body.clientWidth * (+styL.replace(/\%/g, '') / 100)
  35. styT = +document.body.clientHeight * (+styT.replace(/\%/g, '') / 100)
  36. } else {
  37. styL = +styL.replace(/\px/g, '')
  38. styT = +styT.replace(/\px/g, '')
  39. }
  40. dialogHeaderEl.ontouchmove = function(e) {
  41. e.preventDefault()
  42. // 通过事件委托,计算移动的距离
  43. let left = e.touches[0].pageX - disX
  44. let top = e.touches[0].pageY - disY
  45. // 边界处理
  46. if (-(left) > minDragDomLeft) {
  47. left = -minDragDomLeft
  48. } else if (left > maxDragDomLeft) {
  49. left = maxDragDomLeft
  50. }
  51. if (-(top) > minDragDomTop) {
  52. top = -minDragDomTop
  53. } else if (top > maxDragDomTop) {
  54. top = maxDragDomTop
  55. }
  56. // 移动当前元素
  57. dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`
  58. // emit onDrag event
  59. // vnode.child.$emit('dragDialog')
  60. }
  61. }
  62. dialogHeaderEl.onmousedown = (e) => {
  63. // 鼠标按下,计算当前元素距离可视区的距离
  64. const disX = e.clientX - dialogHeaderEl.offsetLeft
  65. const disY = e.clientY - dialogHeaderEl.offsetTop
  66. const dragDomWidth = dragDom.offsetWidth
  67. const dragDomHeight = dragDom.offsetHeight
  68. const screenWidth = document.body.clientWidth
  69. const screenHeight = document.body.clientHeight
  70. const minDragDomLeft = dragDom.offsetLeft
  71. const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth
  72. const minDragDomTop = dragDom.offsetTop
  73. const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight
  74. // 获取到的值带px 正则匹配替换
  75. let styL = getStyle(dragDom, 'left')
  76. let styT = getStyle(dragDom, 'top')
  77. if (styL.includes('%')) {
  78. styL = +document.body.clientWidth * (+styL.replace(/\%/g, '') / 100)
  79. styT = +document.body.clientHeight * (+styT.replace(/\%/g, '') / 100)
  80. } else {
  81. styL = +styL.replace(/\px/g, '')
  82. styT = +styT.replace(/\px/g, '')
  83. }
  84. document.onmousemove = function(e) {
  85. // 通过事件委托,计算移动的距离
  86. let left = e.clientX - disX
  87. let top = e.clientY - disY
  88. // 边界处理
  89. if (-(left) > minDragDomLeft) {
  90. left = -minDragDomLeft
  91. } else if (left > maxDragDomLeft) {
  92. left = maxDragDomLeft
  93. }
  94. if (-(top) > minDragDomTop) {
  95. top = -minDragDomTop
  96. } else if (top > maxDragDomTop) {
  97. top = maxDragDomTop
  98. }
  99. // 移动当前元素
  100. dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`
  101. // emit onDrag event
  102. // vnode.child.$emit('dragDialog')
  103. }
  104. document.onmouseup = function(e) {
  105. document.onmousemove = null
  106. document.onmouseup = null
  107. dialogHeaderEl.ontouchmove = null
  108. document.ontouchend = null
  109. }
  110. document.ontouchend = function(e) {
  111. document.onmousemove = null
  112. document.onmouseup = null
  113. dialogHeaderEl.ontouchmove = null
  114. document.ontouchend = null
  115. }
  116. }
  117. }
  118. }