原生实现表格宽度拖拽

2024-06-30  本文已影响0人  jeneen1129
<template>
  <div class="table">
    <div class="table-wrapper">
      <div class="table_top">
        <span id="drag-control_span">标题1</span>
        ......
      </div>
      <div class="table_content">
        <ul>
          <li
            v-for="(item, index) in list"
            :key="index"
          >
            <span class="drag-accused_span">
              <div class="span_c">标题xxxx</div>
            </span>
            ......
          </li>
        </ul>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [],
      dragging: false,
      draggState: {},
      disabled: [],
    }
  },
  mounted() {
    document.documentElement.style.setProperty(
      '--myColWidth',
      this.isMore ? '100px' : '700px'
    )
    this.addDragEvent()
  },
  methods: {
    // 添加流程标题拖拽事件
    addDragEvent() {
      const _me = this
      const el = this.$el
      const dragDom = el.querySelector('span#drag-control_span')
      dragDom.style.cursor = 'col-resize'
      dragDom.onmousedown = e => {
        // 鼠标按下,计算当前元素距离可视区的距离
        _me.dragging = true
        _me.draggState = {
          disX: e.clientX,
          w: dragDom.clientWidth,
        }
        const handleMouseMove = e => {
          if (_me.dragging) {
            var windowWidth =
              document.documentElement.clientWidth || document.body.clientWidth
            const minW = 200
            const maxW = windowWidth - dragDom.offsetWidth
            // 通过事件委托,计算移动的距离
            const l = e.clientX - _me.draggState.disX
            // 改变当前元素宽度,不可超过最小最大值
            var nw = _me.draggState.w + l
            nw = nw < minW ? minW : nw
            nw = nw > maxW ? maxW : nw
            document.documentElement.style.setProperty(
              '--myColWidth',
              `${nw}px`
            )
          }
        }
        const clear = () => {
          if (_me.dragging) {
            _me.dragging = false
            _me.draggState = {}
          }
          dragDom.removeEventListener('mousemove', handleMouseMove)
          dragDom.removeEventListener('mouseup', clear)
          dragDom.removeEventListener('mouseleave', clear)
        }
        dragDom.addEventListener('mousemove', handleMouseMove)
        dragDom.addEventListener('mouseup', clear)
        dragDom.addEventListener('mouseleave', clear)
      }
    },
  },
}
</script>

<style scoped lang="scss">
.table {
  .table_top {
    span:first-child {
      width: var(--myColWidth);
    }
  }
}
</style>
上一篇下一篇

猜你喜欢

热点阅读