Ant中Modal组件实现可拖动/拖拽功能

Ant Design组件库中的Modal组件实现可拖动/拖拽功能封装的组件

实现功能:仅Modal的标题区域可拖拽,即实现了拖拽功能,又不影响弹窗内部交互操作。

js代码:

export default class DraggableModal extends React.Component {
  constructor(props) {
    this.state = {
      top: 0,
      left: 0,
      csstop: 0,
      cssleft: 0,
      x: 0,
      y: 0,
      flage: false,
      position: null,
    }
  }

  mouseDown = (e) => {
    let target = e.target,
      _parent = target.offsetParent;

    this.setState({
      top: _parent.offsetTop,
      left: _parent.offsetLeft,
      csstop: _parent.offsetTop,
      cssleft: _parent.offsetLeft,
      x: e.clientX,
      y: e.clientY,
      flage: true,
      position: 'fixed'
    });

    window.onmousemove = this.mouseMove;
  }
  mouseMove = (e) => {
    const { flage, top, left, x, y } = this.state
    if (flage) {
      let curX = e.clientX,
        curY = e.clientY,
        disX = curX - x,
        disY = curY - y
      this.setState({
        cssleft: parseInt(left, 0) + disX,
        csstop: parseInt(top, 0) + disY,
      });
    }
  }
  mouseUp = (e) => {
    const dom = e.target.offsetParent
    this.setState({
      flage: false,
      top: dom.style.top,
      left: dom.style.left,
    });
    window.onmousemove = null
  }

  componentWillUnmount() {
    window.onmousemove = null
  }

  render() {
    const { title, style = {}, wrapClassName, ...otherProps } = this.props
    const { csstop, cssleft, position } = this.state
    const newTitle = (
      <div
        className="dragtitle"
        onMouseDown={this.mouseDown}
        onMouseUp={this.mouseUp}
      >
        {title}
      </div>
    );
    const newStyle = { ...style, marginTop: csstop || style.marginTop, marginLeft: cssleft || style.marginLeft, position, top: '0', left: '0' }
    const wrapclass = `dragmodal ${wrapClassName}`
    return (
      <Modal {...otherProps} title={newTitle} style={newStyle} wrapClassName={wrapclass} maskClosable={false} />
    )
  }
}

样式代码:

 .dragmodal{
        .ant-modal-content{
            position: static;
        }
        .dragtitle{
            padding: 8px 24px;
            cursor: move;
            -webkit-user-select:none;
            -moz-user-select:none;
            -ms-user-select:none;
            user-select:none;
        }
    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cherry014

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值