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 的拖拽.不支持拖拽改变顺序,感 ...
随机推荐
- Hadoop-全分布式配置
目录 一.配置基础环境 1.配置网络信息 2.配置主机名 3.主机名与IP的映射关系 4.测试互通性 二.关闭防火墙和SELinux 1.关闭防火墙 2.关闭SELinux 三.安装 Hadoop 1 ...
- LCS&&LRC&&LIS问题
注:最近笔试题经常碰到DP动态规划的问题,但是由于本人没有接触过DP,笔试后看到别人家的答案简洁又漂亮,真的羡慕:难的DP自己可能不会,那再见到常见的LCS和LRS以及LIS为问题总该会吧: 资料参考 ...
- 什么是Spring的内部bean?
当一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean,为了定义inner bean,在Spring 的 基于XML的 配置元数据中,可以在 <property/>或 ...
- 解释Spring支持的几种bean的作用域?
Spring框架支持以下五种bean的作用域: singleton :bean在每个Spring ioc 容器中只有一个实例. prototype:一个bean的定义可以有多个实例. request: ...
- Redis 集群,集群的原理是什么?
1).Redis Sentinal 着眼于高可用,在 master 宕机时会自动将 slave 提升为master,继续提供服务. 2).Redis Cluster 着眼于扩展性,在单个 redis ...
- Java 中 LinkedHashMap 和 PriorityQueue 的区别是 什么?
PriorityQueue 保证最高或者最低优先级的的元素总是在队列头部,但是 LinkedHashMap 维持的顺序是元素插入的顺序.当遍历一个 PriorityQueue 时,没有任何顺序保证,但 ...
- 学习Walle(一)
一.概述 Walle 一个web部署系统工具,配置简单.功能完善.界面流畅.开箱即用!支持git.svn版本管理,支持各种web代码发布,PHP,Python,JAVA等代码的发布.回滚,可以通过we ...
- Lambda8 表达式
Lambda 表达式 Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构. JDK 也提 ...
- canvas —— globalCompositeOperation
globalCompositeOperation 属性设置或返回如何将一个源(新的)图像绘制到目标(已有)的图像上. 源图像 = 您打算放置到画布上的绘图. 目标图像 = 您已经放置在画布上的绘图. ...
- 微信小程序安全浅析
引言 近期微信小程序重磅发布,在互联网界掀起不小的波澜,已有许多公司发布了自己的小程序,涉及不同的行业领域.大家在体验小程序用完即走便利的同时,是否对小程序的安全性还存有疑虑.白泽日前对微信小程序进行 ...