当前位置: 首页 > news >正文

react实现窗口悬浮框,可拖拽、折叠、滚动

1、效果如下

2、如下两个文件不需要修改

drag.js

import React from "react";
import PropTypes from "prop-types";export default class DragM extends React.Component {static propTypes = {children: PropTypes.element.isRequired};static defaultProps = {//默认是移动children dom,覆盖该方法,可以把tranform行为同步给外部updateTransform: (transformStr, tx, ty, tdom) => {tdom.style.transform = transformStr;}};position = {startX: 0,startY: 0,dx: 0,dy: 0,tx: 0,ty: 0};start = event => {if (event.button != 0) {//只允许左键,右键问题在于不选择conextmenu就不会触发mouseup事件return;}document.addEventListener("mousemove", this.docMove);this.position.startX = event.pageX - this.position.dx;this.position.startY = event.pageY - this.position.dy;};docMove = event => {const tx = event.pageX - this.position.startX;const ty = event.pageY - this.position.startY;const transformStr = `translate(${tx}px,${ty}px)`;this.props.updateTransform(transformStr, tx, ty, this.tdom);this.position.dx = tx;this.position.dy = ty;};docMouseUp = event => {document.removeEventListener("mousemove", this.docMove);};componentDidMount() {this.tdom.addEventListener("mousedown", this.start);//用document移除对mousemove事件的监听document.addEventListener("mouseup", this.docMouseUp);}componentWillUnmount() {this.tdom.removeEventListener("mousedown", this.start);document.removeEventListener("mouseup", this.docMouseUp);document.removeEventListener("mousemove", this.docMove);}render() {const {children} = this.props;const newStyle = {...children.props.style,cursor: "move",userSelect: "none"};return React.cloneElement(React.Children.only(children), {ref: tdom => {return (this.tdom = tdom);},style: newStyle});}
}

index.js

import React from "react";
import PropTypes from "prop-types";
import DragM from "./drag";
import {Modal} from "antd";class BuildTitle extends React.Component {updateTransform = transformStr => {this.modalDom.style.transform = transformStr;};componentDidMount() {const modalList = document.getElementsByClassName("ant-modal"); //modal的class是ant-modalthis.modalDom = modalList[modalList.length - 1];}render() {const {title} = this.props;return (<DragM updateTransform={this.updateTransform}><div>{title}</div></DragM>);}
}export default class DragModal extends React.Component {static propTypes = {drag: PropTypes.bool,destroyOnClose: PropTypes.bool};static defaultProps = {drag: true,destroyOnClose: true};render() {const {drag,visible,title,destroyOnClose,children,...restProps} = this.props;//是否可拖拽const _title =title && drag ? (<BuildTitle visible={visible} title={title}/>) : (title);return (<Modalvisible={visible}title={_title}destroyOnClose={destroyOnClose}{...restProps}>{children}</Modal>);}
}

3、如下两个文件,自己适当修改接口数据来源即可

index.js

import React from "react";
import styles from "./index.less";
import {Badge, Icon, Tabs} from "antd";
import DragModal from "../DragModal";
import classNames from 'classnames';
import NHFetch from "../../../../utils/NHFetch";const TabPane = Tabs.TabPane;export default class ModalContent extends React.Component {constructor(props) {super(props);this.state = {data: undefined,open: true};}componentDidMount() {this.getMessage();}componentDidUpdate(prevProps) {// 当props.params变化时获取新数据if (this.props.params !== prevProps.params) {console.log('----------------------------------------')this.getMessage();}}getMessage = () => {let xsid = this.props.paramsif (xsid) {NHFetch('api/zhxg-yxwz/shxd/getZzbdInfoList', 'get', {xsid: xsid}).then((res) => {if (res && res.code === 200) {this.setState({data: res.data});}})}}// 切换状态onChangeOpen = () => {this.setState({open: !this.state.open});};render() {const {data, open} = this.state;const {studentName} = this.propsreturn (<DragModalclassName={classNames({[styles.modalClese]: !open})}wrapClassName={styles.dragWrap}closable={false}width={300}title={<div>{studentName + ":"}自助报道办理情况<divclassName={styles.modalBtn}onClick={this.onChangeOpen}>{open ? <Icon type="down"/> : <Icon type="up"/>}</div></div>}mask={false}visible={this.props.params}footer={false}><div className={styles.modalContent}>{data && data.map((item, i) => {return (<div key={i} className={styles.modalListHeader}><Badge status={item.BLZT === '1' ? "success" : "processing"}/>{item.HJMC + "  "}<span style={item.BLZT === '1' ? {color: "green"} : {color: 'red'}}>{item.BLZT === '1' ? '已办理' : "未办理"}</span></div>);})}</div></DragModal>);}
}

css文件,index.less

.box {background-color: #fff;.danger {color: #f5222d}.primary {color: #1990ff}
}/* 页签 */
.tabs {:global {.ant-tabs-bar {margin-bottom: 0;}.ant-tabs-tab {margin-right: 0;}.ant-badge {margin-left: 4px;margin-top: -4px;}.ant-badge-count {height: 16px;line-height: 16px;}.ant-badge-multiple-words {padding: 0 4px;}}.tabsExtra {:global {.ant-input {width: 270px;}.ant-btn {width: 80px;margin-left: 10px;}.ant-select-selection {border: none;box-shadow: none;}}}
}/* 菜单 */
.menuLayout {&:global(.ant-layout) {background: #fff;}:global {.ant-layout-sider {box-shadow: 2px 0 4px 0 rgba(217, 217, 217, 0.5);}.ant-layout-content {padding: 10px;}}
}.menu {padding: 10px 0;:global {.ant-menu-item {width: 100%;margin-top: 0;margin-bottom: 0 !important;&:after {right: inherit;left: 0;}}}
}/* 表格 */
.tableTop {overflow: hidden;.tableTopLeft {float: left;button {margin-right: 10px;}}.tableTopRight {float: right;}
}.table {margin-top: 10px;.audit {position: absolute;left: -70px;top: 50%;width: 80px;height: 56px;margin-top: -28px;pointer-events: none}:global {.ant-table-thead {position: relative;height: 50px;&:after {content: "";display: block;position: absolute;left: 0;right: 0;top: 42px;background-color: #fff;height: 10px;}tr {background: rgba(25, 144, 255, 0.2);&:first-child > th:first-child {border-top-left-radius: 0;}&:first-child > th:last-child {border-top-right-radius: 0;}}th {padding: 10px;height: 50px;padding-bottom: 20px;white-space: nowrap;}}.ant-table-tbody {border-left: 1px solid #e8e8e8;border-right: 1px solid #e8e8e8;tr:first-child td {border-top: 1px solid #e8e8e8;}tr > td {position: relative;&:after {content: "";position: absolute;right: 0;top: 16px;bottom: 16px;border-right: 1px solid #e8e8e8;}&:last-child,&:first-child {&:after {display: none;}}}}}
}.tablePage {overflow: hidden;margin-top: 10px;padding: 0 10px;.tablePageLeft {float: left;color: #999;line-height: 32px;}.tablePageRight {float: right;}
}/* 弹窗 */
.dragWrap {overflow: hidden;pointer-events: none;.modalBtn {position: absolute;top: 0;right: 0;height: 50px;width: 50px;text-align: center;line-height: 50px;cursor: pointer;user-select: none;}.modalClese {:global {.ant-modal-body {height: 0;}}}.modalContent {width: 300px;padding: 0 20px 10px 20px;}.modalListHeader {padding: 10px;}.modalListItem {position: relative;padding: 5px 30px 5px 23px;background-color: rgba(25, 144, 255, 0.05);border-radius: 8px;margin-bottom: 6px;}.modalItemBadge {position: absolute;left: 10px;top: 5px;}.itemInfo {font-size: 12px;color: #999;span {color: #1990ff;}}.modalItemIcon {position: absolute;right: 10px;top: 50%;margin-top: -15px;color: #1990ff;font-size: 20px;}:global {.ant-modal {position: absolute;top: auto;bottom: 0;right: 0;margin: 0;padding-bottom: 0;pointer-events: auto;}.ant-modal-header {padding: 14px 10px;background-color: #1990ff;.ant-modal-title {padding-right: 50px;color: #fff;font-size: 14px;}}.ant-modal-content {overflow: hidden;}.ant-modal-close {color: #fff;}.ant-modal-close-x {height: 50px;line-height: 50px;}.ant-modal-body {max-height: 350px;padding: 0;overflow: hidden;overflow-y: scroll;margin-right: -20px;transition: all 0.3s;}}
}

4、最后适当位置使用组件即可

相关文章:

react实现窗口悬浮框,可拖拽、折叠、滚动

1、效果如下 2、如下两个文件不需要修改 drag.js import React from "react"; import PropTypes from "prop-types";export default class DragM extends React.Component {static propTypes {children: PropTypes.element.isRequired};static defaultP…...

52【场景作图】空间感

参考 场景绘制&#xff0c;画面空间感如何拉开&#xff1f;分分钟就能学会的场景优化思路更新啦&#xff01;_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1pa411J7Ps/?spm_id_from333.337.search-card.all.click&vd_source20db0c4e2d303527ed13c4b9cdf698ec 1 …...

SpringBoot系列之搭建WebSocket应用

SpringBoot系列之ServerEndpoint方式开发WebSocket应用。在实时的数据推送方面&#xff0c;经常会使用WebSocket或者MQTT来实现&#xff0c;WebSocket是一种不错的方案&#xff0c;只需要建立连接&#xff0c;服务端和客户端就可以进行双向的数据通信。很多网站的客户聊天&…...

RK3568技术笔记十四 Ubuntu创建共享文件夹

单击“虚拟机”&#xff0c;单击“设置”&#xff0c;如图所示&#xff1a; 单击“选项”&#xff0c;选择“总是启用&#xff08;E&#xff09;”&#xff0c;单击“添加”&#xff0c;如图所示&#xff1a; 单击“下一步”&#xff0c;如图所示&#xff1a; 单击“浏览”添加…...

JavaScript 获取地理位置 Geolocation

在现代的 web 应用程序中&#xff0c;获取用户的地理位置信息是一项常见的需求。这可以用于提供个性化内容、本地化服务或者基于位置的功能。HTML5 引入了 Geolocation API&#xff0c;使得从浏览器中获取地理位置信息变得非常简单。 1. Geolocation API 简介 Geolocation AP…...

android串口助手apk下载 源码 演示 支持android 4-14及以上

android串口助手apk下载 1、自动获取串口列表 2、打开串口就开始接收 3、收发 字符或16进制 4、默认发送at\r\n 5、android串口助手apk 支持android 4-14 &#xff08;Google seral port 太老&#xff09; 源码找我 需要 用adb root 再setenforce 0进入SELinux 模式 才有权限…...

windows11 生产力工具配置

一、系统安装 官方windows11.iso镜像文件安装操作系统时&#xff0c;会强制要求联网验证&#xff0c;否则无法继续安装操作系统&#xff0c;跳过联网登录账号的方式为&#xff1a;按下【shiftF10】快捷键&#xff0c;调出cmd命令窗口&#xff0c;输入命令 OOBE\BYPASSNRO 等…...

Nacos配置中心不可用会有什么影响

服务端&#xff1a; Nacos的数据存储接口 com.alibaba.nacos.config.server.service.DataSourceService 有两种实现&#xff1a; 如果指定了mysq 作为数据库&#xff0c;则必须使用 mysql 如果是 集群方式部署Nacos&#xff0c;则必须使用mysql 如果是单例方式部署 并且 没…...

AI时代下的自动化代码审计工具

代码审计工具分享 吉祥学安全知识星球&#x1f517;除了包含技术干货&#xff1a;Java代码审计、web安全、应急响应等&#xff0c;还包含了安全中常见的售前护网案例、售前方案、ppt等&#xff0c;同时也有面向学生的网络安全面试、护网面试等。 这两年一直都在提“安全左移”&…...

不懂索引,简历上都不敢写自己熟悉SQL优化

大家好&#xff0c;我是考哥。 今天给大家带来MySQL索引相关核心知识。对MySQL索引的理解甚至比你掌握SQL优化还重要&#xff0c;索引是优化SQL的前提和基础&#xff0c;我们一步步来先打好地基。 当MySQL表数据量不大时&#xff0c;缺少索引对查询性能的影响不会太大&#x…...

C# 设置PDF表单不可编辑、或提取PDF表单数据

PDF表单是PDF中的可编辑区域&#xff0c;允许用户填写指定信息。当表单填写完成后&#xff0c;有时候我们可能需要将其设置为不可编辑&#xff0c;以保护表单内容的完整性和可靠性。或者需要从PDF表单中提取数据以便后续处理或分析。 之前文章详细介绍过如何使用免费Spire.PDF…...

面试篇-求两个有序数组的交集

题目 两个有序数组&#xff0c;第一个有序数组m是1000w个元素&#xff0c;第二个有序数组n是1000个元素&#xff0c;求交集&#xff0c;需要考虑时间复杂度和空间复杂度。 解题思路 解法1&#xff1a;遍历小数组n&#xff0c;在m数组中进行折半查找&#xff0c;根据数组有序…...

Web爬虫-edu_SRC-目标列表爬取

免责声明:本文仅做技术交流与学习... 爬取后,结合暗黑搜索引擎等等进行进一步搜索. edu_src.py import requests, time from bs4 import BeautifulSoup for i in range(1, 20):url fhttps://src.sjtu.edu.cn/rank/firm/0/?page{i}print(f"正在获取第{i}页数据")s …...

云原生周刊:Harbor v2.11 版本发布 | 2024.6.17

开源项目推荐 Descheduler Descheduler 是一个工具&#xff0c;可用于优化 Kubernetes 集群中 Pod 的部署位置。它可以找到可以移动的 Pod&#xff0c;并将其驱逐&#xff0c;让默认调度器将它们重新调度到更合适的节点上。 Prowler Prowler 是一款适用于 AWS、Azure、GCP …...

低版本火狐浏览器报错:class is a reserved identifier

低版本火狐浏览器报错&#xff1a;class is a reserved identifier 原因&#xff1a;react-dnd&#xff0c;dnd-core 等node包的相关依赖有过更新&#xff0c;使得在低版本火狐浏览器中不支持 class 解决方法&#xff1a;在使用webpack打包构建时&#xff0c;编译排除node_modu…...

掌握高等数学、线性代数、概率论所需数学知识及标题建议

在数学的广袤领域中&#xff0c;高等数学、线性代数和概率论作为三大核心分支&#xff0c;不仅在理论研究中占据重要地位&#xff0c;更在实际应用中发挥着举足轻重的作用。为了深入理解和掌握这三门学科&#xff0c;我们需要掌握一系列扎实的数学知识。 高等数学所需数学知识 …...

value_and_grad

value_and_grad 是 JAX 提供的一个便捷函数&#xff0c;它同时计算函数的值和其梯度。这在优化过程中非常有用&#xff0c;因为在一次函数调用中可以同时获得损失值和相应的梯度。 以下是对 value_and_grad(loss, argnums0, has_auxFalse)(params, data, u, tol) 的详细解释&a…...

AI 已经在污染互联网了。。赛博喂屎成为现实

大家好&#xff0c;我是程序员鱼皮。这两年 AI 发展势头迅猛&#xff0c;更好的性能、更低的成本、更优的效果&#xff0c;让 AI 这一曾经高高在上的技术也走入大众的视野&#xff0c;能够被我们大多数普通人轻松使用&#xff0c;无需理解复杂的技术和原理。 其中&#xff0c;…...

Linux系统安装ODBC驱动,统信服务器E版安装psqlodbc方法

应用场景 硬件/整机信息&#xff1a;AMD平台 OS版本信息&#xff1a;服务器e版 软件信息&#xff1a;psqlodbc 12.02版本 功能介绍 部分用户在使用etl工具连接数据库时&#xff0c;需要使用到odbc驱动&#xff0c;下面介绍下服务器e版系统中编译安装此工具的相关过程。 E…...

品牌对电商平台价格的监测流程

在当今的电商时代&#xff0c;品牌商会重点关注众多电商平台&#xff0c;如淘宝、天猫、京东、拼多多、苏宁、小红书、抖音、快手等。之所以这些平台备受瞩目&#xff0c;很大程度上是因为其上的店铺数量众多&#xff0c;情况复杂。如今&#xff0c;无论是品牌的经销商还是非经…...

osgearth提示“simple.earth: file not handled”

在用vcpkg编译完osg和osgearth后&#xff0c;为了验证osgearth编译是否正确&#xff0c;进行测试&#xff0c;模型加载代码如下&#xff1a; root->addChild(osgDB::readNodeFile("simple.earth")); 此时以为是simple.earth路径的问题&#xff0c;遂改为以下代码…...

hbuilderx如何打包ios app,如何生成证书

hbuilderx可以打包ios app, 但是打包的时候&#xff0c;却需要两个证书文件&#xff0c;我们又如何生成这两个证书文件呢&#xff1f; 点击hbuilderx的官网链接&#xff0c;教程是需要使用mac电脑苹果开发者账号去创建这两个文件&#xff0c;可是问题来了&#xff0c;我们没有…...

扩散模型荣获CVPR2024最佳论文奖,最新成果让评估和改进生成模型更加效率!

CVPR 2024最佳论文奖新鲜出炉 其中一篇是Rich Human Feedback for Text-to-Image Generation&#xff0c;受大模型中的RLHF技术启发&#xff0c;团队用人类反馈来改进Stable Diffusion等文生图模型。 作者提出了收集丰富的细粒度人类反馈信息&#xff0c;用于更好地评估和改进…...

通过CSS样式来禁用href

<style>.disabled-link {pointer-events: none;cursor: default;text-decoration: none;color: inherit; }</style><a href"https://www.example.com" class"disabled-link">禁用链接</a> 在上述CSS样式中&#xff0c; pointer-…...

汽车传动系统为汽车动力总成重要组成部分 我国市场参与者数量不断增长

汽车传动系统为汽车动力总成重要组成部分 我国市场参与者数量不断增长 汽车系统主要包括动力系统、制动系统、传动系统、转向系统、行驶系统、燃油供给系统、照明系统以及电器系统。汽车传动系统指能够将发动机产生的动力转化为车辆行驶驱动力的动力传递装置。汽车传动系统为汽…...

智慧校园软件解决方案:提升学校管理效率的最佳选择

在当今教育领域&#xff0c;智慧校园信息化方案正逐渐成为提升学校管理水平与教学品质的关键途径。这一方案融合了最新科技&#xff0c;通过数字化、网络化及智能化方式&#xff0c;全面革新教育资源分配与教育互动模式&#xff0c;旨在为学校带来以下核心价值与优势 1. 综合信…...

数据结构之B数

目录 1.概述 2.特点 3.诞生 4.优缺点 4.1.优点 4.2.缺点 5.应用场景 6.C语言中的B树实现例子 7.总结 1.概述 B树&#xff08;B-tree&#xff09;是一种自平衡的树数据结构&#xff0c;广泛应用于数据库和文件系统中&#xff0c;以便高效地进行顺序读取、写入以及查找…...

计算机基础必须知道的76个常识!沈阳计算机软件培训

01 信息技术是指人们获取、存储、传递、处理、开发和利用信息资源的相关技术。 02 1、计算机的特点&#xff1a; &#xff08;1&#xff09;运算速度快 &#xff08;2&#xff09;存储容量大 &#xff08;3&#xff09;通用性强 &#xff08;4&#xff09;工作自动化 &…...

7,KQM模块的驱动

1&#xff0c;查资料&#xff0c;查模块的通信接口&#xff08;单片机和模块之间采用什么方式通信&#xff09;硬件接口&#xff0c;驱动方式(串口驱动用串口发送接收PC10&#xff0c;PC11) 只用了三个脚&#xff1a;VCC &#xff27;&#xff2e;&#xff24; &#xff34;&…...

软件验收测试报告模版分享,如何获取专业的验收测试报告?

软件验收测试报告是对软件开发过程中的最后一步确认&#xff0c;通过对软件进行全面、系统的检查和测试&#xff0c;形成一份详细的报告&#xff0c;以评估软件是否满足用户需求和设计要求。验收测试报告起到了非常重要的作用&#xff0c;不仅可以帮助开发者了解软件开发的质量…...

学做网站的步骤/产品seo怎么优化

Swift一出来就比较受人欢迎&#xff0c;但是还是有很多的第三方库是不支持Swift的&#xff0c;个人也感觉Swift还有很长的路要走。 而且最近连Swift的创始人都离开苹果公司了。。。。。。。。。 加入Swift用到了第三方的东西那怎么办呢&#xff0c;其实很简单&#xff0c;Xcode…...

怎么使用免费的wordpress/为什么打开网址都是站长工具

在Centos中yum安装和卸载软件的使用方法安装方法安装一个软件时yum -y install httpd安装多个相类似的软件时yum -y install httpd*安装多个非类似软件时yum -y install httpd php php-gd mysql 卸载一个软件时yum -y remove httpd卸载多个相类似的软件时yum -y remove httpd*卸…...

wordpress crawling/app推广接单渠道

https://en.wikipedia.org/wiki/KubernetesMinikube runs a single-node Kubernetes cluster,可以用于单机上体会k8s的用法,参考了不少文档,包括官方的和阿里云的文档. 可以说缺点都挺多,一是没有不用VM 的示例,二是很多前提条件没有列出.所以我摸索了好久才完成这个实验.目标架…...

php做自己的网站/优化设计全部答案

在iOS开发中UITableView可以说是使用最广泛的控件&#xff0c;我们平时使用的软件中到处都可以看到它的影子&#xff0c;基本大部分应用都有UITableView。当然它的广泛使用自然离不开它强大的功能&#xff0c;今天就针对UITableView重点展开讨论。 1.UITableView有两种风格&…...

股票分析网站可以做推广吗/宣传渠道和宣传方式有哪些

个人杂谈 到了新的公司上了四天的班&#xff0c;总体来说感觉良好&#xff0c;心情也很舒畅&#xff0c;就是每天早上上班很麻烦&#xff0c;公交车也不是很多&#xff0c;老堵车&#xff0c;西安的交通一向都是这个样子&#xff0c;人多&#xff0c;车少&#xff0c;交通混乱&…...

wordpress主题知乎/站内seo是什么意思

文章目录示例工具版本项目结构pom.xml使用 ServletRegistrationBean 将 Servlets 注册为 Spring Bean使用 ServletComponentScan 对 Servlet 进行扫描测试应用程序1. 使用 Maven 命令2. 使用 Eclipse3. 使用可执行的 JAR参考文献源码下载本页将介绍Spring Boot的Servlet映射实例…...