一 目标

 最近,项目上需要一个可以弹出一个可以移动位置和改变大小的窗口,来显示一下对当前页面的一个辅助内容

二 思路

 1.之前写过一个antd modal的可移动弹窗但是毕竟不如自己写的更定制化,比如不需要显示遮罩层,但是移动的思想一致都是鼠标的按下和抬起事件以及坐标位置来计算改变弹窗位置.

 2.窗口的的小调节可以用css的resize属性,当然也可以自己写一个指定边框拖拽调整大小的功能,后期可能会更新

三 代码内容

 index.js

 1 import React, { Component } from 'react'
2 import { Icon } from 'antd'
3 import style from './index.less'
4 class PopContainer extends Component {
5 constructor(props) {
6 super(props);
7 this.windowH = document.body.clientHeight;
8 this.windowW = document.body.clientWidth;
9 this.state = {
10 styleTop: 20,
11 styleLeft: 10,
12 styleHeight: props.height || this.windowH * 0.85,
13 styleWidth: props.width || this.windowW * 0.45,
14 }
15 }
16   //计算是否超出屏幕
17 InWindow = (left, top, startPosX, startPosY) => {
18 let H = document.body.clientHeight;
19 let W = document.body.clientWidth;
20 if ((left < 20 && startPosX > left) || (left > W - 20 && startPosX < left) ||
21 (top < 20 && startPosY > top) || ((top > H - 20 && startPosY < top))) {
22 return false
23 }
24 return true
25 }
26 onMouseDown = e => {
27 e.preventDefault();
28 let startPosX = e.clientX;
29 let startPosY = e.clientY;
30 const { styleLeft, styleTop } = this.state;
31 document.body.onmousemove = e => {
32 let left = e.clientX - startPosX + styleLeft;
33 let top = e.clientY - startPosY + styleTop;
34 if (this.InWindow(e.clientX, e.clientY, startPosX, startPosY)) {
35 this.setState({
36 styleLeft: left,
37 styleTop: top,
38 })
39 } else {
40 document.body.onmousemove = null;
41 document.body.onmouseup = null;
42 }
43 };
44 document.body.onmouseup = function () {
45 document.body.onmousemove = null;
46 document.body.onmouseup = null;
47 };
48 };
49 render() {
50 const { styleLeft, styleTop, styleHeight, styleWidth } = this.state
51 const { visible, onClose, children, bodyStyle, title } = this.props
52 return <div className={style.popContainer} style={{
53 display: visible ? "block" : "none",
54 left: styleLeft + 'px', top: styleTop + 'px',
55 }}>
56 <div className={style.header}>
57 <div className={style.title} onMouseDown={this.onMouseDown} >{title}</div>
58 <span className={style.close} onClick={onClose}><Icon type="close" /></span>
59 </div>
60 <div className={style.content} style={{ ...bodyStyle }}>
61 {children}
62 </div>
63 <div className={style.footer}>
64 </div>
65 </div>
66
67 }
68 }
69
70 export default PopContainer;

index.less

.popContainer {
position : fixed;
width : 50vw;
height : 80vh;
background-color: white;
z-index : 200;
box-shadow : 0px 4px 12px 0px rgba(0, 0, 0, 0.45);
border-radius : 4px;
resize : both;
overflow : auto;
min-width : 200px;
min-height : 60px; .header {
padding : 16px 24px;
color : rgba(0, 0, 0, 0.65);
border-bottom: 1px solid #e8e8e8;
border-radius: 4px 4px 0 0; .close {
position : absolute;
top : 0;
right : 0;
cursor : pointer;
width : 56px;
height : 56px;
font-size : 16px;
line-height: 56px;
text-align : center;
color : rgba(0, 0, 0, 0.45); &:hover {
color: black;
}
} .title {
cursor : move;
color : rgba(0, 0, 0, 0.85);
font-weight: 500;
font-size : 16px;
line-height: 22px;
}
} .content {
height : calc(100% - 70px);
overflow-y: scroll;
padding : 24px;
} }

引用的文件

 import PopContainer from './PopContainer/index.js'
...
onShow = ()=>{
this.setState({visible:true})
 }
onClose=()=>{
this.setState({visible:false})
}
render(){
<Button onClick={this.onShow}>打开弹窗</Button>
<PopContainer visible={this.state.visible} onClose={this.onClose} title="标题" >
    内容
   <PopContainer />
}

react 可拖拽改变位置和大小的弹窗的更多相关文章

  1. 拖拽改变div的大小

    拖拽改变div的大小 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&qu ...

  2. JavaScript动画-拖拽改变元素大小

    ▓▓▓▓▓▓ 大致介绍 拖拽改变元素大小是在模拟拖拽上增加了一些功能 效果:拖拽改变元素大小 ▓▓▓▓▓▓ 拖拽改变元素大小原理 首先这个方块得知道我们想要改变这个它的大小,所以我给它设定一个范围,当 ...

  3. javascript动画系列第四篇——拖拽改变元素大小

    × 目录 [1]原理简介 [2]范围圈定 [3]大小改变[4]代码优化 前面的话 拖拽可以让元素移动,也可以改变元素大小.本文将详细介绍拖拽改变元素大小的效果实现 原理简介 拖拽让元素移动,是改变定位 ...

  4. jQuery拖拽改变元素大小

    一个非常简单的例子,体验效果:http://keleyi.com/keleyi/phtml/jqtexiao/29.htm 以下是完整代码,保存到HTML文件打开也可以体验效果. <!DOCTY ...

  5. jquery插件之拖拽改变元素大小

    该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧. 此插件旨在实现目前较为流行的拖拽改变元素大小的效果,您可以根据自己的实际需求来设置被 ...

  6. 一个可变布局列表,有9种布局item大小,每个item可拖拽切换位置

    代码地址如下:http://www.demodashi.com/demo/11271.html 一.准备工作 准备一台安卓设备手机,4.4以上版本 本例子实现,一个可变布局列表,有9种布局item大小 ...

  7. Winform拖拽改变无边框窗体大小

    大家在进行Winform开发过程中,很容易就可以完成一个窗口的布局工作,但现在的软件界面美化效果一个比一个好,很多软件都是无边框的,于是乎,你是不是也感叹:winform的带边框的窗体如此丑陋,我一定 ...

  8. jQuery实现类似Chrome控制台可拖拽改变宽度的样式

    最近项目进程紧张,没法再愉快的网上冲浪了 因为项目需要实现一个页面上可拖拽改变div宽度的功能,类似效果如Chrome的右侧调试台样式: 大概思路为: 1.使用mousemove()方法,将鼠标的位置 ...

  9. React 实现拖拽功能

    实现效果:(可戳 https://codepen.io/wenr/pen/EGEQxp 查看) 因为工作中会用到 JIRA 所以想实现一下相似的功能,顺便学习一下 H5 的拖拽.不支持拖拽改变顺序,感 ...

随机推荐

  1. 什么是root帐户?

    root帐户就像一个系统管理员帐户,允许你完全控制系统.你可以在此处创建和维护用户帐户,为每个帐户分配不同的权限.每次安装Linux时都是默认帐户.

  2. SpringBoot DevTools 的用途是什么?

    SpringBoot 开发者工具,或者说 DevTools,是一系列可以让开发过程变得简便的工具.为了引入这些工具,我们只需要在 POM.xml 中添加如下依赖: 1 <dependency&g ...

  3. Integer与int的区别?

    int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Integer是java为int提供的封装类.int的默认值为0,而Integer的默认值为null,即Integer可 ...

  4. Spring如何处理线程并发问题?

    在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLoc ...

  5. ZAB 和 Paxos 算法的联系与区别?

    相同点: 1.两者都存在一个类似于 Leader 进程的角色,由其负责协调多个 Follower 进程的运行 2.Leader 进程都会等待超过半数的 Follower 做出正确的反馈后,才会将一个提 ...

  6. 用TLS/SSL保证EMQ的网络传输安全

    作为基于现代密码学公钥算法的安全协议,TLS/SSL能在计算机通讯网络上保证传输安全,EMQ的MQTT broker支持TLS,也可以用这种方式来确保传输安全. 参考官网:https://www.em ...

  7. 面试问题之C++语言:Overload、Override及Overwirte的区别

    Overload(重载):在C++程序中,可以将语义.功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型.顺序不同),即函数重载. 特点: (1)相同的范围(在同一个类中) (2)函数名 ...

  8. @RequestMapping与@Autowired的作用

    @RequestMapping RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. @Autowired @ ...

  9. 学习Solr(一)

    一.安装 1.需要的安装包:apache-tomcat-7.0.47.tar.gz.solr-4.10.3.tgz.tgz(jdk自行安装) 2.解压tomcat并创建solr文件夹 [root@lo ...

  10. eclipse开发工具之“指定Maven仓库和setting.xml文件位置”

    1.先点击window,然后选择Preferences按钮进入设置 2.找到Maven,选择UserSettings 点击Browse控件,添加setting.xml 点击Reindex控件,添加依赖 ...