浅析原生JavaScript中拖拽属性draggable的使用

 更新时间:2024年03月07日 11:16:19   作者:ZL不懂前端  
这篇文章主要为大家详细介绍了原生JavaScript中拖拽属性draggable使用的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

定义和用法

draggable 属性规定元素是否可拖动。

提示: 链接和图像默认是可拖动的。

提示: draggable 属性经常用于拖放操作。

draggable 属性是 HTML5 新增的。

语法

<element draggable="true|false|auto">

属性值

描述
true规定元素是可拖动的。
false规定元素是不可拖动的。
auto使用浏览器的默认特性。

draggable属性的使用

draggable既然是拖放,那么主要是两个角色比较重要:

(1)被拖动的元素A

(2)A被拖动以后放置的元素B

举例

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .one{
      width: 100px;
      height: 100px;
      background-color: red;
    }
    .two{
      width: 200px;
      height: 200px;
      background-color: springgreen;
    }
  </style>
</head>
<body>
  <div class="one" draggable="true">11</div>
  <div class="two">22</div>
  <script>
  </script>
</body>
</html>

效果

现在有两个点:

(1)拖动的元素要赋予draggable属性,属性值为true。

(2)被拖进的元素要在dragover和dragenter事件值中阻止默认行为。

<div class="one" draggable="true">11</div>
<div class="two" ondragover="handleOndragover(event)" ondragenter="handleOndragenter(event)">22</div>
<script>
  function handleOndragover(e){
    e.preventDefault();
  }
  function handleOndragenter(e){
    e.preventDefault();
  }
</script>

此时A元素可以拖入到B元素里面,但是只是视觉效果上的,一旦松开鼠标,就恢复原状了

draggable属性的API

针对被拖拽元素A

(1)dragstart方法

该方法在按下鼠标并且移动鼠标时,会在A上触发该方法。同时鼠标的光标会变成禁用的样子,直到拖动到允许放置A的元素上,禁用的效果就会消失。

而允许放置A的元素,就是刚刚说的在dragover和dragenter中阻止默认行为

举例:当拖动A时,改变A元素的背景颜色为蓝色

<div class="one" draggable="true" ondragstart="handleOndragstart(event)">11</div>
<div class="two" ondragover="handleOndragover(event)" ondragenter="handleOndragenter(event)">22</div>
<script>
  function handleOndragstart(e){
    e.target.style.backgroundColor='blue';
  }
  function handleOndragover(e){
    e.preventDefault();
  }
  function handleOndragenter(e){
    e.preventDefault();
  }
</script>

(2)drag方法

该方法发生在dragstart之后,只要是在拖动过程之中,该方法就会持续触发

<div class="one" draggable="true" ondragstart="handleOndragstart(event)" ondrag="handleOndrag(event)">11</div>
<div class="two" ondragover="handleOndragover(event)" ondragenter="handleOndragenter(event)">22</div>
<script>
  function handleOndragstart(e){
    console.log('ondragstart');
  }
  function handleOndrag(e){
    console.log('ondrag');
  }
  function handleOndragover(e){
    e.preventDefault();
  }
  function handleOndragenter(e){
    e.preventDefault();
  }
</script>

(3)dragend方法

该方法是在拖动结束的时候触发,也就是当你拖拽后,松开鼠标的一瞬间触发

<div class="one" draggable="true" ondragstart="handleOndragstart(event)" ondrag="handleOndrag(event)" ondragend="handleOndragend(event)">11</div>
<div class="two" ondragover="handleOndragover(event)" ondragenter="handleOndragenter(event)">22</div>
<script>
  function handleOndragstart(e){
    console.log('ondragstart');
  }
  function handleOndrag(e){
    console.log('ondrag');
  }

  function handleOndragend(e){
    console.log('ondragend');
  }

  function handleOndragover(e){
    e.preventDefault();
  }
  function handleOndragenter(e){
    e.preventDefault();
  }
</script>

一般我们比较常用的方法就是dragstrat方法,通过在这个方法中将被推拽的元素进行保存下来,再进行后续的操作。

拖入元素B的事件

针对于拖入元素的事件,它不需要元素具有draggable属性,只要你想,任何元素使用这些方法都是可以的。但要记住上面所说的那两个方法,阻止事件默认行为。

(1)dragenter方法

该方法是指拖拽元素A,在拖入到B之中,B所触发的事件。当然,任何具有draggable属性为true的元素,拖入到B中,都会触发该事件。

<div class="one" draggable="true" ondragstart="handleOndragstart(event)" ondrag="handleOndrag(event)" ondragend="handleOndragend(event)">11</div>
<div class="two" ondragover="handleOndragover(event)" ondragenter="handleOndragenter(event)">22</div>
<script>
  function handleOndragstart(e){
    console.log('ondragstart');
  }
  function handleOndrag(e){
    console.log('ondrag');
  }

  function handleOndragend(e){
    console.log('ondragend');
  }

  function handleOndragover(e){
    e.preventDefault();
  }
  function handleOndragenter(e){
    console.log('ondragenter');
    e.preventDefault();
  }
</script>

切记,这里事件的触发不需要松开鼠标

举例: 当A拖入到B中,我们希望A是真正成为B的子元素:

<div class="one" draggable="true" ondragstart="handleOndragstart(event)" ondrag="handleOndrag(event)" ondragend="handleOndragend(event)">11</div>
<div class="two" ondragover="handleOndragover(event)" ondragenter="handleOndragenter(event)">22</div>
<script>
  function handleOndragstart(e) {
    console.log('ondragstart');
  }
  function handleOndrag(e) {
    console.log('ondrag');
  }

  function handleOndragend(e) {
    console.log('ondragend');
  }

  function handleOndragover(e) {
    e.preventDefault();
  }
  function handleOndragenter(e) {
    e.preventDefault();
    e.target.appendChild(document.querySelector('.one'))
  }
</script>

(2)dragover方法

该方法只要是,拖拽元素A在目标元素B中移动,就会持续触发。(就是如果A在B区域内悬浮,就会触发)

function handleOndragover(e) {
  e.preventDefault();
  console.log('ondragover');
}

(3)dragleave方法

该方法指的是拖拽元素A,在从目标元素B中离开的时候,会触发该方法

这里记住,一定是先进入到B,再离开B的时候触发该事件,也就是说要先触发dragenter方法,才能触发dragleave方法

function handleOndragleave(e){
  console.log('ondragleave');
}

(4)drop方法

该方法是指,拖拽元素A被放置了目标元素B中的时候触发,那它和dragenter方法的区别在于,该方法需要鼠标松开才会触发。而这个方法也是最常用的方法。

例: 当A拖入到B中,我们希望A是真正成为B的子元素:

function handleOndrop(e){
  console.log('ondrop');
  e.target.appendChild(document.querySelector('.one'))
}

总结

如果要实现拖放,需要具备以下条件

(1)拖动的元素要赋予draggable属性,属性值为true。

(2)最重要的三个事件:dragstart、dragover、drop

  • 被托动元素A需要设置draggable属性、dragstart事件
  • 拖入元素B需要设置dragover、drop事件
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .one {
      width: 100px;
      height: 100px;
      background-color: red;
    }

    .two {
      width: 200px;
      height: 200px;
      background-color: springgreen;
    }
  </style>
</head>

<body>
  <div class="one" draggable="true" ondragstart="handleOndragstart(event)">11</div>
  <div class="two" ondragover="handleOndragover(event)" ondrop="handleOndrop(event)">22</div>
  <script>
    function handleOndragstart(e){
      console.log(e);
    }
    function handleOndragover(e){
      e.preventDefault();
    }
    function handleOndrop(e){
      e.target.appendChild(document.querySelector('.one'))
    }
  </script>
</body>

</html>

到此这篇关于浅析原生JavaScript中拖拽属性draggable的使用的文章就介绍到这了,更多相关JavaScript拖拽属性draggable内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 给Function做的OOP扩展

    给Function做的OOP扩展

    自编框架Megami的一部分……现在发现自己实在太宅了…… 文件中出现的名字请对号入座……
    2009-05-05
  • 微信小程序实现加入购物车滑动轨迹

    微信小程序实现加入购物车滑动轨迹

    这篇文章主要为大家详细介绍了微信小程序实现加入购物车滑动轨迹,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 选择复选框按钮置灰否则按钮可用

    选择复选框按钮置灰否则按钮可用

    这篇文章主要介绍了使用js实现选择复选框按钮置灰否则按钮可用,需要的朋友可以参考下
    2014-05-05
  • 基于JavaScript实现动态创建表格和增加表格行数

    基于JavaScript实现动态创建表格和增加表格行数

    这篇文章主要介绍了基于JavaScript实现动态创建表格和增加表格行数的相关资料,需要的朋友可以参考下
    2015-12-12
  • JavaScript常用的返回,自动跳转,刷新,关闭语句汇总

    JavaScript常用的返回,自动跳转,刷新,关闭语句汇总

    这篇文章主要介绍了JavaScript常用的返回,自动跳转,刷新,关闭语句,实例汇总了常用的javascript技巧,非常具有实用价值,需要的朋友可以参考下
    2015-01-01
  • JS跳出循环的5种方法总结(return、break、continue、throw等)

    JS跳出循环的5种方法总结(return、break、continue、throw等)

    想必大家都遇到过循环遍历时遇到满足条件的时候就跳出循环这样的需求,于是整理了一篇各种循环是如何结束的,这篇文章主要给大家介绍了关于JS跳出循环的5种方法,分别是return、break、continue、throw等的相关资料,需要的朋友可以参考下
    2024-05-05
  • uniapp表单验证方法详解

    uniapp表单验证方法详解

    From表单组件具有数据收集、提交数据的功能,某种程度上说它就是一个容器,下面这篇文章主要给大家介绍了关于uniapp表单验证的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • 如何在TypeScript 中实现接口的类

    如何在TypeScript 中实现接口的类

    这篇文章主要介绍了TypeScript 中实现接口的类,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • JavaScript中闭包的4个有用技巧分享

    JavaScript中闭包的4个有用技巧分享

    当谈到JavaScript编程中的高级概念和技巧时,闭包(Closures)是一个重要而有趣的主题,闭包是一种函数与其创建时的词法环境的组合,它允许我们捕获和保留局部变量,并在函数之外使用它们,在这篇文章中,我们将深入探讨JavaScript中闭包的4种有用技巧
    2023-10-10
  • ajax java 实现自动完成功能

    ajax java 实现自动完成功能

    都知道百度建议是用ajax做的,想要做的快速稳定,可复制可移植就不容易了,花时间研究还不如自己来写。根据一个pdf文档提供的资料,用了小半天时间,终于实现了。在此与大家分享
    2012-12-12

最新评论