HTML提高之拖曳

拖曳元素

页面中设置了 draggable="true" 属性的元素。

举例如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="css/font-awesome.min.css">
    <style>
    .box1{
        width: 200px;
        height: 200px;
        background-color: green;

    }
    </style>
</head>
<body>
    <!--给 box1 增加拖拽的属性-->
    <div class="box1" draggable="true"></div>
</body>
</html>

效果如下:

上图中,我们给 box1 增加了draggable="true" 属性之后,发现 box1 是可以拖拽的。但是拖拽之后要做什么事情呢?这就涉及到事件监听

1. 拖拽元素的事件监听:(应用于拖拽元素)
  • ondragstart当拖拽开始时调用

  • ondragleave 当鼠标离开拖拽元素时调用

  • ondragend 当拖拽结束时调用

  • ondrag 整个拖拽过程都会调用

代码演示:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .box {
            width: 200px;
            height: 200px;
            background-color: green;
        }
    </style>
</head>
<body>
<!--拖曳元素-->
<div class="box" draggable="true"></div>

<script>
    var box = document.querySelector('.box');

    //  绑定拖拽事件

    //  拖拽开始
    box.ondragstart = function () {
        console.log('拖拽开始.');
    }

    //  拖拽离开:鼠标拖拽时离开被拖拽的元素是触发
    box.ondragleave = function () {
        console.log('拖拽离开..');
    }

    //  拖拽结束
    box.ondragend = function () {
        console.log('拖拽结束...');
        console.log("---------------");
    }
	//拖曳过程中
    box.ondrag = function () {
        console.log('拖拽');
    }

</script>
</body>
</html>

效果如下:

2、目标元素

比如说,你想把元素A拖拽到元素B里,A是拖曳元素,那么元素B就是目标元素

页面中任何一个元素都可以成为目标元素。

目标元素的事件监听:(应用于目标元素)

  • ondragenter 当拖拽元素进入时调用

  • ondragover 当拖拽元素停留在目标元素上时,就会连续一直触发(不管拖拽元素此时是移动还是不动的状态)

  • ondrop在目标元素上松开鼠标时调用

  • ondragleave 当鼠标离开目标元素时调用

代码演示:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .one {
            width: 100px;
            height: 100px;
            border: 1px solid #000;
            background-color: green;
        }

        .two {
            position: relative;
            width: 200px;
            height: 200px;
            left: 300px;
            top: 100px;
            border: 1px solid #000;
            background-color: red;
        }
    </style>
</head>
<body>
<div class="one" draggable="true"></div>
<div class="two"></div>

<script>
    var two = document.querySelector('.two');

    //目标元素的拖拽事件

    // 当被拖拽元素进入是触发
    two.ondragenter = function () {
        console.log("来了.");
    }

    // 当被拖拽元素离开时触发
    two.ondragleave = function () {

        console.log("走了..");
    }

    // 当拖拽元素在 目标元素上时,连续触发
    two.ondragover = function (e) {
        //阻止拖拽事件的默认行为
        e.preventDefault(); //【重要】一定要加这一行代码,否则,后面的方法 ondrop() 无法触发。

        console.log("over...");
    }

    // 当在目标元素上松开鼠标是触发
    two.ondrop = function () {
        console.log("松开鼠标了....");
    }
</script>
</body>
</html>

效果演示:

注意,上方代码中,我们加了event.preventDefault()这个方法。如果没有这个方法,后面ondrop()方法无法触发。如下图所示:

如上图所示,连光标的形状都提示我们,无法在目标元素里继续操作了。

总结:如果想让拖拽元素在目标元素里做点事情,就必须要在 ondragover() 里加event.preventDefault()这一行代码。

综合实例
<!DOCTYPE html>
<html>
<head>
	<title>拖曳综合案例</title>
	<style>
		#one{
			border:1px solid black;
			width:400px;
			height:400px;
		}
		#two{
			position: absolute;
			border:1px solid black;
			width:400px;
			height:400px;
			top:0px;
			left:800px;
		}
		#one>div,#two>div{
			width:100px;
			height:100px;
			boder:1px solid black;
			background-color:red;
			border-radius: 50%;
			text-align: center;
			line-height: 98px;
			float: left;
		}
	</style>
</head>
<body>
<div id="one">
	<div draggable="true">1</div>
	<div draggable="true">2</div>
	<div draggable="true">3</div>
	<div draggable="true">4</div>
	<div draggable="true">5</div>
	<div draggable="true">6</div>
	<div draggable="true">7</div>
	<div draggable="true">8</div>
</div>
<div id="two"></div>

<script>
	var box=document.querySelectorAll("#one div");
	var two=document.querySelector("#two");
	var temp=null;

	for(var i=0;i<box.length;i++){
		box[i].ondragstart=function(){
			temp=this;//将当前拖曳的box赋给temp
			console.log(temp);
		}
		box[i].ondragend=function(){
			temp=null;//清空temp
			console.log(temp);
		}
	}
	//重要!阻止拖曳的默认行为发生
	two.ondragover=function(e){
		e.preventDefault();
	}
	two.ondrop=function(){
		this.appendChild(temp);
	}
</script>
</body>
</html>
  • 效果
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值