javascript实现拖曳与拖放图片

其实对于drag和drop拖曳与拖放事件IE很早以前就支持这个操作了,我们先来看看HTML5中新增的拖放API。

在HTML5中想要实现拖放操作,至少要做以下操作:

1. 将要拖放的对象元素的draggable属性设置为true,即(draggable="true"),这样才能拖放该元素,且img元素与a元素(必须指定href)默认允许拖放操作。如代码:

<li draggable="true">Item 1</li>

2. 编写与拖放有关的事件处理代码,有以下事件需要我们知道的。如下:

1): dragstart: 当拖拽元素开始被拖拽的时候触发的事件,此事件作用在被拖曳元素上.

2): drag: 拖放过程中触发的事件,此事件作用在被拖放到元素上。

3): dragenter: 拖放元素进入目标元素触发的事件,此事件作用在目标元素上。

4): dragover: 拖拽元素在目标元素上移动的时候触发的事件,此事件作用在目标元素上.

5): dragleave: 被拖放到元素离开目标元素的时候,此事件作用在目标元素上。

6): drop: 有其他元素被拖放到目标元素上,此事件作用在目标元素上。

7): dragend: 拖放操作结束:此事件作用在拖放元素上。

3. DataTransfer对象:

先了解这些内容对于我们现在这个demo来说已经够了!具体的想多了解可以去看看HTML5中的拖放与拖曳API。

我们可以先来看看JSFiddler中的效果:

你可以狠狠的点击这里: javascript实现拖放与拖曳图片的DEMO

所有的JS代码如下:

* javascript拖放元素 function Sortable(cfg){ this .cfg = $.extend({},defaults,cfg || {}); this ._init(); $.extend(Sortable.prototype,{ // 函数初始化 _init: function (){ var self = this ; var cfg = self.cfg; if (cfg.container == null ) { return ;} var placeholders = $(), dragging; // 该容器下的子元素 $(cfg.container).each( function (index,curItem){ var items = $(curItem).children(); var placeholder = $('<' + items[0].tagName + ' class="sortable-placeholder">' ); placeholders = placeholders.add(placeholder); items.attr( "draggable","true").on('dragstart', function (e){ var dt = e.originalEvent.dataTransfer; dt.effectAllowed = 'move' ; index = (dragging = $( this )).index(); }).on( 'dragend', function (e){ dragging.fadeIn(); placeholders.detach(); }).not( 'a[href], img').on('selectstart', function () { // 禁止鼠标选中文字 this .dragDrop && this .dragDrop(); return false ; }).end().add([ this , placeholder]).on("dragover dragenter drop", function (e){ if (e.type == 'drop' ) { e.stopPropagation(); placeholders.filter( ':visible' ).after(dragging); return false ; e.preventDefault(); e.originalEvent.dataTransfer.dropEffect = 'move' ; if (items.is( this )) { dragging.hide(); $( this )[placeholder.index() < $( this ).index() ? 'after' : 'before' ](placeholder); placeholders.not(placeholder).detach(); return false ; var defaults = { container : null

代码初始化如下:

new Sortable({
    "container": '.demoList'

container:是指要拖放的容器。其他任何操作不需要,html代码还是和往常一样书写,至于draggable="true"这个属性,JS里面会自动为当前容器的子元素增加这个属性,所以对于使用者可以不用关心这些细节的操作;比如上面的demo HTML代码 可以和往常一样写:

如HTML代码如下:

<ul class="connected list">
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
    <li>Item 4</li>
    <li>Item 5</li>
    <li>Item 6</li>

加上CSS如下:

h1, h2 {
    text-align: center;
    font-weight: normal;
.connected li, .sortable li{
    list-style: none;
    border: 1px solid #CCC;
    background: #F6F6F6;
    font-family: "Tahoma";
    color: #1C94C4;
    margin: 5px;
    padding: 5px;
    height: 22px;
li.highlight {
    background: #FEE25F;
.connected {
    float: left;
    width: 200px;
.connected.no2 {
    float: right;
li.sortable-placeholder {
    border: 1px dashed #CCC;
    background: none;

复制上面的JS,然后代码初始化就这样,就ok了 如下初始化:

new Sortable({
    "container": '.connected'

demo下载