HTML 5实现的图片拖拽分组效果

开发 前端
基本目前所有的现代浏览器(Firefox,Chrome,Safari,或者Opera)都支持这个实用的功能。这意味着我们可以考虑在我们的项目和网站中使用这个功能。更重要的是代码编写非常简单。

分享一个HTML5的drag drop API实现的图片拖拽分组效果

在线演示 本地下载

今天我们介绍HTML5的拖拽功能。基本目前所有的现代浏览器(Firefox,Chrome,Safari,或者Opera)都支持这个实用的功能。这意味着我们可以考虑在我们的项目和网站中使用这个功能。更重要的是代码编写非常简单。我们这里将使用拖拽API开发一个图片的分组排序功能 ,希望能够给大家比较直观的使用感受。希望大家喜欢!

HTML标签

  1. <div> 
  2.     <div id="drop_1" droppable="true"><h2>Album 1</h2></div> 
  3.     <div id="drop_2" droppable="true"><h2>Album 1</h2></div> 
  4.     <div id="drop_3" droppable="true"><h2>Album 3</h2></div> 
  5. </div> 
  6. <div style="clear:both"></div> 
  7. <div> 
  8.     <a id="1" draggable="true"><img src="images/1.jpg"></a> 
  9.     <a id="2" draggable="true"><img src="images/2.jpg"></a> 
  10.     <a id="3" draggable="true"><img src="images/3.jpg"></a> 
  11.     <a id="4" draggable="true"><img src="images/4.jpg"></a> 
  12.     <a id="5" draggable="true"><img src="images/5.jpg"></a> 
  13.     <a id="6" draggable="true"><img src="images/6.jpg"></a> 
  14.     <a id="7" draggable="true"><img src="images/7.jpg"></a> 
  15.     <a id="8" draggable="true"><img src="images/8.jpg"></a> 
  16.     <a id="9" draggable="true"><img src="images/9.jpg"></a> 
  17.     <a id="10" draggable="true"><img src="images/10.jpg"></a> 
  18.     <a id="11" draggable="true"><img src="images/11.jpg"></a> 
  19.     <a id="12" draggable="true"><img src="images/12.jpg"></a> 
  20. </div> 
  21. <script src="js/main.js"></script> 

你可以看到这里我们设定了3个开放的drop对象和12个图片。我们将可drop的区域使用属性droppable来标示,并且将可drag的对象用draggable来标示。

CSS代码

接下来我们设置页面的样式。

  1. /* Photo Gallery styles */ 
  2. .gallery {  
  3.     margin50px auto 0;  
  4.     width840px;  
  5. }  
  6. .gallery a {  
  7.     display: inline-block;  
  8.     height135px;  
  9.     margin10px;  
  10.     opacity: 1;  
  11.     positionrelative;  
  12.     width180px;  
  13.  
  14.     -khtml-user-drag: element;  
  15.  
  16.     /* CSS3 Prevent selections */ 
  17.     -moz-user-select: none;  
  18.     -webkit-user-select: none;  
  19.     -khtml-user-select: none;  
  20.     user-select: none;  
  21.  
  22.     /* CSS3 transition rules */ 
  23.     -webkit-transition: all 0.5s ease;  
  24.     -moz-transition: all 0.5s ease;  
  25.     -o-transition: all 0.5s ease;  
  26.     transition: all 0.5s ease;  
  27. }  
  28. .gallery a img {  
  29.     border8px solid #fff;  
  30.     border-bottom20px solid #fff;  
  31.     cursorpointer;  
  32.     displayblock;  
  33.     height100%;  
  34.     left: 0px;  
  35.     positionabsolute;  
  36.     top: 0px;  
  37.     width100%;  
  38.     z-index1;  
  39.  
  40.     /* CSS3 Box sizing property */ 
  41.     -moz-box-sizing: border-box;  
  42.     -webkit-box-sizing: border-box;  
  43.     -o-box-sizing: border-box;  
  44.     box-sizing: border-box;  
  45.  
  46.     /* CSS3 transition rules */ 
  47.     -webkit-transition: all 0.5s ease;  
  48.     -moz-transition: all 0.5s ease;  
  49.     -o-transition: all 0.5s ease;  
  50.     transition: all 0.5s ease;  
  51.  
  52.     /* CSS3 Box Shadow */ 
  53.     -moz-box-shadow: 2px 2px 4px #444;  
  54.     -webkit-box-shadow: 2px 2px 4px #444;  
  55.     -o-box-shadow: 2px 2px 4px #444;  
  56.     box-shadow: 2px 2px 4px #444;  
  57. }  
  58.  
  59. /* Custom CSS3 rotate transformation */ 
  60. .gallery a:nth-child(1) img {  
  61.     -moz-transform: rotate(-25deg);  
  62.     -webkit-transform: rotate(-25deg);  
  63.     transform: rotate(-25deg);  
  64. }  
  65. .gallery a:nth-child(2) img {  
  66.     -moz-transform: rotate(-20deg);  
  67.     -webkit-transform: rotate(-20deg);  
  68.     transform: rotate(-20deg);  
  69. }  
  70. .gallery a:nth-child(3) img {  
  71.     -moz-transform: rotate(-15deg);  
  72.     -webkit-transform: rotate(-15deg);  
  73.     transform: rotate(-15deg);  
  74. }  
  75. .gallery a:nth-child(4) img {  
  76.     -moz-transform: rotate(-10deg);  
  77.     -webkit-transform: rotate(-10deg);  
  78.     transform: rotate(-10deg);  
  79. }  
  80. .gallery a:nth-child(5) img {  
  81.     -moz-transform: rotate(-5deg);  
  82.     -webkit-transform: rotate(-5deg);  
  83.     transform: rotate(-5deg);  
  84. }  
  85. .gallery a:nth-child(6) img {  
  86.     -moz-transform: rotate(0deg);  
  87.     -webkit-transform: rotate(0deg);  
  88.     transform: rotate(0deg);  
  89. }  
  90. .gallery a:nth-child(7) img {  
  91.     -moz-transform: rotate(5deg);  
  92.     -webkit-transform: rotate(5deg);  
  93.     transform: rotate(5deg);  
  94. }  
  95. .gallery a:nth-child(8) img {  
  96.     -moz-transform: rotate(10deg);  
  97.     -webkit-transform: rotate(10deg);  
  98.     transform: rotate(10deg);  
  99. }  
  100. .gallery a:nth-child(9) img {  
  101.     -moz-transform: rotate(15deg);  
  102.     -webkit-transform: rotate(15deg);  
  103.     transform: rotate(15deg);  
  104. }  
  105. .gallery a:nth-child(10) img {  
  106.     -moz-transform: rotate(20deg);  
  107.     -webkit-transform: rotate(20deg);  
  108.     transform: rotate(20deg);  
  109. }  
  110. .gallery a:nth-child(11) img {  
  111.     -moz-transform: rotate(25deg);  
  112.     -webkit-transform: rotate(25deg);  
  113.     transform: rotate(25deg);  
  114. }  
  115. .gallery a:nth-child(12) img {  
  116.     -moz-transform: rotate(30deg);  
  117.     -webkit-transform: rotate(30deg);  
  118.     transform: rotate(30deg);  
  119. }  
  120. .gallery a:hover img {  
  121.     z-index5;  
  122.  
  123.     /* CSS3 transition rules */ 
  124.     -webkit-transition: all 0.5s ease;  
  125.     -moz-transition: all 0.5s ease;  
  126.     -o-transition: all 0.5s ease;  
  127.     transition: all 0.5s ease;  
  128.  
  129.     /* CSS3 transform rules */ 
  130.     -moz-transform: rotate(0deg);  
  131.     -webkit-transform: rotate(0deg);  
  132.     -o-transform: rotate(0deg);  
  133.     transform: rotate(0deg);  
  134. }  
  135. .gallery a.hidden {  
  136.     height0;  
  137.     margin0;  
  138.     opacity: 0;  
  139.     width0;  
  140. }  
  141. .albums {  
  142.     margin40px auto 0;  
  143.     overflowhidden;  
  144.     width840px;  
  145. }  
  146. .album {  
  147.     border3px dashed #ccc;  
  148.     floatleft;  
  149.     margin10px;  
  150.     min-height100px;  
  151.     padding10px;  
  152.     width220px;  
  153.  
  154.     /* CSS3 transition rules */ 
  155.     -webkit-transition: all 1.0s ease;  
  156.     -moz-transition: all 1.0s ease;  
  157.     -o-transition: all 1.0s ease;  
  158.     transition: all 1.0s ease;  
  159. }  
  160. .album a {  
  161.     display: inline-block;  
  162.     height56px;  
  163.     margin15px;  
  164.     opacity: 1;  
  165.     positionrelative;  
  166.     width75px;  
  167.  
  168.     -khtml-user-drag: element;  
  169.     -webkit-user-drag: element;  
  170.     -khtml-user-select: none;  
  171.     -webkit-user-select: none;  
  172.  
  173.     /* CSS3 Prevent selections */ 
  174.     -moz-user-select: none;  
  175.     -webkit-user-select: none;  
  176.     -khtml-user-select: none;  
  177.     user-select: none;  
  178.  
  179.     /* CSS3 transition rules */ 
  180.     -webkit-transition: all 0.5s ease;  
  181.     -moz-transition: all 0.5s ease;  
  182.     -o-transition: all 0.5s ease;  
  183.     transition: all 0.5s ease;  
  184. }  
  185. .album a img {  
  186.     border4px solid #fff;  
  187.     border-bottom10px solid #fff;  
  188.     cursorpointer;  
  189.     displayblock;  
  190.     height100%;  
  191.     left: 0px;  
  192.     positionabsolute;  
  193.     top: 0px;  
  194.     width100%;  
  195.     z-index1;  
  196.  
  197.     /* CSS3 Box sizing property */ 
  198.     -moz-box-sizing: border-box;  
  199.     -webkit-box-sizing: border-box;  
  200.     -o-box-sizing: border-box;  
  201.     box-sizing: border-box;  
  202.  
  203.     /* CSS3 transition rules */ 
  204.     -webkit-transition: all 0.5s ease;  
  205.     -moz-transition: all 0.5s ease;  
  206.     -o-transition: all 0.5s ease;  
  207.     transition: all 0.5s ease;  
  208.  
  209.     /* CSS3 Box Shadow */ 
  210.     -moz-box-shadow: 2px 2px 4px #444;  
  211.     -webkit-box-shadow: 2px 2px 4px #444;  
  212.     -o-box-shadow: 2px 2px 4px #444;  
  213.     box-shadow: 2px 2px 4px #444;  
  214. }  

#p#

Javascript代码

  1. // add event handler  
  2. var addEvent = (function () {  
  3.   if (document.addEventListener) {  
  4.     return function (el, type, fn) {  
  5.       if (el && el.nodeName || el === window) {  
  6.         el.addEventListener(type, fn, false);  
  7.       } else if (el && el.length) {  
  8.         for (var i = 0; i < el.length; i++) {  
  9.           addEvent(el[i], type, fn);  
  10.         }  
  11.       }  
  12.     };  
  13.   } else {  
  14.     return function (el, type, fn) {  
  15.       if (el && el.nodeName || el === window) {  
  16.         el.attachEvent('on' + type, function () { return fn.call(el, window.event); });  
  17.       } else if (el && el.length) {  
  18.         for (var i = 0; i < el.length; i++) {  
  19.           addEvent(el[i], type, fn);  
  20.         }  
  21.       }  
  22.     };  
  23.   }  
  24. })();  
  25.  
  26. // inner variables  
  27. var dragItems;  
  28. updateDataTransfer();  
  29. var dropAreas = document.querySelectorAll('[droppable=true]');  
  30.  
  31. // preventDefault (stops the browser from redirecting off to the text)  
  32. function cancel(e) {  
  33.   if (e.preventDefault) {  
  34.     e.preventDefault();  
  35.   }  
  36.   return false;  
  37. }  
  38.  
  39. // update event handlers  
  40. function updateDataTransfer() {  
  41.     dragItems = document.querySelectorAll('[draggable=true]');  
  42.     for (var i = 0; i < dragItems.length; i++) {  
  43.         addEvent(dragItems[i], 'dragstart'function (event) {  
  44.             event.dataTransfer.setData('obj_id'this.id);  
  45.             return false;  
  46.         });  
  47.     }  
  48. }  
  49.  
  50. // dragover event handler  
  51. addEvent(dropAreas, 'dragover'function (event) {  
  52.     if (event.preventDefault) event.preventDefault();  
  53.  
  54.     // little customization  
  55.     this.style.borderColor = "#000";  
  56.     return false;  
  57. });  
  58.  
  59. // dragleave event handler  
  60. addEvent(dropAreas, 'dragleave'function (event) {  
  61.     if (event.preventDefault) event.preventDefault();  
  62.  
  63.     // little customization  
  64.     this.style.borderColor = "#ccc";  
  65.     return false;  
  66. });  
  67.  
  68. // dragenter event handler  
  69. addEvent(dropAreas, 'dragenter', cancel);  
  70.  
  71. // drop event handler  
  72. addEvent(dropAreas, 'drop'function (event) {  
  73.     if (event.preventDefault) event.preventDefault();  
  74.  
  75.     // get dropped object  
  76.     var iObj = event.dataTransfer.getData('obj_id');  
  77.     var oldObj = document.getElementById(iObj);  
  78.  
  79.     // get its image src  
  80.     var oldSrc = oldObj.childNodes[0].src;  
  81.     oldObj.className += 'hidden';  
  82.  
  83.     var oldThis = this;  
  84.  
  85.     setTimeout(function() {  
  86.         oldObj.parentNode.removeChild(oldObj); // remove object from DOM  
  87.  
  88.         // add similar object in another place  
  89.         oldThis.innerHTML += '<a id="'+iObj+'" draggable="true"><img src="'+oldSrc+'" /></a>';  
  90.  
  91.         // and update event handlers  
  92.         updateDataTransfer();  
  93.  
  94.         // little customization  
  95.         oldThis.style.borderColor = "#ccc";  
  96.     }, 500);  
  97.  
  98.     return false;  
  99. });  

可以看到以上代码并不复杂。开始我们选择所有的可拖放的元素。然后将’dragstart’事件绑定到所有的draggable元素上,这样讲数据设定到dataTransfer对象中。对于所有的droppable区域我们绑定这些事件:’dragover’,'dragleave’和’drop’。针对前两个方法我们执行一个小的CSS自定义来激活drop区域。当我们放置可拖放的元素的时候,我们的脚本会复制可拖放元素并且将它们放置到活动的droppable区域(即相册),并且删除那个dropped元素。最后我们更新事件处理。

希望大家喜欢这个HTML5的图片拖放展示效果。

原文链接:http://www.mhtml5.com/2012/05/4941.html

【编辑推荐】

  1. HTML 5开发RPG游戏之一(地图人物实现)
  2. HTML 5开发RPG游戏之二(跑起来吧英雄)
  3. HTML 5开发RPG游戏之三(卷轴和对话)
  4. HTML 5开发RPG游戏之四(游戏脚本化)
  5. HTML 5游戏开发实用建议
责任编辑:张伟 来源: HTML5研究小组
相关推荐

2012-04-24 09:48:49

HTML5

2012-06-04 14:47:42

HTML5

2012-05-09 14:49:23

HTML5

2012-06-13 10:49:23

PHP

2011-02-23 11:22:59

DojoHTML 5

2011-02-25 10:19:23

ibmdwHTML5Web开发

2011-08-18 09:05:50

HTML 5

2011-07-19 13:07:26

iOS4 HTML5 动画

2011-03-02 13:15:26

HTML 5jQuery

2021-08-27 08:38:10

CSS 技巧 resize

2011-08-19 09:15:01

HTML 5

2012-06-13 14:19:27

2013-06-06 10:42:25

2020-12-09 07:54:17

Vue插件鼠标

2011-07-08 15:08:16

iPhone 图片

2013-07-02 09:17:57

html5组件

2022-02-17 17:05:31

OpenHarmonWEB前端鸿蒙

2012-06-08 14:32:13

HTML5

2015-03-05 09:54:28

效果惊艳HTML5应用和源码

2011-05-30 13:23:11

Android 动画
点赞
收藏

51CTO技术栈公众号