splitPane.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import { onMounted, onUnmounted, ref, watchEffect } from "vue";
  2. export function dragSplitPane() {
  3. let pos = { y: 0 };
  4. const dragSpliter = ref(null as unknown as HTMLDivElement);
  5. let topPercent = ref(30);
  6. const mouseDownHandler = function (e: MouseEvent) {
  7. // console.log(e);
  8. if (e.target !== dragSpliter.value) return;
  9. e.preventDefault();
  10. pos = {
  11. // Get the current mouse position
  12. y: e.clientY,
  13. };
  14. // topPercent.value = 100 * e.offsetTop / e.target.parentElement.style.height;
  15. if (dragSpliter.value) {
  16. // dragSpliter.value.style.cursor = "row-resize";
  17. // console.log("add");
  18. document.addEventListener("mousemove", mouseMoveHandler);
  19. document.addEventListener("mouseup", mouseUpHandler);
  20. }
  21. return false;
  22. };
  23. const mouseMoveHandler = function (e: MouseEvent) {
  24. e.preventDefault();
  25. const dy = e.clientY - pos.y;
  26. // // Scroll the element
  27. // // dragSpliter.value.style.marginTop =
  28. // // (parseFloat(dragSpliter.value.style.marginTop) || 0) + dy + "px";
  29. dragSpliter.value.style.marginTop = dy + "px";
  30. // console.log(dragSpliter.value.style.marginTop);
  31. const target = e.target as HTMLElement;
  32. const parent = target.parentElement;
  33. // console.log(getComputedStyle(e.target.parentElement).height);
  34. // console.log({
  35. // offsetTop: target.offsetTop,
  36. // dy: dy,
  37. // movementY: e.movementY,
  38. // });
  39. // if (parent)
  40. // topPercent.value =
  41. // (100 * target.offsetTop) / parseFloat(getComputedStyle(parent).height);
  42. // console.log("topPercent", topPercent.value);
  43. return false;
  44. };
  45. const mouseUpHandler = function (e: MouseEvent) {
  46. const dy = e.clientY - pos.y;
  47. // Scroll the element
  48. // dragSpliter.value.style.marginTop =
  49. // (parseFloat(dragSpliter.value.style.marginTop) || 0) + dy + "px";
  50. // dragSpliter.value.style.marginTop = dy + "px";
  51. // console.log(dragSpliter.value.style.marginTop);
  52. const target = e.target as HTMLElement;
  53. const parent = target.parentElement;
  54. // console.log(getComputedStyle(e.target.parentElement).height);
  55. // console.log("offsetTop", target.offsetTop);
  56. // TODO: 暂时不知道为啥有 140
  57. if (parent)
  58. topPercent.value =
  59. (100 * target.offsetTop) / parseFloat(getComputedStyle(parent).height);
  60. // console.log({
  61. // topPercent: topPercent.value,
  62. // "parseFloat(getComputedStyle(parent).height)": parseFloat(
  63. // getComputedStyle(parent).height
  64. // ),
  65. // "target.offsetTop": target.offsetTop,
  66. // });
  67. // console.log("removed");
  68. if (dragSpliter.value) {
  69. document.removeEventListener("mousemove", mouseMoveHandler);
  70. document.removeEventListener("mouseup", mouseUpHandler);
  71. // dragSpliter.value.style.cursor = "auto";
  72. dragSpliter.value.style.marginTop = "0";
  73. }
  74. };
  75. onMounted(() => {
  76. watchEffect(() => {
  77. if (dragSpliter.value) {
  78. // console.log("watchEffect");
  79. document.addEventListener("mousedown", mouseDownHandler);
  80. }
  81. });
  82. });
  83. onUnmounted(() => {
  84. if (dragSpliter.value) {
  85. document.removeEventListener("mousedown", mouseDownHandler);
  86. document.removeEventListener("mousemove", mouseMoveHandler);
  87. document.removeEventListener("mouseup", mouseUpHandler);
  88. }
  89. });
  90. return { dragSpliter, topPercent };
  91. }