拖拽 参考线

DOM

拖拽线设置为局对定位,容器为相对定位

<div
  style={{
    width: '100%',
    height: '100%',
    position: 'relative',
  }}>
  <div
    id="guideX"
    className={`guideX ${isDraggingX ? 'dragging' : ''}`}
    style={styleX}
    // @ts-ignore
    onMouseDown={handleMouseDownX}
    />
</div>
.guideX {
  background-color: #aaa;
  height: 1px;
  position: absolute;
  z-index: 1001;
}

.guideX:hover {
  cursor: move;
}

拖拽事件

1.记录当前是否被拖拽

const [isDraggingX, setIsDraggingX] = useState(false);

2.鼠标按下时状态标记为正在拖拽

const handleMouseDownX = (event: MouseEvent) => {
  event.preventDefault();
  setIsDraggingX(true);
};

3.拖拽时改变辅助线的位置

const handleMouseMove = (event: MouseEvent) => {
  event.preventDefault();
  if (isDraggingX) {
    setStyleX({
      ...styleX,
      top: event.clientY,
    });
  }
};

4.结束拖拽时状态标记为非拖拽

const handleMouseDownX = (event: MouseEvent) => {
  event.preventDefault();
  setIsDraggingX(true);
};

完整代码

在这里插入图片描述

import { useEffect, useState } from 'react';
import './index.less';

const Image = () => {
  const [styleX, setStyleX] = useState({
    width: '100%',
    left: 0,
    top: 0,
  });

  const [isDraggingX, setIsDraggingX] = useState(false);

  useEffect(() => {
    const handleMouseMove = (event: MouseEvent) => {
      event.preventDefault();
      if (isDraggingX) {
        setStyleX({
          ...styleX,
          top: event.clientY,
        });
      }
    };

    const handleMouseUp = (event: MouseEvent) => {
      event.preventDefault();
      setIsDraggingX(false);
    };

    document.addEventListener('mousemove', handleMouseMove);
    document.addEventListener('mouseup', handleMouseUp);

    return () => {
      document.removeEventListener('mousemove', handleMouseMove);
      document.removeEventListener('mouseup', handleMouseUp);
    };
  }, [isDraggingX, styleX]);

  const handleMouseDownX = (event: MouseEvent) => {
    event.preventDefault();
    setIsDraggingX(true);
  };

  return (
    <div
      style={{
        width: '100%',
        height: '100%',
        position: 'relative',
      }}>
      <div
        id="guideX"
        className={`guideX ${isDraggingX ? 'dragging' : ''}`}
        style={styleX}
        // @ts-ignore
        onMouseDown={handleMouseDownX}
      />
    </div>
  );
};

export default Image;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值