当前位置: 首页 > 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;无论是品牌的经销商还是非经…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...

21-Oracle 23 ai-Automatic SQL Plan Management(SPM)

小伙伴们&#xff0c;有没有迁移数据库完毕后或是突然某一天在同一个实例上同样的SQL&#xff0c; 性能不一样了、业务反馈卡顿、业务超时等各种匪夷所思的现状。 于是SPM定位开始&#xff0c;OCM考试中SPM必考。 其他的AWR、ASH、SQLHC、SQLT、SQL profile等换作下一个话题…...