• HTML5实现拖放


    一、HTML5 拖放(Drag 和 Drop)

          拖放是一种常见的特性,即抓取对象以后拖到另一个位置。在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放。

    二、实现过程

        1、设置元素为可拖放:为了使元素可拖动,把 draggable 属性设置为 true ,例如:

    <img draggable="true">

        2、拖动什么 - ondragstart 和 setData():规定当元素被拖动时,会发生什么。

                      ondragstart事件调用了一个函数,它规定了被拖动的数据

    1. document.ondragstart = function(e){
    2. e.dataTransfer.setData('text',e.target.id) //存储数据
    3. e.target.style.opacity = 0.5
    4. console.log(e.target.id)
    5. }

          dataTransfer:实现数据的存储和获取 ​ setData(format,data) 存储数据 ​

                  format参数:数据类型(text/html、text/url-list) ​

                  data参数:数据。一般是字符串

          3、放到何处 - ondragover

            ondragover 事件规定在何处放置被拖动的数据。默认地,无法将数据/元素放置到其他元素中。如果需要设置允许放置,我们必须阻止对元素的默认处理方式。这要通过调用 ondragover 事件的 event.preventDefault() 方法(即:浏览器会默认阻止ondrop事件,所以必须在ondragover事件中阻止默认行为)

    1. document.ondragover = function(e){
    2. e.preventDefault()
    3. }

          4、进行放置 - ondrop:当放置被拖数据时,会触发 drop 事件。

    • 通过 dataTransfer.getData("Text") 方法获得被拖的数据。该方法将返回在 setData() 方法中设置为相同类型的任何数据。

    • 被拖数据是被拖元素的 id ("drag1")

    • 把被拖元素追加到放置元素(目标元素)中

    1. document.ondrop = function(e){
    2. console.log(e)
    3. //通过e.dataTransfer.setData存储的数据只能在ondrop事件中获取
    4. var data = e.dataTransfer.getData('text')
    5. e.target.appendChild(document.getElementById(data))
    6. }

     三、拖拽元素支持的事件

          1、ondrag:应用于拖拽元素,在整个拖拽过程中都会调用

          2、ondragstart:应用于拖拽元素,当拖拽开始时调用

          3、ondragleave:应用于拖拽元素,当鼠标离开拖拽元素时调用

          4、ondragend:应用于拖拽元素,当拖拽结束时调用

    四、目标元素支持的事件

         1、ondragenter:应用于目标元素,当拖拽元素进入时调用

         2、ondragover:应用于目标元素,当停留在目标元素上方时调用

         3、ondrop:应用于目标元素,当在目标元素上方松开鼠标时调用

         4、ondragleave:应用于目标元素,当鼠标离开目标元素时调用

    五、示例

         1、html页面

    1. <div id="div1" class="div1">
    2. <p id="pe3" class="p3" draggable="true">3p>
    3. <p id="pe2" class="p2" draggable="true">2p>
    4. <p id="pe5" class="p5" draggable="true">5p>
    5. <p id="pe1" class="p1" draggable="true">1p>
    6. <p id="pe6" class="p6" draggable="true">6p>
    7. <p id="pe4" class="p4" draggable="true">4p>
    8. <a href="http://www.baidu.com" id="a1">百度一下a>
    9. div>
    10. <div id="div2" class="div2">div>
    11. <div id="div3" class="div3">div>

           2、CSS代码

    1. *{
    2. padding: 0;
    3. margin: 0;
    4. }
    5. .div1,.div2,.div3{
    6. margin: 0 20px;
    7. float: left;
    8. width: 200px;
    9. height: 220px;
    10. border: 1px solid #ccc;
    11. }
    12. div{
    13. display: flex;
    14. flex-direction: column;
    15. align-items: center;
    16. }
    17. p{
    18. display: flex;
    19. flex-direction: column;
    20. align-items: center;
    21. }
    22. .p1{
    23. width: 50px;
    24. background-color: pink;
    25. margin: 5px 0;
    26. }
    27. .p2{
    28. width: 80px;
    29. background-color: burlywood;
    30. margin: 5px 0;
    31. }
    32. .p3{
    33. width: 110px;
    34. background-color: rgb(133, 88, 29);
    35. margin: 5px 0;
    36. }
    37. .p4{
    38. width: 140px;
    39. background-color: rgb(172, 39, 48);
    40. margin: 5px 0;
    41. }
    42. .p5{
    43. width: 170px;
    44. background-color: rgb(17, 182, 31);
    45. margin: 5px 0;
    46. }
    47. .p6{
    48. width: 200px;
    49. background-color: rgb(90, 33, 155);
    50. margin: 5px 0;
    51. }

                3、javascript代码

    1. document.ondragstart = function(e){
    2. /*
    3. dataTransfer:实现数据的存储和获取
    4. setData(format,data) 存储数据
    5. format参数:数据类型(text/html、text/url-list)
    6. data参数:数据。一般是字符串
    7. */
    8. e.dataTransfer.setData('text',e.target.id) //存储数据
    9. e.target.style.opacity = 0.5
    10. console.log(e.target.id)
    11. }
    12. document.ondragend = function(e){
    13. e.target.style.opacity = 1
    14. }
    15. /*
    16. 浏览器会默认阻止ondrop事件,所以必须在ondragover事件中阻止默认行为
    17. */
    18. document.ondragover = function(e){
    19. e.preventDefault()
    20. }
    21. document.ondrop = function(e){
    22. console.log(e)
    23. //通过e.dataTransfer.setData存储的数据只能在ondrop事件中获取
    24. var data = e.dataTransfer.getData('text')
    25. e.target.appendChild(document.getElementById(data))
    26. }

  • 相关阅读:
    Linux开发工具之文本编译器vim
    【系统分析师之路】第七章 复盘系统设计(面向服务开发方法)
    《程序员的七堂课》读书笔记2
    全栈的自我修养 ———— js中的拖拽api
    探索C++在软件开发中的应用
    apache和nginx的TLS1.0和TLS1.1禁用处理方案
    关于代码混淆,看这篇就够了
    Hugging Face 分词器新增聊天模板属性
    手撕代码——任意奇数分频
    OpenSea爬取Nft详情全部数据实战
  • 原文地址:https://blog.csdn.net/m0_37911706/article/details/127121060