使用 JS 实现拖拽拉伸一个 div 的宽度


使用 JS 实现了一个可拉伸的 div,按住右边框,拖动鼠标可改变 div 的宽度。

1. 鼠标在浏览器中的坐标基本概念

mouse-location

2. 鼠标按住拖动改变宽度原理

  1. 鼠标按下时算出鼠标 x 坐标与元素右边框的距离,在鼠标移动时不变:element.offsetWidth - event.offsetX
  2. 元素宽 = 鼠标距离元素左边框距离event.offsetX + 1中算出的值

改变高度同理。

3. 代码实现

HTML:

<div id="container1" class="resizable"></div>

JavaScript:混用了浏览器原生 API 与 jQuery,因为 jQuery 的链式调用太好用了

bindResize();

function bindResize() {
	const el = document.getElementById('container1');
	let els = el.style, x = y = 0;

	el.addEventListener('mousemove', function(evt) {
		if (el.offsetWidth - evt.offsetX <= 10) {
			els.cursor = 'e-resize';
		} else {
			els.cursor = 'auto';
		}})
			
		el.addEventListener('mousedown', function(evt) {
			// 点击位置与元素右边框的距离,不变值
			x = el.offsetWidth - evt.offsetX
				
			// 在支持 setCapture 捕捉焦点, 设置事件
			el.setCapture ? (
				el.setCapture(), 
				el.onmousemove = function (ev) { mouseMove(ev || event) },
				el.onmouseup = mouseUp
			) : ($(document).bind("mousemove", mouseMove).bind("mouseup", mouseUp))
				
			// 阻止默认事件
				evt.preventDefault();
			})

			// 鼠标移动事件
			function mouseMove(evt) {
				els.width = evt.offsetX + x + 'px';
				
				// 如果鼠标移出元素或屏幕外
				if (evt.offsetX <= 0 || evt.offsetX >= document.body.clientWidth + 2) {
					mouseUp()
				}
			}
			
			// 释放焦点,移除事件
			function mouseUp() {
				el.releaseCapture ? (
					el.releaseCapture(), el.onmousemove = el.onmouseup = null
				) : ($(document).unbind("mousemove", mouseMove).unbind("mouseup", mouseUp))
			}
		}

4. 不用 js 可以实现 div 拉伸吗?

可以,两个 css 属性解决:

.resizable {
  overflow: auto;
  resize: both;
}

2022-03-02

参考

了解JS的clientX、pageX、screenX等方法来获取鼠标坐标


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM