demo.vue 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. <template>
  2. <div class="demo full">
  3. <h2>基础用法</h2>
  4. <nut-drag :style="{ top: '100px', left: '8px' }">
  5. <div class="drag-demo">触摸移动</div>
  6. </nut-drag>
  7. <!-- <h2>限制拖拽方向</h2>
  8. <nut-drag direction="x" >
  9. <div class="drag-demo">只能X轴拖拽</div>
  10. </nut-drag>
  11. <nut-drag direction="y" >
  12. <div class="drag-demo">只能Y轴拖拽</div>
  13. </nut-drag> -->
  14. <div class="drag" ref="drag" @touchstart="touchstart($event)">拖拽测试</div>
  15. </div>
  16. </template>
  17. <script lang="ts">
  18. import { ref, reactive, toRefs, watch } from 'vue';
  19. import { createComponent } from '@/utils/create';
  20. const { createDemo } = createComponent('drag');
  21. export default createDemo({
  22. setup() {
  23. const drag = ref();
  24. const state = reactive({
  25. infoX: 0,
  26. infoY: 0
  27. });
  28. function touchMove(e: { currentTarget: any; targetTouches: any[] }) {
  29. const target = e.currentTarget;
  30. const element = e.targetTouches[0];
  31. console.log(element.clientX, element.clientY, state.infoX, state.infoY);
  32. const x = element.clientX - state.infoX;
  33. const y = element.clientY - state.infoY;
  34. console.log(x, y);
  35. element.target.style.cssText = `transform: translate3d(${x}px, ${y}px ,1px);`;
  36. // element.target.style.transform= `translate(${x}px, ${y}px)`
  37. }
  38. function touchEnd(e) {
  39. // e.target.style.cssText = `transform: none;`
  40. }
  41. function touchstart(e: {
  42. targetTouches: any[];
  43. target: { offsetTop: any };
  44. }) {
  45. const element = e.targetTouches[0];
  46. state.infoX = element.clientX;
  47. state.infoY = element.clientY;
  48. console.log(e.target.offsetTop);
  49. // console.log(state.infoX,state.infoY)
  50. // console.log(element.clientX,state.infoX,element.clientY,state.infoY)
  51. drag.value.addEventListener('touchmove', touchMove, false);
  52. drag.value.addEventListener('touchend', touchEnd, false);
  53. }
  54. return {
  55. drag,
  56. state,
  57. touchstart,
  58. touchMove,
  59. touchEnd
  60. };
  61. }
  62. });
  63. </script>
  64. <style lang="scss" scoped>
  65. .drag-demo {
  66. width: 148px;
  67. height: 35px;
  68. display: flex;
  69. justify-content: center;
  70. align-items: center;
  71. background: linear-gradient(
  72. 135deg,
  73. rgba(250, 44, 25, 1) 0%,
  74. rgba(250, 63, 25, 1) 45%,
  75. rgba(250, 89, 25, 1) 83%,
  76. rgba(250, 100, 25, 1) 100%
  77. );
  78. border-radius: 24px;
  79. }
  80. .drag {
  81. width: 100px;
  82. height: 100px;
  83. display: inline-block;
  84. background: red;
  85. transform: translate3d(0, 0, 1px);
  86. }
  87. </style>