JS鼠标拖拽功能封装

6 篇文章 0 订阅
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>class</title>
		<style type="text/css">
			.d{

				position: absolute;
				width: 100px;
				height: 100px;
				background-color: #c00;
			}
			.a{
				position: absolute;
				width: 200px;
				height: 100px;
				background-color: #B5905F;
			}
		</style>
	</head>
	<body>
		
		<div class="d">
			
		</div>
		<div class="a">
			
		</div>
		<script type="text/javascript">
			class Drag {
				constructor(op){
					this.op = op;
					this.l = null;
					this.t = null;
					this.mouseDowm = false;
				}
				toDrag(){
					this.op.addEventListener("mousedown", event => {
						this.mouseDowm = true;
						let e = event || window.event;
						this.l = e.pageX - this.op.offsetLeft;
						this.t = e.pageY - this.op.offsetTop;
					})

					document.addEventListener("mousemove", event => {
						console.log('this.mouseDowm',this.mouseDowm)
						if(this.mouseDowm){
							let cHeight = document.documentElement.clientHeight || document.body.clientHeight || window.innerHeight;
							let cWidth  = document.documentElement.clientWidth || document.body.clientWidth || window.innerWidth;
							let e = event || window.event;
							let moveLeft = e.clientX - this.l;
							let moveTop = e.clientY - this.t
							if(moveLeft < 0){
								moveLeft = 0;
							};
							if(moveLeft > cWidth - this.op.offsetWidth){
								moveLeft = cWidth - this.op.offsetWidth;
							};
							if(moveTop < 0){
								moveTop = 0;
							};
							if(moveTop > cHeight - this.op.offsetHeight){
								moveTop = cHeight - this.op.offsetHeight;
							};
							this.op.style.left = moveLeft + "px";
							this.op.style.top = moveTop + "px";
						}
					});
					this.op.addEventListener('mouseup', e => {
						this.mouseDowm = false;
						e.preventDefault();

					})
				}	
			};
			let divA = document.querySelector(".a");
			let divD = document.querySelector(".d");
			let drag = new Drag(divA);
			let drag2 = new Drag(divD);
			
			drag.toDrag();
			drag2.toDrag();

		</script>
	</body>
</html>
// v-dialogDrag: 弹窗拖拽
Vue.directive('dialogDrag', {
    bind(el, binding, vnode, oldVnode) {
        const dialogHeaderEl = el.querySelector('.el-dialog__header');
        const dragDom = el.querySelector('.el-dialog');
        dialogHeaderEl.style.cursor = 'move';

        // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
        const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null);
        
        dialogHeaderEl.onmousedown = (e) => {
            // 鼠标按下,计算当前元素距离可视区的距离
            const disX = e.clientX - dialogHeaderEl.offsetLeft;
            const disY = e.clientY - dialogHeaderEl.offsetTop;
            
            // 获取到的值带px 正则匹配替换
            let styL, styT;

            // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
            if(sty.left.includes('%')) {
                styL = +document.body.clientWidth * (+sty.left.replace(/\%/g, '') / 100);
                styT = +document.body.clientHeight * (+sty.top.replace(/\%/g, '') / 100);
            }else {
                styL = +sty.left.replace(/\px/g, '');
                styT = +sty.top.replace(/\px/g, '');
            };
            
            document.onmousemove = function (e) {
                // 通过事件委托,计算移动的距离 
                const l = e.clientX - disX;
                const t = e.clientY - disY;

                // 移动当前元素  
                dragDom.style.left = `${l + styL}px`;
                dragDom.style.top = `${t + styT}px`;

                //将此时的位置传出去
                //binding.value({x:e.pageX,y:e.pageY})
            };

            document.onmouseup = function (e) {
                document.onmousemove = null;
                document.onmouseup = null;
            };
        }  
    }
})

// v-dialogDragWidth: 弹窗宽度拖大 拖小
Vue.directive('dialogDragWidth', {
    bind(el, binding, vnode, oldVnode) {
        const dragDom = binding.value.$el.querySelector('.el-dialog');

        el.onmousedown = (e) => {
            
            // 鼠标按下,计算当前元素距离可视区的距离
            const disX = e.clientX - el.offsetLeft;
            
            document.onmousemove = function (e) {
                e.preventDefault(); // 移动时禁用默认事件

                // 通过事件委托,计算移动的距离 
                const l = e.clientX - disX;
                dragDom.style.width = `${l}px`;
            };

            document.onmouseup = function (e) {
                document.onmousemove = null;
                document.onmouseup = null;
            };
        }  
    }
})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值