拖拽边框调整组件大小

1,517 阅读1分钟

前言

最新需要实现一个拖拽改变组件高度的功能,之前一直觉得很简单,今天在做的时候才发现还是有些东西需要注意的,特在此记录。

原理

其实原理并不复杂,大致代码如下:

let startX = startY = 0, draging = false;
const handleMouseDown = event => {
    draging = true;
    startX = event.screenX;
    startY = event.screenY;
}
const handleMouseMove = event => {
    if(draging) {
        // 这里是拖拽下边框和右边框
        // 如果是左边框和上边框,则相反
        element.width += (event.startX - startX);
        element.height += (event.startY - startY);
        startX = event.startX;
        startY = event.startY;
    }
}

const handleMouseUp = () => {
    draging = false;
    startX = startY = 0;
}

需要注意的点

原理并不复杂,需要注意的是,如果mousedownmousemovemouseup都监听边框的话,很容易造成鼠标移出边框,从而造成操作终端,没法出发mouseup。 这时候,我们需要监听documentmousemovemouseup,然后再mouseup事件里面remove掉监听函数即可。


const handleMouseDown = event => {
    draging = true;
    startX = event.screenX;
    startY = event.screenY;
    document.addEventListener('mousemove', handleMouseMove, true);
    document.addEventListener('mouseup', handleMouseUp, true);
}
const handleMouseMove = event => {
    if(draging) {
        // 这里是拖拽下边框和右边框
        // 如果是左边框和上边框,则相反
        element.width += (event.startX - startX);
        element.height += (event.startY - startY);
        startX = event.startX;
        startY = event.startY;
    }
}

const handleMouseUp = () => {
    document.removeEventListener('mousemove', handleMouseMove, true);
    document.removeEventListener('mouseup', handleMouseUp, true);
    draging = false;
    startX = startY = 0;
}

具体demo随后补上,睡了睡了~