HTML5 元素拖动 - 实现元素左右拖动

1、拖放(Drag 和 drop)是 HTML5 标准的组成部分。


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

  浏览器支持:Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari 5 支持拖放(注:在 Safari 5.1.2 中不支持拖放)。


  2、相关属性及方法

  设置元素为可拖放,把 draggable 属性设置为 true

1 <label class="move" draggable="true" id="index1">index1</label>

  设置元素被拖动时触发的事件 ondragstart

1 <label class="move" draggable="true" ondragstart="drag(event)" id="index1">index1</label>

  放到何处 - ondragover ,以div 为例:

1 <div id="right" ondragover="dragover(event)">...</div>

  进行放置 - ondrop,以div 为例:

1 <div id="right" ondragover="dragover(event)" ondrop="drop(event)">...</div>

  3、实现一个简单的 从左向右拖动元素,从右向左拖动元素,比较简陋。

  html:

  拖动元素的方法,未在元素上进行绑定,均在 js 里进行绑定

01 <!--左边元素框-->
02 <div id="left">
03     <label class="move" draggable="true" id="index1">index1</label>
04     <label class="move" draggable="true" id="index2">index2</label>
05     <label class="move" draggable="true" id="index3">index3</label>
06     <label class="move" draggable="true" id="index4">index4</label>
07     <label class="move" draggable="true" id="index5">index5</label>
08     <label class="move" draggable="true" id="index6">index6</label>
09     <label class="move" draggable="true" id="index7">index7</label>
10 </div>
11 <!--右边元素框-->
12 <div id="right">
13 </div>

  javascript:

  动态给 label元素 加上被拖动事件

1 var len = document.getElementsByClassName('move').length;
2 for (var i = 0; i < len; i++) {
3     document.getElementsByClassName('move').item(i).ondragstart = function (ev) {
4         //dataTransfer.setData() 方法设置被拖数据的数据类型和值
5         ev.dataTransfer.setData("Text", ev.target.id);
6     };
7 }

  设置左边-〉右边拖动

01 document.getElementById('right').ondragover = function (ev) {
02         //只接受从左边拖动到右边的元素,不接受自己元素框中元素拖动
03         if (ev.target.id == 'right') {
04             ev.preventDefault(); //阻止向上冒泡
05         }
06     }
07  
08     document.getElementById('right').ondrop = function (ev) {
09         ev.preventDefault();
10         var id = ev.dataTransfer.getData('Text');
11         if (document.getElementById(id).parentElement.id == 'left') {
12             ev.target.appendChild(document.getElementById(id));
13         }
14     }

  设置右边-〉左边拖动

01 document.getElementById('left').ondragover = function (ev) {
02         //只接受从右边拖动到左边的元素,不接受自己元素框中元素拖动
03         if (ev.target.id == 'left') {
04             ev.preventDefault(); //阻止向上冒泡
05         }
06     }
07     document.getElementById('left').ondrop = function (ev) {
08         ev.preventDefault();
09         var id = ev.dataTransfer.getData('Text');
10         if (document.getElementById(id).parentElement.id == 'right') {
11             ev.target.appendChild(document.getElementById(id));
12         }
13     }

  代码解释:

  •   ondragover 默认地,无法将数据/元素放置到其他元素中。如果需要设置允许放置,我们必须阻止对元素的默认处理方式。
  •   调用 preventDefault() 来避免浏览器对数据的默认处理(drop 事件的默认行为是以链接形式打开)
  •   通过 dataTransfer.getData("Text") 方法获得被拖的数据。该方法将返回在 setData() 方法中设置为相同类型的任何数据。

  源代码:

01 1<!DOCTYPE html>
02  2 <html>
03  3 <head lang="en">
04  4     <meta charset="UTF-8">
05  5     <title>拖动</title>
06  6     <style>
07  7         #left,#right,#center{
08  8             float:left;
09  9             border:1px solid #ccc;
10 10             width:100px;
11 11             padding:10px;
12 12             text-align: center;
13 13             margin-left: 100px;
14 14             height:200px;
15 15             overflow-y: auto;
16 16         }
17 17         #left label,#right label{
18 18             width:100%;
19 19             display: block;
20 20             padding:3px;
21 21             font-size: 20px;
22 22         }
23 23
24 24     </style>
25 25 </head>
26 26 <body>
27 27 <h2><mark>拖放(Drag 和 drop)</mark></h2>
28 28 <!--左边元素框-->
29 29 <div id="left">
30 30     <label class="move" draggable="true" id="index1">index1</label>
31 31     <label class="move" draggable="true" id="index2">index2</label>
32 32     <label class="move" draggable="true" id="index3">index3</label>
33 33     <label class="move" draggable="true" id="index4">index4</label>
34 34     <label class="move" draggable="true" id="index5">index5</label>
35 35     <label class="move" draggable="true" id="index6">index6</label>
36 36     <label class="move" draggable="true" id="index7">index7</label>
37 37 </div>
38 38 <!--右边元素框-->
39 39 <div id="right">
40 40 </div>
41 41 <script>
42 42     $(document).ready(function () {
43 43         var len = document.getElementsByClassName('move').length;
44 44         for (var i = 0; i < len; i++) {
45 45             document.getElementsByClassName('move').item(i).ondragstart = function (ev) {
46 46                 //dataTransfer.setData() 方法设置被拖数据的数据类型和值
47 47                 ev.dataTransfer.setData("Text", ev.target.id);
48 48             };
49 49         }
50 50     });
51 51
52 52     //左-〉右
53 53     document.getElementById('right').ondragover = function (ev) {
54 54         //只接受从左边拖动到右边的元素,不接受自己元素框中元素拖动
55 55         if (ev.target.id == 'right') {
56 56             ev.preventDefault(); //阻止向上冒泡
57 57         }
58 58     }
59 59     document.getElementById('right').ondrop = function (ev) {
60 60         ev.preventDefault();
61 61         var id = ev.dataTransfer.getData('Text');
62 62         if (document.getElementById(id).parentElement.id == 'left') {
63 63             ev.target.appendChild(document.getElementById(id));
64 64         }
65 65     }
66 66
67 67
68 68     //右-〉左
69 69     document.getElementById('left').ondragover = function (ev) {
70 70         //只接受从右边拖动到左边的元素,不接受自己元素框中元素拖动
71 71         if (ev.target.id == 'left') {
72 72             ev.preventDefault(); //阻止向上冒泡
73 73         }
74 74     }
75 75     document.getElementById('left').ondrop = function (ev) {
76 76         ev.preventDefault();
77 77         var id = ev.dataTransfer.getData('Text');
78 78         if (document.getElementById(id).parentElement.id == 'right') {
79 79             ev.target.appendChild(document.getElementById(id));
80 80         }
81 81     }
82 82
83 83
84 84
85 85
86 86 </script>
87 87 </body>
88 88 </html>
89  
90 View Code


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值