js 实现对一个元素得拉伸

前言:

最近写一个项目遇到了需要拉伸调整一个元素得大小(宽高)。所以打算实现一下。

思路就是用 mousedown、mousemove、mouseup 来实现。
mousemove是动态获取坐标,然后 动态改变元素宽度

js自己实现:

html里实现:

<!DOCTYPE html>
<html>
<head><style>.container {width: 400px;height: 300px;border: 1px solid #000;position: relative;}.box {width: 300px;height: 200px;border: 1px solid #000;resize: horizontal;overflow: auto;position: relative;}.button {width: 8px;height: 8px;background-color: #f00;cursor: pointer;position: absolute;}.right-button {right: -4px;top: 50%;transform: translateY(-50%);}.bottom-button {bottom: -4px;left: 50%;transform: translateX(-50%);}</style>
</head>
<body><div class="container"><div class="box">Content<div class="button right-button"></div></div><div class="button bottom-button"></div></div><script>const box = document.querySelector('.box');const rightButton = document.querySelector('.right-button');const bottomButton = document.querySelector('.bottom-button');let startX = 0;let startY = 0;let initialWidth = 0;let initialHeight = 0;function startResize(event) {event.preventDefault();startX = event.clientX;startY = event.clientY;initialWidth = parseInt(document.defaultView.getComputedStyle(box).width, 10);initialHeight = parseInt(document.defaultView.getComputedStyle(box).height, 10);document.documentElement.addEventListener('mousemove', resize);document.documentElement.addEventListener('mouseup', stopResize);}function resize(event) {const deltaX = event.clientX - startX;const deltaY = event.clientY - startY;const newWidth = initialWidth + deltaX;const newHeight = initialHeight + deltaY;box.style.width = `${newWidth}px`;box.style.height = `${newHeight}px`;}function stopResize() {document.documentElement.removeEventListener('mousemove', resize);document.documentElement.removeEventListener('mouseup', stopResize);}rightButton.addEventListener('mousedown', startResize);bottomButton.addEventListener('mousedown', startResize);</script>
</body>
</html>

效果截图

react里封装一个组件

hook 语法组件:
import React, { ReactNode, useState, useEffect } from 'react';
import styles from "./index.less";interface ResizableBoxProps {/*** 盒子的宽度 默认100*/widthNum?: number;/*** 盒子的高度 默认50*/heightNum?: number;/*** 内容*/content?: string | ReactNode;
}
const ResizableBox: React.FC<ResizableBoxProps> = ({widthNum,heightNum,content,children,...props
}) => {// 根据优先级选择要渲染的标题const contentRender = content || children;// 定义状态变量,使用useStateconst [width, setWidth] = useState(widthNum || 100); // 宽度const [height, setHeight] = useState(heightNum || 50); // 高度const [startX, setStartX] = useState(0); // 鼠标点击时的起始X坐标const [startY, setStartY] = useState(0); // 鼠标点击时的起始Y坐标const [initialWidth, setInitialWidth] = useState(0); // 调整大小前的初始宽度const [initialHeight, setInitialHeight] = useState(0); // 调整大小前的初始高度const [isResizing, setIsResizing] = useState(false); // 是否正在调整大小/**开始调整大小时的事件处理函数 高度*/const startResizeY = (event: any) => {event.preventDefault();const { clientX, clientY } = event;setStartY(clientY);setInitialHeight(height);setIsResizing(true);document.documentElement.addEventListener('mousemove', resizeY);document.documentElement.addEventListener('mouseup', stopResize);};/**开始调整大小时的事件处理函数 宽度*/const startResizeX = (event: any) => {event.preventDefault();const { clientX, clientY } = event;setStartX(clientX);setInitialWidth(width);setIsResizing(true);document.documentElement.addEventListener('mousemove', resizeX);document.documentElement.addEventListener('mouseup', stopResize);};/** 宽度调整大小 */const resizeX = (event: any) => {const { clientX } = event;const deltaX = clientX - startX;const newWidth = initialWidth + deltaX;setWidth(newWidth);};/**高度调整大小 */const resizeY = (event: any) => {const { clientY } = event;const deltaY = clientY - startY;const newHeight = initialHeight + deltaY;setHeight(newHeight);};// 停止调整大小时的事件处理函数const stopResize = () => {setIsResizing(false);document.documentElement.removeEventListener('mousemove', resizeX);document.documentElement.removeEventListener('mousemove', resizeY);document.documentElement.removeEventListener('mouseup', stopResize);};// useEffect用于设置鼠标样式useEffect(() => {if (isResizing) {// document.documentElement.style.cursor = 'nwse-resize';} else {document.documentElement.style.cursor = 'default';}}, [isResizing]);// 返回可调整大小的组件return (<divclassName={styles.resizable_box}style={{ width: `${width}px`, height: `${height}px` }} // 使用状态变量控制宽度和高度><div className={styles.container}>{contentRender}</div><div className={`${styles.button} ${styles.right_button}`} onMouseDown={startResizeX}></div><div className={`${styles.button} ${styles.bottom_button}`} onMouseDown={startResizeY}></div></div>);
};
export default ResizableBox;

样式less:

.resizable_box {position: relative;
}.container {width: 100%;height: 100%;
}// .button {
//     width: 8px;
//     height: 8px;
//     background-color: #f00;
//     /* cursor: pointer; */
//     position: absolute;
// }.button {// width: 2px;// height: 100%;background: none;position: absolute;
}.right_button {width: 2px;height: 100%;right: -2px;top: 0;// top: 50%;// transform: translateY(-50%);cursor: e-resize;
}.bottom_button {width: 100%;height: 2px;bottom: -2px;// left: 50%;// transform: translateX(-50%);cursor: n-resize;
}

使用 方式:

//换成自己的
import ResizableBox from "xxx/components/ResizableBox";
<ResizableBox widthNum={220} heightNum={300}><div style={{width:"100%",background:"red",height:"100%"}}>ttt</div></ResizableBox>

使用插件:

js:

Interact.js

一个现代、强大的拖放、调整大小和手势识别的JavaScript库。
提供了许多可定制的选项和事件回调。
https://interactjs.io/ 官网

jQuery UI

jQuery的UI组件库,包括可拖拽(Draggable)和可调整大小(Resizable)的组件。
提供了丰富的配置选项和事件处理。
示例:使用jQuery UI的Resizable

react:

react-resizable

特点:专为React设计的,允许你轻松地为React组件添加拖拽调整大小的功能。
安装:通过npm或yarn安装,如npm install react-resizable。
使用:
引入Resizable组件。
在你的React组件中包裹需要拉伸的元素。
通过props配置拉伸的初始大小、最小和最大尺寸等。

re-resizable(注意:这可能与react-resizable不同,但同样适用于React)

特点:类似于react-resizable,但可能提供了一些额外的功能或定制选项。
安装:通过npm或yarn安装,如npm install --save re-resizable。
使用:
引入Resizable组件。
在你的React组件中使用Resizable来包裹需要拉伸的元素。
可以通过props配置拉伸的默认大小、最小和最大尺寸、拉伸手柄的样式等。

react-rnd

特点:除了提供拉伸功能外,还允许你通过拖拽来移动元素。
安装:通过npm或yarn安装,如npm install react-rnd。
使用:
引入Rnd组件。
在你的React组件中使用Rnd来包裹需要拉伸和移动的元素。
可以通过props配置元素的初始位置、大小、移动和拉伸的限制等。
示例:参考文章3提供了一个使用react-rnd实现元素拖动和缩放的实例。

vue:

Vue-Resizable

这个库提供了一个可调整大小的组件,可以用于实现元素的拉伸和调整大小功能。

Vue-Draggable-Resizable

这个库结合了拖动和调整大小的功能,可以让你通过拖动和拉伸来改变元素的尺寸。

Vue-Resize-Handle

这个库提供了一个可自定义样式的调整大小的手柄,可以用于在元素上添加拉伸功能。

Vue-Drag-Resize

这个库提供了拖动和调整大小的能力,可以用于在元素上实现拉伸和调整大小的效果。

总结:

这种功能建议使用 成熟的库来实现,兼容性什么的一般都会适配。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

平衡编码与学习:程序员的自我提升之道

在这个快速迭代的编程世界里&#xff0c;程序员面临着双重挑战&#xff1a;一方面需要高效地完成日常编码任务&#xff0c;另一方面又必须不断学习新技术和深化专业知识以应对日益复杂的项目需求。如何在繁忙的工作和个人成长之间找到平衡点&#xff0c;是许多程序员共同面临的…

使用html-docx-js + fileSaver实现前端导出word

因为html-docx-js是16年的老库了&#xff0c;它代码里面用到的with语法现在严格模式不允许&#xff0c;用npm直接引入会报错&#xff0c;所以我们需要用其它方式引入 首先要将html-docx-js的代码放到项目中 html-docx-js/dist/html-docx.js at master evidenceprime/html-do…

Coze插件发布!PDF转Markdown功能便捷集成,打造你的专属智能体

近日&#xff0c;TextIn开发的PDF转Markdown插件正式上架Coze。 在扣子搜索“pdf转markdown”&#xff0c;或在Coze搜索“pdf2markdown” 即可找到插件&#xff0c;在你的专属智能体中便捷使用文档解析功能。 如果想测试解析插件在你需要的场景下表现如何&#xff0c;可以直接…

网络安全之xss靶场练习

目录 一、xss靶场练习 1、Ma Spaghet! 2、Jefff 第一个方法 第二个方法 3、Ugandan Knuckles 4、Ricardo Milos 5、Ah Thats Hawt 6、Ligma 7、Mafia​编辑 8、Ok, Boomer 一、xss靶场练习 靶场地址 https://xss.pwnfunction.com/ 页面显示如下 1、Ma Spaghet! 分析…

linux 你会配置静态路由吗?

1. centos 1. 配置静态路由 运行在openstack的虚拟机有多网卡的承载不同的物理平面的网络&#xff0c;比如业务网、管理网、存储网等。但是默认路由只有一条&#xff0c;所以只能通过静态路由来指定路由。 for example&#xff1a; 虚拟机eth0是管理网&#xff1a;10.0.43.0/…

【ARM 芯片 安全与攻击 5 -- 测信道攻击(Side-channel Attack)】

文章目录 什么是测信道攻击?测信道攻击在 ARM 架构中的设计与应用电源分析攻击(Power Analysis Attack)DPA 攻击示例时间分析攻击(Timing Attack)时间分析攻击示例缓存侧信道攻击(Cache Side-channel Attack)Flush+Reload 攻击示例应对测信道攻击的防御措施Summary什么是…

谈一谈数据虚拟化的技术核心和应用架构

数据虚拟化&#xff08;Data Virtualization&#xff09;是对数据资源的抽象&#xff0c;通过屏蔽数据资源的存储位置和访问方式&#xff0c;能够将不同数据源、不同格式的数据资源&#xff0c;进行逻辑上的整合集成。这一技术方案与过去面对传统数仓的弊端&#xff0c;业界过去…

板子电源接线

目的 就是电源接板子时&#xff0c;分清正负 过程 AC、交流电 没有正负 分火线和0线 AC-L 交流火线 AC-N 交流0线 FG&#xff1a;接的是大地 G&#xff1a;是直流输出的地 U&#xff1a;表示的是电压 DC是直流正&#xff0c;DC-是直流负 2个AC是接交流的&#xff0c;一般是左…

免费的真是太香了!Chainlit接入抖音 Coze AI知识库接口快速实现自定义用户聊天界面

前言 由于Coze 只提供了一个分享用的网页应用&#xff0c;网页访问地址没法自定义&#xff0c;虽然可以接入NextWeb/ChatGPT web/open webui等开源应用。但是如果我们想直接给客户应用&#xff0c;还需要客户去设置配置&#xff0c;里面还有很多我们不想展示给客户的东西怎么办…

源代码一定要加密!10款超级好用的源代码加密软件排行榜

在当今高度竞争的商业环境中&#xff0c;源代码不仅是软件产品的基础&#xff0c;更是企业的核心资产之一。保护源代码免受未经授权的访问和盗窃至关重要。为此&#xff0c;许多企业采用源代码加密软件来为这一重要资产增加额外的安全层。以下是2024年企业通用的十大源代码加密…

SNMP入门笔记

简介 SNMP是英文"Simple Network Management Protocol"的缩写&#xff0c;中文意思是"简单网络管理协议"。SNMP是一种简单网络管理协议&#xff0c;它属于TCP/IP五层协议中的应用层协议&#xff0c;用于网络管理的协议。SNMP主要用于网络设备的管理。由于…

session、cookie、token概念介绍

一、Cookie 1、cookie介绍 Cookie是网站为了辨别用户身份而储存在用户本地终端&#xff08;Client Side&#xff09;上的小型文本文件。 作用&#xff1a;Cookie主要用于保存用户登录信息、浏览记录等&#xff0c;以便用户再次访问时能够自动识别并提供个性化服务。存储位置…

汽车电子 -- python脚本组包软件版本号

python脚本组包软件版本号 import pandas as pd import click import os import datetimedef cmdGetSwInfo():targetFilePath ../APP.htargetKeyWord #definetargetProgType PROJECT_TYPEtargetSoftware SOFTWARE_VERSIONtargetVersionInfo VERSION_INFO fileRead …

SEO优化:如何优化自己的文章,解决搜索引擎不收录的问题

可以使用bing的URL检查&#xff0c;来检查自己的文章是不是负荷收录准测&#xff0c;如果页面有严重的错误&#xff0c;搜索引擎是不会进行收录的&#xff0c;而且还会判定文章为低质量文章&#xff01; 检查是否有问题。下面的页面就是有问题&#xff0c;当然如果是误报你也可…

【与C++的邂逅】--- 类和对象(上)

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 与C的邂逅 本篇博客将讲解C中的类和对象&#xff0c;C是面向对象的语言&#xff0c;面向对象三大特性是封装,继承,多态。学习类和对象&#xff0c;我们可…

[数据集][目标检测]集装箱缺陷检测数据集VOC+YOLO格式4127张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4127 标注数量(xml文件个数)&#xff1a;4127 标注数量(txt文件个数)&#xff1a;4127 标注…

echart改变legend样式及分页

legend: {type: "scroll",orient: horizontal, // 纵向&#xff0c;默认横向不用写pageIconColor: #1b9aee, //翻页下一页的三角按钮颜色pageIconInactiveColor: #7f7f7f, //翻页&#xff08;即翻页到头时&#xff09;// 配置滚动类型的图例pageTextStyle: {color: &…

C语言每日好题(3)

有任何不懂的问题可以评论区留言&#xff0c;能力范围内都会一一回答 #define _CRT_SECURE_NO_WARNING #include <stdio.h> #include <string.h> int main(void) {if ((strlen("abc") - strlen("abcdef")) > 0)printf(">\n")…

十三、OpenCVSharp的目标检测

文章目录 简介一、传统目标检测方法1. 基于滑动窗口的检测2. 特征提取与分类器结合(如 HOG + SVM)3. 级联分类器二、基于深度学习的目标检测1. YOLO 系列算法2. SSD 算法3. Faster R-CNN 算法三、深度学习目标检测模型的训练和部署四、目标检测的性能评估指标1. 准确率、召回…

C++_进阶:AVL树

文章目录 1. AVL树的概念2. AVL树节点的定义3. AVL树的插入4. AVL树的旋转4.1 右单旋4.2 左单旋4.3 左右双旋4.4 右左双旋 5.AVL树的验证6. AVL树模拟实现 1. AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#…