元素拖拽与缩放

根据其他作者的文章做了一下记录,拖拽是根据元素事件行为不断的去更新元素的偏移量来达到拖拽的效果,缩放可以有3种方法去实现,1,直接改变宽高属性达到视觉上的缩放效果。2,scale属性。3,zoom属性。注意一下 scale和zoom属性缩放过后再进行拖拽的话,元素的偏移量会有一定的偏差,想要精确的偏移量需要重新计算。

贴一个demo,有兴趣的可以试试看

<html>
	<head>
		<style type="text/css">
			#container {
				width: 100%;
				height: 100%;
				position: relative;

			}

			#body {
				margin: auto;
				width: 50%;
				position: relative;
				background: #ccc;
			}

			#dragBox {
				user-select: none;
				width: 70px;
				height: 70px;
				background-color: firebrick;
				cursor: pointer;
				position: absolute;
				left: -70px;
			}
		</style>
	</head>

	<body>
		<div id="body">
			<div id="container">
				<div id="dragBox" onmousedown="dragBox_event_mousedown(arguments[0]);"></div>
			</div>
		</div>

		<script>
			function dragBox_event_mousedown(e) {
				console.log(e)
				var obj, temp;
				obj = document.getElementById("dragBox");
				obj.startX = e.clientX - obj.offsetLeft;
				obj.startY = e.clientY - obj.offsetTop;
				console.log(obj.startX)
				document.onmousemove = compute;
				document.addEventListener("mouseup", document_event_mouseup, "");
			}

			function document_event_mousemove(e) {
				compute(e)

			}

			function document_event_mouseup() {
				console.log('松开')
				document.onmousemove = "";
				// document.removeEventListener("mouseup", document_event_mouseup, "");
			}

			function compute(e) {
				let dom = document.getElementById('container')
				var obj = document.getElementById("dragBox");
				let maxW = dom.clientWidth - obj.clientWidth
				let maxH = dom.clientHeight - obj.clientHeight
				let clientW = dom.clientX
				let clientH = dom.clientH
				let domLeft = e.clientX - obj.startX
				let domTop = e.clientY - obj.startY;
				// console.log('x坐标:'+domLeft < 0 ? 0 : domLeft > maxW ? maxW : domLeft)

				obj.style.position = "absolute";
				obj.style.left = domLeft < 0 ? 0 : domLeft > maxW ? maxW : domLeft + "px";
				obj.style.top = domTop < 0 ? 0 : domTop > maxH ? maxH : domTop + "px";

			}


			function domScale() {
				var box = document.getElementById('dragBox');
				console.log(box.offsetWidth)
				var str = window.navigator.userAgent.toLowerCase();
				if (str.indexOf('firefox') != -1) { //火狐浏览器
					box.addEventListener('DOMMouseScroll', function(event) {
						// event.preventDefault();//阻止窗口默认的滚动事件
						// console.log(event.detail);//前滚-3

						if (event.detail < 0) {
							if (box.offsetWidth > 100) {
								return
							}
							console.log('前滚');
							box.style.width = box.offsetWidth + 5 + 'px';
							box.style.height = box.offsetHeight + 5 + 'px';
						};
						if (event.detail > 0) {
							if (box.offsetWidth < 40) {
								return
							}
							console.log('后滚');
							box.style.width = box.offsetWidth - 5 + 'px';
							box.style.height = box.offsetHeight - 5 + 'px';
						};
						return false; //阻止默认事件
					}, false);
				} else { //非火狐浏览器
					box.onmousewheel = function(ev) {
						var e = ev || window.event;
						/*if (e.preventDefault) {
						    e.preventDefault();
						} else{
						    e.returnValue=false;
						};*/
						// console.log(e);
						// console.log(e.wheelDelta);//前滚120
						if (e.wheelDelta > 0) {
							if (box.offsetWidth > 100) {
								return
							}
							console.log('前滚');
							box.style.width = box.offsetWidth + 5 + 'px';
							box.style.height = box.offsetHeight + 5 + 'px';
						};
						if (e.wheelDelta < 0) {
							if (box.offsetWidth < 40) {
								return
							}
							console.log('后滚');
							box.style.width = box.offsetWidth - 5 + 'px';
							box.style.height = box.offsetHeight - 5 + 'px';
						};
						return false; //阻止默认事件
					}
				};
			}

			function domScale1() {
				let scale = 1
				var box = document.getElementById('dragBox');
				var str = window.navigator.userAgent.toLowerCase();
				if (str.indexOf('firefox') != -1) { //火狐浏览器
					box.addEventListener('DOMMouseScroll', function(event) {
						// event.preventDefault();//阻止窗口默认的滚动事件
						// console.log(event.detail);//前滚-3

						if (event.detail < 0) {
							if (scale > 2) {
								return
							}
							console.log('前滚');
							scale += 0.1
							box.style.transform = "scale(" + scale + ")";
						};
						if (event.detail > 0) {
							if (scale < 0.5) {
								return
							}
							console.log('后滚');
							scale -= 0.1
							box.style.transform = "scale(" + scale + ")";
						};
						return false; //阻止默认事件
					}, false);
				} else { //非火狐浏览器
					box.onmousewheel = function(ev) {
						var e = ev || window.event;
						/*if (e.preventDefault) {
						    e.preventDefault();
						} else{
						    e.returnValue=false;
						};*/
						// console.log(e);
						// console.log(e.wheelDelta);//前滚120
						if (e.wheelDelta > 0) {
							if (scale > 2) {
								return
							}
							console.log('前滚');
							scale += 0.1
							box.style.transform = "scale(" + scale + ")";
							console.log(box.offsetWidth)
						};
						if (e.wheelDelta < 0) {
							if (scale < 0.5) {
								return
							}
							console.log('后滚');
							scale -= 0.1
							box.style.transform = "scale(" + scale + ")";
						};
						return false; //阻止默认事件
					}
				};
			}
			domScale() //改变宽高属性进行缩放
			// domScale1() //scale方式缩放
		</script>
	</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 Vue.js 和一些第三方库来实现可拖拽缩放组件,以下是一个基本的实现步骤: 1. 安装第三方库,例如 vue-draggable-resizable 或 vue-draggable 。 2. 在 Vue 组件中引入库并注册组件。 3. 在模板中使用组件,并设置组件的初始位置和大小。 4. 通过组件的事件监听器来跟踪组件的位置和大小变化,并在 Vue 实例中更新组件的状态。 5. 根据组件的状态来动态更新组件的样式和位置。 以下是一个简单的示例代码: ```html <template> <div> <vue-draggable-resizable :x="x" :y="y" :w="w" :h="h" :min-width="100" :min-height="100" :active.sync="isActive" :draggable="true" :resizable="true" @dragging="onDragging" @resizing="onResizing" > <div class="content">可拖拽缩放元素</div> </vue-draggable-resizable> </div> </template> <script> import VueDraggableResizable from 'vue-draggable-resizable' export default { components: { VueDraggableResizable }, data() { return { x: 0, y: 0, w: 200, h: 200, isActive: true } }, methods: { onDragging(x, y) { this.x = x this.y = y }, onResizing(w, h) { this.w = w this.h = h } } } </script> <style> .content { width: 100%; height: 100%; background-color: #f0f0f0; border: 1px solid #ccc; border-radius: 4px; display: flex; align-items: center; justify-content: center; } </style> ``` 在这个示例中,我们使用了 vue-draggable-resizable 库来创建可拖拽缩放元素。我们设置了元素的初始位置和大小,并监听了 dragging 和 resizing 事件来更新元素的状态。我们还根据元素的状态来动态更新了元素的样式和位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值