js拖动改变div的宽高

本文介绍了一种使用JavaScript实现拖拽调整HTML元素尺寸的方法。通过监听鼠标事件,可以在页面上自由调整指定DIV元素的大小。文章详细解释了如何判断鼠标位置及如何根据鼠标移动更新元素的宽高。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			#box{position: absolute;top: 150px;left: 250px;width: 200px;height: 200px;background-color: red;}
		</style>
		<script type="text/javascript">
			window.onload=function(){
				var oBox=document.getElementById('box');
				var b='';//声明两个空变量a,b;
				var a='';
				oBox.onmousedown=function(ev){
					var iEvent=ev||event;
					var dx=iEvent.clientX;//当你第一次单击的时候,存储x轴的坐标。
					var dy=iEvent.clientY;//当你第一次单击的时候,储存Y轴的坐标。
					var dw=oBox.offsetWidth;//存储默认的div的宽度。
					var dh=oBox.offsetHeight;//存储默认的div的高度。
					var disright=oBox.offsetLeft+oBox.offsetWidth;//存储默认div右边距离屏幕左边的距离。
					var distop=oBox.offsetHeight+oBox.offsetTop;//存储默认div上边距离屏幕左边的距离。
					if(iEvent.clientX>oBox.offsetLeft+oBox.offsetWidth-10){//判断鼠标是否点在右边还是左边,看图1理解
						b='right';
					}
					if(iEvent.clientX<oBox.offsetLeft+10){//同理
						b='left';
					}
					if(iEvent.clientY<oBox.offsetTop+10){
						a='top';
					}
					if(iEvent.clientY>oBox.offsetTop+oBox.offsetHeight-10){
						a='bottom';
					}
					document.onmousemove=function(ev){
						var iEvent=ev||event;
						if(b=='right'){
							oBox.style.width=dw+(iEvent.clientX-dx)+'px';
//此时的iEvent.clientX的为你拖动时一直改变的鼠标的X坐标,例如你拖动的距离为下图的绿色部分,第二个黑点就表示你此时的iEvent.clientX
//所以,此时的盒子宽度就等于绿色部分的距离加上原本盒子的距离,看图2
							if(oBox.offsetWidth<=10){//当盒子缩小到一定范围内的时候,让他保持一个固定值,不再继续改变
								oBox.style.width='10px';
							}
						}
						if(b=='left'){
							oBox.style.width=dw-(iEvent.clientX-dx)+'px';//iEvent.clientX-dx表示第二次鼠标的X坐标减去第一次鼠标的X坐标,得到绿色移动的距离(为负数),再加上原本的div宽度,就得到新的宽度。 图3
							oBox.style.left=disright-oBox.offsetWidth+'px';//disright表示盒子右边框距离左边的距离,disright-当前的盒子宽度,就是当前盒子距离左边的距离
							if(oBox.offsetWidth<=10){
								oBox.style.width='10px';
								oBox.style.left=disright-oBox.offsetWidth+'px';//防止抖动
							}
						}
						if(a=='bottom'){
							oBox.style.height=iEvent.clientY-dy+dh+'px';
							if(oBox.offsetHeight<=10){
								oBox.style.height='10px';
							}
						}
						if(a=='top'){
							oBox.style.height=dh-(iEvent.clientY-dy)+'px'
							oBox.style.top=distop-oBox.offsetHeight+'px';
							if(oBox.offsetHeight<=10){
								oBox.style.height='10px';
								oBox.style.top=distop-oBox.offsetHeight+'px';
							}
						}
						
					};
					document.onmouseup=function(){
						document.onmousedown=null;
						document.onmousemove=null;
					};
					return false;
				};
			};
		</script>
	</head>
	<body>
		<div id="box"></div>
	</body>
</html>

图1

图2

图3

### 使用 CSS 和 JavaScript 实现拖拽调整 DIV 元素的 #### 方法一:仅使用 CSS 的 `resize` 属性 对于简单的水平或垂直方向上的尺寸调整,可以直接应用 CSS 中的 `resize` 属性。此方法适用于不需要复杂交互场景的情况。 ```css .resizable { width: 300px; height: 200px; overflow: auto; /* 必须 */ resize: both; /* 设置可调整的方向为两个维度 */ border: 1px solid black; } ``` 这种方法简单易用,但是存在局限性——它依赖于浏览器默认行为,并且无法自定义手柄样式[^1]。 #### 方法二:结合 CSS 和 JavaScript 提供更灵活的功能 当需求超出单纯 `resize` 能力范围时(比如想要定制化外观、支持多向拖曳等),则需引入 JavaScript 来增强功能: ##### HTML 结构 创建一个容器用于容纳被调整大小的目标区域以及操作手柄。 ```html <div class="container"> <div id="target"></div> <span id="handle">drag</span> </div> ``` ##### CSS 定义 为目标元素设定初始尺寸和其他视觉效果;同时给定手柄的基础样式以便用户识别其用途。 ```css #target { position: absolute; top: 50px; left: 50px; width: 200px; height: 150px; background-color: lightblue; } #handle { display: block; position: absolute; bottom: -8px; right: -8px; cursor: se-resize; padding: 4px; font-size: smaller; color: white; text-align: center; line-height: normal; user-select: none; z-index: 999; background-color: gray; } ``` ##### JavaScript 控制逻辑 监听鼠标按下事件,在移动过程中动态更新目标对象的位置与尺寸直至释放为止。 ```javascript let target = document.getElementById('target'); let handle = document.getElementById('handle'); // 记录起始位置和偏移量 let startX, startY, startWidth, startHeight; function mouseDown(event){ // 获取当前窗口坐标系下的起点坐标 startX = event.clientX; startY = event.clientY; // 存储原始宽度度 startWidth = parseInt(target.style.width); startHeight = parseInt(target.style.height); // 绑定全局监听器处理后续动作 window.addEventListener('mousemove', resizing); window.addEventListener('mouseup', stopResize); } function resizing(event){ let dx = event.clientX - startX, dy = event.clientY - startY; // 更新新的宽度度 target.style.width = (startWidth + dx) + 'px'; target.style.height = (startHeight + dy) + 'px'; // 防止页面滚动 event.preventDefault(); } function stopResize(){ // 移除临时绑定的监听器 window.removeEventListener('mousemove', resizing); window.removeEventListener('mouseup', stopResize); } // 开始监听手柄点击事件 handle.addEventListener('mousedown', mouseDown); ``` 以上代码片段展示了如何通过组合 CSS 和 JavaScript 创建一个具有基本交互性的组件,允许用户直观地改变指定 DOM 对象的外形参数[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Agwenbi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值