React 模态框的拉伸和拖动

简介: React 模态框的拉伸和拖动

拖动使用 react-draggable 插件

App.js

import { NodeExpandOutlined } from '@ant-design/icons';
import React, { useRef, useState } from 'react'; // 引入useState和useRef
import Draggable from 'react-draggable';
export default function Problem() {
  const [width, setWidth] = useState(400);
  const [height, setHeight] = useState(450);
  // 使用useRef保存调整大小时的宽度和高度
  const resizeRef = useRef({
    isResizing: false,
    newWidth: null,
    newHeight: null
  })
  const [tuod, setTuod] = useState(true)
  const handleResizeMouseDown = (resizeType, e) => {
    let x = e.pageX
    let y = e.pageY
    console.log(x, y);
    const parent = document.querySelector('.box_'); // 获取父级元素
    const parentRect = parent.getBoundingClientRect(); // 获取父级元素的位置信息
    const bleft = parentRect.left; // 获取父级元素相对于屏幕右边的坐标
    const btop = parentRect.top; // 获取父级元素的宽度
    const resizeFunction = resizeType === 'right'
      ? e => {
        if (x > e.pageX) {
          console.log('小');
          resizeRef.current.newWidth = e.pageX - e.target.getBoundingClientRect().left;
          resizeRef.current.isResizing = true;
        } else {
          console.log('大');
          resizeRef.current.newWidth = e.pageX - e.target.getBoundingClientRect().left - bleft;
          resizeRef.current.isResizing = true;
        }
      }
      : e => {
        if (y > e.pageY) {
          console.log('小');
          resizeRef.current.newHeight = e.pageY - e.target.getBoundingClientRect().top + 50;
          resizeRef.current.isResizing = true;
        } else {
          console.log('大');
          resizeRef.current.newHeight = e.pageY - e.target.getBoundingClientRect().top - btop + 50;
          resizeRef.current.isResizing = true;
        }
      };
    setTuod(false)
    const updateFunction = resizeType === 'right' ? setWidth : setHeight;
    const handleMouseUp = () => {
      setTuod(true)
      document.removeEventListener('mousemove', resizeFunction); //删除监听事件
      document.removeEventListener('mouseup', handleMouseUp);
      if (resizeRef.current.isResizing) { //当它修改成功后
        updateFunction(resizeType === 'right' ? resizeRef.current.newWidth : resizeRef.current.newHeight);
        resizeRef.current.isResizing = false;
      }
    };
    document.addEventListener('mousemove', resizeFunction);
    document.addEventListener('mouseup', handleMouseUp);
  };
  const [tdwidth, setTeidth] = useState(25);
  const [istou, setIstou] = useState(false)
  const tuoing = () => {
    setIstou(true)
  }
  const tuoed = () => {
    setIstou(false)
  }
  const [isshow, setIshow] = useState(true)
  return (
    <div className='problem' >
      <div style={{
        opacity: !isshow ? 0.5 : 1, pointerEvents:
          !isshow ? "none" : ""
      }}>
        <div>
          <h2 onClick={() => setIshow(!isshow)}>点击</h2>
        </div>
        <div>
          <p>www</p>
          <p>www</p>
          <p>www</p>
          <p>www</p>
        </div>
      </div>
      <Draggable axis="both" handle=".handle" defaultPosition={{ x: 0, y: 0 }} bounds=".problem" onDrag={tuoing} onStop={tuoed}>
        <div
          className="box_" style={{ display: isshow ? "none" : "", opacity: istou ? 0.8 : 1, backgroundColor: "white", position: "fixed", left: "200px", top: "100px", width: `${width}px`, height: `${height}px`, boxShadow: '0 0 5px 0px grey', userSelect: 'none' }}>
          <div className="handle">
            <span>用户模块管理</span>
            <span style={{ display: 'inline-block', float: "right", marginRight: "5px", fontSize: "20px" }} onClick={() => setIshow(true)}>x</span>
          </div>
          <div
            className='resize' style={{ position: 'absolute', top: 0, right: -1, width: '2px', height: '100%', cursor: 'e-resize' }}
            onMouseDown={(e) => handleResizeMouseDown('right', e)} />
          <div
            className='resizeBottom' style={{ position: 'absolute', bottom: 0, right: -1, width: '100%', height: '2px', cursor: 'n-resize' }}
            onMouseDown={(e) => handleResizeMouseDown('bottom', e)} />
          <div className='neirong'>
            <div style={{
              opacity: !tuod ? 0.3 : 1,
              display: istou ? "none" : ""
            }}>
              <h2>内容</h2>
            </div>
          </div>
        </div>
      </Draggable>
    </div>
  );
}

App.css

.content_home{
    height: 617px;
    width: 375px;
}
.footer{
    position: fixed;
    bottom: 0px;
    height: 50px;
    width: 375px;
}
.top{
    position: fixed;
    top: 0px;
    height: 50px;
    width: 375px;
}
.content {
    position: fixed;
    top: 50px;
    height: 567px;
    width: 375px;
    overflow-y: auto;
}
.content::-webkit-scrollbar {
    display: none;
}
.problem{
    position: fixed;
    top: 50px;
    height: 567px;
    width: 100vw;
    overflow-y: auto;
}
.handle{
    background-color: #6c95db;
    color: white;
    height: 35px;
    line-height: 35px;
    text-indent: 1em;
    cursor: move;
}
相关文章
|
1月前
|
前端开发 UED
React 模态框 Modal 组件详解
【10月更文挑战第27天】本文介绍了如何在 React 中实现一个功能完善的模态框组件。从基础概念入手,逐步讲解了简单的模态框实现、CSS 样式、传递子组件、键盘事件处理等高级功能。同时,还探讨了常见问题及易错点,如背景点击关闭、键盘事件冲突和动画效果。通过本文,读者可以全面了解 React 模态框组件的实现细节。
64 0
|
JavaScript 前端开发 容器
详细介绍React模态框组件react-modal
该组件实现了模态框的一些效果。这是react-modal官网的配置参数。
6098 0
|
2月前
|
前端开发 JavaScript 开发者
深入理解React Hooks:提升前端开发效率的关键
【10月更文挑战第5天】深入理解React Hooks:提升前端开发效率的关键
|
1月前
|
前端开发 JavaScript 开发者
颠覆传统:React框架如何引领前端开发的革命性变革
【10月更文挑战第32天】本文以问答形式探讨了React框架的特性和应用。React是一款由Facebook推出的JavaScript库,以其虚拟DOM机制和组件化设计,成为构建高性能单页面应用的理想选择。文章介绍了如何开始一个React项目、组件化思想的体现、性能优化方法、表单处理及路由实现等内容,帮助开发者更好地理解和使用React。
73 9
|
2月前
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
|
2月前
|
前端开发 JavaScript API
探索React Hooks:前端开发的革命性工具
【10月更文挑战第5天】探索React Hooks:前端开发的革命性工具
|
21天前
|
监控 前端开发 数据可视化
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
@icraft/player-react 是 iCraft Editor 推出的 React 组件库,旨在简化3D数字孪生场景的前端集成。它支持零配置快速接入、自定义插件、丰富的事件和方法、动画控制及实时数据接入,帮助开发者轻松实现3D场景与React项目的无缝融合。
82 8
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
|
24天前
|
前端开发 JavaScript 开发者
使用React和Redux构建高效的前端应用
使用React和Redux构建高效的前端应用
28 1
|
2月前
|
前端开发 数据管理 编译器
引领前端未来:React 19的重大更新与实战指南🚀
React 19 即将发布,带来一系列革命性的新功能,旨在简化开发过程并显著提升性能。本文介绍了 React 19 的核心功能,如自动优化重新渲染的 React 编译器、加速初始加载的服务器组件、简化表单处理的 Actions、无缝集成的 Web 组件,以及文档元数据的直接管理。这些新功能通过自动化、优化和增强用户体验,帮助开发者构建更高效的 Web 应用程序。
179 1
引领前端未来:React 19的重大更新与实战指南🚀
|
1月前
|
前端开发 JavaScript Android开发
前端框架趋势:React Native在跨平台开发中的优势与挑战
【10月更文挑战第27天】React Native 是跨平台开发领域的佼佼者,凭借其独特的跨平台能力和高效的开发体验,成为许多开发者的首选。本文探讨了 React Native 的优势与挑战,包括跨平台开发能力、原生组件渲染、性能优化及调试复杂性等问题,并通过代码示例展示了其实际应用。
60 2