原生JS-鼠标拖动

原生JS-鼠标拖动

通过鼠标的点击事件

步骤: 1. 鼠标按下div。 2. 鼠标移动,div跟着移动

复制代码
原生js,实现拖拽效果。

     1. 给被拖拽的div加上 onmousedown 鼠标【按下事件】。
		   鼠标按下的时候,开始监听鼠标的移动。
		  
	 2. div按下后,全局监听鼠标【移动事件】。
		   鼠标移动后,给div赋值。绝对定位。
		  
	 3. 全局监听鼠标【抬起事件】。
		   当鼠标抬起的时候。取消监听鼠标的【移动】【抬起】事件。
html 复制代码
<!DOCTYPE html>
<html>
    <head>    
        <meta charset="UTF-8">
        <title>Drag</title>
        <style>
            #box {
                width: 60px;
                height: 60px;
                background-color: red;
                position: absolute; 
            }
        </style>
    </head>
    <body>
         <div id="box"></div>  
    </body>
    <script>
		// 一共就两步:
	    //      1. 鼠标按下div
		//      2. 鼠标移动,div跟着移动
	
	    // 原生js,实现拖拽效果。
	    // 1. 给被拖拽的div加上 onmousedown 鼠标【按下事件】。
			  // 鼠标按下的时候,开始监听鼠标的移动。
			  
		// 2. div按下后,全局监听鼠标【移动事件】。
			  // 鼠标移动后,给div赋值。绝对定位。
			  
		// 3. 全局监听鼠标【抬起事件】。
			  // 当鼠标抬起的时候。取消监听鼠标的【移动】【抬起】事件。
			  
		window.onload = function () {	
			let divDom = document.getElementById("box");
			// 一. 监听div按下的事件
			divDom.onmousedown = function (ev) {
				let oevent = ev || event;

				let distanceX = oevent.clientX - divDom.offsetLeft;
				let distanceY = oevent.clientY - divDom.offsetTop;
				
				// 二. 全局监听鼠标的移动事件。
				document.onmousemove = function (ev) {
					let oevent = ev || event;
					divDom.style.left = oevent.clientX - distanceX + 'px';
					divDom.style.top = oevent.clientY - distanceY + 'px';
				};
				
				// 三. 全局监听鼠标的抬起事件。当鼠标抬起的时候,给去全局监听。
				document.onmouseup = function () {
					document.onmousemove = null;
					document.onmouseup = null;
				};
			};
		};

	</script>
</html>

通过h5的属性

添加 draggable="true" 就能拖动。然后记录位置。
这种方式简单的多,只需要添加属性,然后记录位置就行。

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div{
            width: 100px;
            height: 100px;
            background-color: red;
            position: absolute;
            left: 0px;
            top: 0px;
        }
    </style>
</head>
<body>
    <div draggable="true"></div>
    <script>
        var div = document.getElementsByTagName('div')[0];
        var X = 0,
            Y = 0;
        div.ondragstart = function(e){   
            X = e.clientX;  //记录鼠标点下的位置。(因为div的定位点,是左上角 0,0)
            Y = e.clientY;
        }
        div.ondragend = function(e){
            var X1 = e.clientX - X; //结束的位置,减去鼠标点下的位置,那么得到的位置,就是div落下的位置。
            var Y1 = e.clientY - Y;
            div.style.left = div.offsetLeft + X1 + 'px'; //这里还需要加上 div当前的位置, 累加。 
            div.style.top = div.offsetTop + Y1 + 'px';
        }
    </script>
</body>
</html>

这个属性最常见的用法是把A元素,拖动到B容器中。

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        #div{
            width: 100px;
            height: 100px;
            background-color: red;
            position: absolute;
            left: 0px;
            top: 0px;
        }
		
		#div2{
            width: 200px;
            height: 200px;
            background-color: green;
			margin-top:200px;
        }
		
    </style>
</head>
<body>
    <div id="div" draggable="true"></div>
	
	<div id="div2"></div>
    <script>
		// 获取可以拖动的元素
        const draggable = document.getElementById('div');
		// 获取容器元素
		const droppable = document.getElementById('div2');


		// 容器元素
		droppable.addEventListener('dragover', dragOver);
		droppable.addEventListener('drop', dragDrop);
		
		function dragOver(e) {
			e.preventDefault();
		}
		
		function dragDrop(e) {
			// 添加DOM 
			this.append(draggable);
		}
    </script>
</body>
</html>

A移动前

A移动后

可以写点样式,用于显示隐藏div

相关推荐
妙团团几秒前
React学习之自定义tab组合组件
javascript·学习·react.js
2601_949809596 分钟前
flutter_for_openharmony家庭相册app实战+隐私设置实现
android·javascript·flutter
2601_949593658 分钟前
React Native 鸿蒙跨平台开发:LinearGradient 渐变动画效果
javascript·react native·react.js
qq_1777673710 分钟前
React Native鸿蒙跨平台音乐播放器涉及实时进度更新、播放控制、列表交互、状态管理等核心技术点
javascript·react native·react.js·ecmascript·交互·harmonyos
2501_9209317014 分钟前
React Native鸿蒙跨平台实现了简单的商品图片轮播功能,为用户提供了直观的商品图片浏览体验,帮助用户全面了解商品外观
javascript·react native·react.js·ecmascript·harmonyos
切糕师学AI26 分钟前
Vue 中如何修改地址栏参数并重新加载?
前端·javascript·vue.js
软弹26 分钟前
Vue3如何融合TS
前端·javascript·vue.js
2501_920931707 小时前
React Native鸿蒙跨平台采用ScrollView的horizontal属性实现横向滚动实现特色游戏轮播和分类导航
javascript·react native·react.js·游戏·ecmascript·harmonyos
东东5169 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino9 小时前
图片、文件的预览
前端·javascript