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 的拖拽.不支持拖拽改变顺序,感 ...
随机推荐
- 浅谈systemd原理和应用
多不说,直接上代码(可谓配置): [Unit] Description=demo app After=network-is-online.target [Service] Type=Simple Ex ...
- WebApplicationContext?
WebApplicationContext 继承了ApplicationContext 并增加了一些WEB应用必备的特有功能,它不同于一般的ApplicationContext ,因为它能处理主题, ...
- springmvc对参数接收的两个注解@RequestParam和@RequestBody
@RequestParam 作用:将请求参数绑定到控制器的方法参数上,主要用于接收几班类型参数 语法:@RequestParam(value="参数名",required=&quo ...
- 面试问题之数据结构与算法:B树、B+树、B*树
一.B树 B树是一种多叉平衡查找树,由于是多叉结构,对于元素数量非常多的情况下,树的深度不会像二叉结构那么大,可以保证查询效率. 二.B+树 B+是是B树的一种变形, 1.特点: (1).所有叶子结点 ...
- 分布式集群中为什么会有 Master?
在分布式环境中,有些业务逻辑只需要集群中的某一台机器进行执行,其他的机 器可以共享这个结果,这样可以大大减少重复计算,提高性能,于是就需要进行 leader 选举.
- 转载:STL常用容器的底层数据结构实现
转载至:https://blog.csdn.net/qq_28584889/article/details/88763090 vector :底层数据结构为数组,支持快速随机访问 list:底层数据结 ...
- 阿里云、腾讯云、CentOS下的MySQL的安装与配置详解
一. 安装 查看是否已安装 # 查看MySQL版本 mysql --version # 查看MySQL相关文件 whereis mysql 若已安装,卸载方法如下 # 卸载MySQL yum remo ...
- Kurento安装与入门02——运行示例前的准备
官方一共提供了13个示例,这些示例运行的方式大同小异,一般会提供JAVA.Browser JavaScript.Node.js三种版本,这里仅演示java版本的示例.这些示例要求系统内已经正确安装了K ...
- webpack系列——webpack3导入jQuery的新方案
本文的目的 拒绝全局导入jQuery!! 拒绝script导入jQuery!! 找到一种只在当前js组件中引入jQuery,并且使用webpack切割打包的方案! 测试环境 以下测试在webpack3 ...
- idea怎么创建python项目
前言 python是一种功能强大和适用面很广的开发语言,在大数据应用和机器学习日益流行的年代,python凭借其简洁.易用和可扩展性获得很多用户的支持,近年来使用率高速增长.python环境下,集成了 ...