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 的拖拽.不支持拖拽改变顺序,感 ...
随机推荐
- 什么是Java序列化,如何实现Java序列化?或者请解释Serializable接口的作用?
象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象,对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久保存在磁盘上,通过网络将这种二进制流传输到另 ...
- 如果你的Serializable类包含一个不可序列化的成员,会发生什么?你是如何解决的?
任何序列化该类的尝试都会因NotSerializableException而失败,但这可以通过在 Java中 为 static 设置瞬态(trancient)变量来轻松解决. Java 序列化相关的常 ...
- spring-注解驱动模式
spring web装配原理: /** * WebApplicationInitializer Spring MVC 提供接口. * * Spring中的web自动配置,也是可以, */ /** * ...
- URL转义特定字符
import java.net.URLDecoder; import java.net.URLEncoder; import java.nio.charset.Charset; // 实例代码 Str ...
- Kafka 新旧消费者的区别?
旧的 Kafka 消费者 API 主要包括:SimpleConsumer(简单消费者) 和 ZookeeperConsumerConnectir(高级消费者).SimpleConsumer 名字看起来 ...
- 哪些浏览器支持HTML 5?
几乎所有的浏览器都支持HTML 5,例如Safari,Chrome,火狐,Opera,IE等.
- 学习ansible(一)
1.介绍 1 ansible基于Python开发的自动化运维工具 2 ansible基于ssh协议实现远程管理的工具,没有客户端 3 ansible软件可以实现多种批量管理操作 2.环境 主机 IP ...
- python学习笔记(八)——文件操作
在 windows 系统下,我们通过 路径+文件名+扩展名的方式唯一标识一个文件,而在 Linux 系统下通过 路径+文件名唯一标识一个文件. 文件分类:文件主要可以分为文本文件和二进制文件,常见的如 ...
- WordPress 网站开发“微信小程序“实战(三)
本文是"WordPress 开发微信小程序"系列的第三篇,本文记录的是开发"DeveWork+"小程序1.2 版本的过程.建议先看完第一篇.第二篇再来阅读本文. ...
- ES6-11学习笔记--对象的扩展
属性简洁表示法 属性名表达式 Objec.is() 扩展运算符 与 Object.assign() in 对象的遍历方式 属性简洁表示法: 如果属性key跟变量名一样,可简写 let name = ...