Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.27 KB | None | 0 0
  1. <template>
  2. <ul
  3. @mouseup="mouseUp($event)"
  4. @mousemove="mouseMove($event)">
  5. <li v-for="(header, index) in headers" :key="index" :ref="`element-${index}`">
  6. {{ header }}
  7. <button
  8. @mousedown="mouseDown($event, index)"
  9. @mouseup="mouseUp($event)"
  10. :ref="`resize-${index}`"
  11. class="resize"
  12. :class="{ 'dragged': beforeChangeSize.col === index }"
  13. >
  14. </button>
  15. </li>
  16. </ul>
  17. </template>
  18.  
  19. <script type="text/javascript">
  20. export default {
  21. name: 'drag-column-header',
  22. data() {
  23. return {
  24. beforeChangeSize: {},
  25. eventDrag: false,
  26. headers: ['a', 'b', 'c']
  27. }
  28. },
  29. methods: {
  30. mouseDown(event, colIndex) {
  31. this.eventDrag = true
  32. const [element] = this.$refs[`element-${colIndex}`]
  33.  
  34. this.beforeChangeSize = {
  35. offset: event.clientX,
  36. col: colIndex,
  37. width: element.offsetWidth
  38. }
  39.  
  40. const [resizeButton] = this.$refs[`resize-${colIndex}`]
  41. resizeButton.style.top = `${element.parentElement.offsetTop}px`
  42. },
  43. mouseMove(event) {
  44. if (this.eventDrag) {
  45. const [resizeButton] = this.$refs[`resize-${this.beforeChangeSize.col}`]
  46.  
  47. const offsetTop = resizeButton.offsetTop
  48. const offsetBottom = offsetTop + resizeButton.offsetHeight
  49. if (offsetTop <= event.clientY && offsetBottom >= event.clientY) {
  50. // Change style.left of resizeButton
  51. resizeButton.style.left = `${event.clientX}px`
  52. } else {
  53. // Called MouseUp function
  54. this.mouseUp()
  55. }
  56. }
  57. },
  58. mouseUp(event) {
  59. if (this.eventDrag) {
  60. this.eventDrag = false
  61. const oldOffset = this.beforeChangeSize.offset
  62. const newOffset = event.clientX
  63. const result = Math.max(newOffset, oldOffset) - Math.min(newOffset, oldOffset)
  64.  
  65. // Calcul the newSize
  66. let newSize
  67. if (newOffset > oldOffset) {
  68. newSize = this.beforeChangeSize.width + result
  69. } else {
  70. newSize = this.beforeChangeSize.width - result
  71. }
  72.  
  73. // Give the newSize to the element
  74. const [element] = this.$refs[`element-${this.beforeChangeSize.col}`]
  75. element.style.width = `${newSize}px`
  76.  
  77. // Reset the style of the current resize button
  78. const [resizeButton] = this.$refs[`resize-${this.beforeChangeSize.col}`]
  79. resizeButton.style.left = 'auto'
  80. resizeButton.style.top = '0'
  81.  
  82. // Reset the beforeChangeSize to an empty object
  83. this.beforeChangeSize = {}
  84. }
  85. }
  86. }
  87. }
  88. </script>
  89.  
  90. <style lang="scss" scoped>
  91. ul {
  92. display: flex;
  93. padding: 0;
  94. list-style: none;
  95. }
  96. li {
  97. position: relative;
  98. width: 100px;
  99. height: 30px;
  100. background: aliceblue;
  101. border: 1px solid #ddd;
  102. padding: 4px 8px;
  103. }
  104. .resize {
  105. position: absolute;
  106. top: 0;
  107. right: 0;
  108. height: 45px;
  109. background: #7d8ba5;
  110. width: 5px;
  111. padding: 0;
  112. border: 0;
  113. cursor: col-resize;
  114. box-shadow: none;
  115. outline: none;
  116. opacity: 0;
  117. transition: opacity ease .5s;
  118. &.dragged {
  119. opacity: 1;
  120. position: fixed;
  121. top: auto;
  122. }
  123. &:hover {
  124. opacity: 1;
  125. }
  126. }
  127. </style>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement