一 目标:

实现antd Modal 弹窗或者其他弹窗的点击标题进行拖拽的效果

二 准备及思录:  

 1.使用antd  Modal 组件,要想改变位置需要改变Modal style 的left 和top属性,其默认值分别为0,100

  2.Modal 的标题可以使组件,给这个标题组件添加一个鼠标点击事件,记录下鼠标点击的位置;

  当鼠标移动的时候计算鼠标当前的位置和初始的位置差就是弹窗相对于初始位置的移动距离,从而计算出弹窗的实际位置,

  通过state 记录弹窗实际位置,从而更新弹窗的style,

 3.计算鼠标的位置防止移除屏幕视图窗口

三 代码实现:


import { PureComponent } from 'react'
import { Modal } from 'antd' class MoveModal extends PureComponent {
    constructor(props) {
        super(props) // Modal 的初始值
        this.state = {
            styleTop: 100,
            styleLeft: 0
        }
    }     // 计算是否超出屏幕;超出后停止移动监听
    inWindow = (left, top, startPosX, startPosY) => {
        const H = document.body.clientHeight
        const W = document.body.clientWidth
        if ((left < 20 && startPosX > left) || (left > W - 20 && startPosX < left) || (top < 20 && startPosY > top) || (top > H - 20 && startPosY < top)) {
            document.body.onmousemove = null
            document.body.onmouseup = null
            return false
        }
        return true
    }     onMouseDown = (e) => {
        e.preventDefault() // 记录初始移动的鼠标位置
        const startPosX = e.clientX
        const startPosY = e.clientY
        const { styleLeft, styleTop } = this.state // 添加鼠标移动事件
        document.body.onmousemove = (e) => {
            const left = e.clientX - startPosX + styleLeft
            const top = e.clientY - startPosY + styleTop
            if (this.inWindow(e.clientX, e.clientY, startPosX, startPosY)) {
                this.setState({
                    styleLeft: left,
                    styleTop: top
                })
            }
        } // 鼠标放开时去掉移动事件
        document.body.onmouseup = function() {
            document.body.onmousemove = null
        }
    }     render() {
        const { styleLeft, styleTop } = this.state
        const style = { left: styleLeft, top: styleTop }
        return (
            <Modal
                visible={this.props.visible}
                onCancel={this.props.onCancel}
                style={style}
                footer={null}
                title={
                    <div style={{ width: '100%', cursor: 'move' }} onMouseDown={this.onMouseDown}>
                        标题
                    </div>
                }
            >
                {this.props.children}
            </Modal>
        )
    }
}
export default MoveModal

Antd Modal 可拖拽移动的更多相关文章

  1. 让Antd Modal变成可拖动弹窗

    思路: 1.首先需要两个DIV,一个是和视口一样大drag-mask,绑定mouseMove事件和mouseUp事件,另一个是和Modal一样大的drag-target,绑定mouseDown事件: ...

  2. 通过 JS 实现简单的拖拽功能并且可以在特定元素上禁止拖拽

    前言 关于讲解 JS 的拖拽功能的文章数不胜数,我确实没有必要大费周章再写一篇重复的文章来吸引眼球.本文的重点是讲解如何在某些特定的元素上禁止拖拽.这是我在编写插件时遇到的问题,其实很多插件的拖拽功能 ...

  3. react 可拖拽改变位置和大小的弹窗

    一 目标 最近,项目上需要一个可以弹出一个可以移动位置和改变大小的窗口,来显示一下对当前页面的一个辅助内容 二 思路 1.之前写过一个antd modal的可移动弹窗但是毕竟不如自己写的更定制化,比如 ...

  4. spring html5 拖拽上传多文件

    注:这仅仅是一个粗略笔记.有些代码可能没用.兴许会再更新一个能够使用的版本号.不足之处,敬请见谅. 1.spring环境搭建,这里使用的是spring3的jar,须要同一时候引入common-IO 和 ...

  5. 关于 JS 拖拽功能的冲突问题及解决方法

    前言 我在之前写过关于 JS 拖拽的文章,实现方式和网上能搜到的方法大致相同,别无二致,但是在一次偶然的测试中发现,这种绑定事件的方式可能会和其它的拖拽事件产生冲突,由此产生了对于事件绑定的思考.本文 ...

  6. jqGrid选择列控件向右拖拽超出边界处理

    jqGrid选择列控件向右拖拽超出边界处理 $("#tb_DeviceInfo").jqGrid('navButtonAdd', '#jqGridPager', {         ...

  7. 为Bootstrap模态对话框添加拖拽移动功能

    请自行下载使用到的Bootstrap库及jQuery库 <!DOCTYPE html> <html> <head lang="en"> < ...

  8. 利用jQuery-UI和jsPlumb实现拖拽连接模型

    简介 之前公司需要做一个自定义数据搜索模型的功能,大体是这样的:左边显示的每一个模型对应于数据库中的一个表,把左边的模型拉入右边的容器内,会显示这个模型(也就是表)下的列信息,然后通过连线确定各独立的 ...

  9. 基于jquery-ui及bootstrap的可拖拽模态框

    可直接使用代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...

随机推荐

  1. VSCode编写vue项目文件出现红色波浪线

    VSCode编写vue项目文件出现红色波浪线 在我们在写Vue或其他项目时,可能会遇到这样一个问题:明明自己的代码程序都没有错,代码规范也符合标准,为什么它就是给我报错显红呢??? 解决方案 第一种方 ...

  2. C/C++ 文件读写

    •前言 第一次接触文件读写是在大一的C语言教材中,当时哼哧吧唧的学的贼费劲,虽然最后也学会了,但好像没怎么用过. 在后来,就是在OJ上刷题的时候,编写的代码有时候连样例都不能通过: 这个时候就需要各种 ...

  3. 【深度学习 01】线性回归+PyTorch实现

    1. 线性回归 1.1 线性模型 当输入包含d个特征,预测结果表示为: 记x为样本的特征向量,w为权重向量,上式可表示为: 对于含有n个样本的数据集,可用X来表示n个样本的特征集合,其中行代表样本,列 ...

  4. vector存放边的方法

    #include<bits/stdc++.h> using namespace std; struct Edge{ int x; int y; }; vector <Edge> ...

  5. jQuery--筛选【串联函数】

    串联函数简介 A.add(B) 将A和B组合成一个对象 A.children().andSelf() 将之前的对象添加到操作集合中 A.children().children().end() 回到最近 ...

  6. Python - 异常处理初步

  7. buuctf 荷兰带宽数据泄露

    荷兰带宽数据泄露 下载附件得一个conf.bin文件,这个文件是路由信息文件,题目并没有任何提示,我们先来测试一下最简单的,找username或password然后当作flag交上去,我们使用Rout ...

  8. State Lattice Planner(状态栅格规划)

    参考文献: Efficient constrained path planning via search in state lattices Differentially Constrained Mo ...

  9. C语言break,return

    C语言break,continue,return的相似与区别 相同点: 都改变了程序的执行流程 区别是:break    用于循环和switch分支,跳出它所在分支或循环体到它所在的模块的      ...

  10. int 越界处理

    在程序运行中,如果运算结果太大超出了所定义的类型,那么可能会影响整个程序的运行结果,甚至是程序出错. 因此,在编写程序时,加入越界处理就显得一起重要了. 用整型 int 来举个例子吧,int型占四个字 ...