react 可拖拽改变位置和大小的弹窗
一 目标
最近,项目上需要一个可以弹出一个可以移动位置和改变大小的窗口,来显示一下对当前页面的一个辅助内容
二 思路
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 可拖拽改变位置和大小的弹窗的更多相关文章
- 拖拽改变div的大小
拖拽改变div的大小 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&qu ...
- JavaScript动画-拖拽改变元素大小
▓▓▓▓▓▓ 大致介绍 拖拽改变元素大小是在模拟拖拽上增加了一些功能 效果:拖拽改变元素大小 ▓▓▓▓▓▓ 拖拽改变元素大小原理 首先这个方块得知道我们想要改变这个它的大小,所以我给它设定一个范围,当 ...
- javascript动画系列第四篇——拖拽改变元素大小
× 目录 [1]原理简介 [2]范围圈定 [3]大小改变[4]代码优化 前面的话 拖拽可以让元素移动,也可以改变元素大小.本文将详细介绍拖拽改变元素大小的效果实现 原理简介 拖拽让元素移动,是改变定位 ...
- jQuery拖拽改变元素大小
一个非常简单的例子,体验效果:http://keleyi.com/keleyi/phtml/jqtexiao/29.htm 以下是完整代码,保存到HTML文件打开也可以体验效果. <!DOCTY ...
- jquery插件之拖拽改变元素大小
该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧. 此插件旨在实现目前较为流行的拖拽改变元素大小的效果,您可以根据自己的实际需求来设置被 ...
- 一个可变布局列表,有9种布局item大小,每个item可拖拽切换位置
代码地址如下:http://www.demodashi.com/demo/11271.html 一.准备工作 准备一台安卓设备手机,4.4以上版本 本例子实现,一个可变布局列表,有9种布局item大小 ...
- Winform拖拽改变无边框窗体大小
大家在进行Winform开发过程中,很容易就可以完成一个窗口的布局工作,但现在的软件界面美化效果一个比一个好,很多软件都是无边框的,于是乎,你是不是也感叹:winform的带边框的窗体如此丑陋,我一定 ...
- jQuery实现类似Chrome控制台可拖拽改变宽度的样式
最近项目进程紧张,没法再愉快的网上冲浪了 因为项目需要实现一个页面上可拖拽改变div宽度的功能,类似效果如Chrome的右侧调试台样式: 大概思路为: 1.使用mousemove()方法,将鼠标的位置 ...
- React 实现拖拽功能
实现效果:(可戳 https://codepen.io/wenr/pen/EGEQxp 查看) 因为工作中会用到 JIRA 所以想实现一下相似的功能,顺便学习一下 H5 的拖拽.不支持拖拽改变顺序,感 ...
随机推荐
- XML约束DTD
<元素1> <元素2> <元素3>描述1</元素3> <元素4>描述2</元素4> </元素2> </元素1& ...
- 【Java面试宝典】什么情况下会发生栈内存溢出?
如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常. 如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常.
- 手撕代码之线程:thread类简单使用
转载于:https://blog.csdn.net/qq_22494029/article/details/79273127 简单多线程例子: detch()启动线程: 1 #include < ...
- 用 Java 写一个线程安全的单例模式(Singleton)?
请参考答案中的示例代码,这里面一步一步教你创建一个线程安全的 Java 单例类.当我们说线程安全时,意思是即使初始化是在多线程环境中,仍然能保证单个实例.Java 中,使用枚举作为单例类是最简单的方式 ...
- SPI简单解析
什么是SPI 一种服务加载方式,全名为Service Provider Interface,Service提供者接口 如果我们要抽象里面的模块,在面对对象编程当中,我们模块之间,一般推荐模块之间基于 ...
- Java Lambda详解
Lambda表达式是JDK 8开始后的一种新语法形式. 作用:简化匿名内部类的代码写法 简化格式 (匿名内部类被重写方法的形参列表) -> { 重写方法 } Lambda表达式只能简化函数式接口 ...
- char的越界赋值即其原理剖析
思考: int ch = 'A'; int ch1 = 65; int ch2 = 321; printf("%c %c %c\n", ch, ch1, ch2);的输出结果是什么 ...
- 无需Flash实现图片裁剪——HTML5中级进阶
前言 图片裁剪上传,不仅是一个很贴合用户体验的功能,还能够统一特定图片尺寸,优化网站排版,一箭双雕. 需求就是那么简单,在浏览器里裁剪图片并上传到服务器. 我第一个想到的方法就是,将图片和裁剪参数(x ...
- js 中的submit 回调函数
1.submit.php <?php $arr = $_POST; $arr['msg']=1; //echo $_POST['uname']; echo json_encode($arr); ...
- canvas 1px 出现模糊解决方法及原理
关于canvas绘制1像素出现模糊的原因及解决方法 canvas是html5中非常强大的功能,但是在绘制的时候如果出现1像素,例如画一条1像素的线可能出现模糊情况. 一.解决方法 网上比较常见的解决方 ...