drag_component.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <template>
  2. <div class="fixed-box">
  3. <div class="content-bottom">
  4. <div class="draw draggable" ref="draggableRef" :style="{ top: position.y + 'px', left: position.x + 'px' }">
  5. <img src="@/assets/images/wakeup/float-box.png"/>
  6. </div>
  7. <div class="ai-rabit">
  8. <img src="@/assets/images/wakeup/ai-rabit.png"/>
  9. </div>
  10. </div>
  11. </div>
  12. </template>
  13. <script setup>
  14. import {ref, onMounted, onUnmounted} from 'vue';
  15. const draggableRef = ref(null);
  16. const position = ref({x: 0, y: 0});
  17. const dragging = ref(false);
  18. const startX = ref(0);
  19. const startY = ref(0);
  20. const onMouseDown = (event) => {
  21. dragging.value = true;
  22. startX.value = event.clientX - position.value.x;
  23. startY.value = event.clientY - position.value.y;
  24. document.addEventListener('mousemove', onMouseMove);
  25. document.addEventListener('mouseup', onMouseUp);
  26. };
  27. const onTouchStart = (event) => {
  28. if (event.touches.length === 1) {
  29. dragging.value = true;
  30. startX.value = event.touches[0].clientX - position.value.x;
  31. startY.value = event.touches[0].clientY - position.value.y;
  32. document.addEventListener('touchmove', onTouchMove, {passive: true});
  33. document.addEventListener('touchend', onTouchEnd, {passive: true});
  34. }
  35. };
  36. const onMouseMove = (event) => {
  37. if (dragging.value) {
  38. position.value.x = event.clientX - startX.value;
  39. position.value.y = event.clientY - startY.value;
  40. }
  41. };
  42. const onTouchMove = (event) => {
  43. if (dragging.value && event.touches.length === 1) {
  44. position.value.x = event.touches[0].clientX - startX.value;
  45. position.value.y = event.touches[0].clientY - startY.value;
  46. }
  47. };
  48. const onMouseUp = () => {
  49. dragging.value = false;
  50. document.removeEventListener('mousemove', onMouseMove);
  51. document.removeEventListener('mouseup', onMouseUp);
  52. };
  53. const onTouchEnd = () => {
  54. dragging.value = false;
  55. document.removeEventListener('touchmove', onTouchMove, {passive: true});
  56. document.removeEventListener('touchend', onTouchEnd, {passive: true});
  57. };
  58. onMounted(() => {
  59. const draggable = draggableRef.value;
  60. draggable.addEventListener('mousedown', onMouseDown);
  61. draggable.addEventListener('touchstart', onTouchStart, {passive: true});
  62. });
  63. // onUnmounted(() => {
  64. // const draggable = draggableRef.value;
  65. // draggable.removeEventListener('mousedown', onMouseDown);
  66. // draggable.removeEventListener('touchstart', onTouchStart, {passive: true});
  67. // document.removeEventListener('mousemove', onMouseMove);
  68. // document.removeEventListener('mouseup', onMouseUp);
  69. // document.removeEventListener('touchmove', onTouchMove, {passive: true});
  70. // document.removeEventListener('touchend', onTouchEnd, {passive: true});
  71. // });
  72. </script>
  73. <style scoped lang="scss">
  74. .draggable {
  75. width: 100px;
  76. height: 100px;
  77. display: flex;
  78. align-items: center;
  79. justify-content: center;
  80. position: absolute;
  81. cursor: pointer;
  82. user-select: none;
  83. }
  84. .fixed-box{
  85. width: 100%;
  86. height: 100px;
  87. position: absolute;
  88. //bottom: 0px;
  89. top: 678px;
  90. }
  91. .content-bottom{
  92. width: 100%;
  93. height: 270px;
  94. display: flex;
  95. justify-content: space-between;
  96. position: relative;
  97. align-items: center;
  98. .draw{
  99. width: 109px;
  100. height: 170px;
  101. img{
  102. width: 109px;
  103. height: 170px;
  104. }
  105. }
  106. .ai-rabit{
  107. position: absolute;
  108. right: 0px;
  109. bottom: 20px;
  110. display: flex;
  111. align-items: center;
  112. .ai-rabit-text{
  113. width: 345px;
  114. height: 89px;
  115. background: #E8EEF7;
  116. font-weight: 300;
  117. margin-bottom: 20px;
  118. font-size: 22px;
  119. color: #000000;
  120. padding:16px;
  121. border-radius: 24px 24px 24px 24px;
  122. }
  123. img{
  124. width: 178px;
  125. height: 270px;
  126. }
  127. }
  128. }
  129. .draggable-ball {
  130. position: absolute;
  131. cursor: pointer;
  132. user-select: none; /* 防止拖拽时选中文字 */
  133. }
  134. </style>