iview实现鼠标拖拽改变列宽

本文介绍了在iview中实现鼠标拖拽改变列宽的功能,包括针对原有问题的改进,如解决拖动时的事件触发问题和动态控制列显示后的影响。尽管存在隐藏/显示列后,最后一列无法拖拽的bug,但提供了相关代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**

iview实现鼠标拖拽改变列宽

**
一、相比原文改进如下内容
鼠标拖动时,移动到表头以外的区域时无法触发onmouseup事件
动态控制列的显示和隐藏后,部分列无法拖拽的问题
二、仍存在的问题
因为我是将隐藏/显示列和拖动改变列宽同时使用,目前仍存在一个问题,就是改变显示的列之后,最后的一列无法拖拽改变列宽,如果你不需要隐藏/显示列,则可以忽略
三、代码如下
1、引入的dragtable.js文件,代码如下:

export const dragTable = (vm, dom) => {
    let tTD // 用来存储当前更改宽度的Table Cell,避免快速移动鼠标的问题
    let table = dom
    for (let i = 0; i < table.length + 1; i++) {
        table[i].onmousedown = () => {
            // 记录down的位置坐标
            tTD = vm
                // 显示拖拽指针的范围0~5,可调整
            if (event.offsetX >= 0 && event.offsetX <= 5) {
                tTD.mouseDown = true
                tTD.oldX = event.x
            }
        }

        // up
        table[i].onmouseup = () => {
            // 结束宽度调整
            if (tTD === undefined) {
                tTD = vm
            }
            tTD.mouseDown = false
            table[i].style.cursor = 'default'
        }

        // move
        table[i].onmousemove = () => {
            // 更改鼠标样式,i=0的单元格不做拖拽操作
            if (event.offsetX >= 0 && event.offsetX <= 5 && i !== 0) {
                table[i].style.cursor = 'col-resize'
            } else {
                table[i].style.cursor = 'default'
            }
            // 取出暂存的Table Cell
            if (tTD === undefined) {
                tTD = vm
            }
            // 调整宽度
            if (tTD.mouseDown != null && tTD.mouseDown === true) {
                table[i].style.cursor = 'default'
                let moveDistance = event.x - tTD.oldX

                // 要处理i=0时的情况
                if (moveDistance >= 0 && i >= 1) {
                    // 注意 columns  要与你自己定义的Columns 名字相同!!!
                    tTD.columns[i - 1].width = parseInt(tTD.columns[i - 1].width) + moveDistance
                    tTD.oldX = event.x
                    table[i].style.cursor = 'col-resize'
                } else {
                    tTD.columns[i].width = parseInt(tTD.columns[i].width) - Math.abs(moveDistance)
                    tTD.oldX = event.x
                    table[i].style.cursor = 'col-resize'
                }
                // 调整该列中的每个Cell,如果存在小于55的,改成55
                for (let j = 0; j < tTD.columns.length; j++) {
                    if (tTD.columns[j].width < 55) {
                        tTD.columns[j].width = 55
                    }
                }
            }
        }
    }
}

2、在需要的页面引入dragtable.js文件

 import { dragTable } from '@/components/你自己的路径/dragtable'

3、页面渲染完后调用

mounted () {
      // 拖拽调整列宽,设置延时执行,避免动态隐藏/显示列后无法拖拽的问题(这里没有方隐藏/显示列)的代码
      // 修改隐藏/显示后需要再调用一次
      setTimeout(() => {
      // 这里的dom为你的table的‘th‘,
        let dom = this.$refs.table.$refs.header.getElementsByTagName("th");
        dragTable(this, dom)
      }, 300)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值