div拉拽

*{
margin: 0;
padding: 0;
}
.cl {
width: 100%;
margin: 0 auto;
font-family: arial, SimSun;
font-size: 0;
}

        .cl .item {
            display: inline-block;
            width: 33%;
            margin: 0 0.33% 0 0;
            background-color: #ccc;
        }
        
        .cl .item1 {
            background-color: #1faeff;
        }
        
        .cl .item2 {
            background-color: #ff2e12;
        }
        
        .cl .item3 {
            background-color: #00c13f;
        }
        
        .cl .h4 {
            margin: 0;
            padding: 0.5rem;
            border-bottom: 1px solid #ccc;
            font-size: 0.75rem;
            color: #fff;
        }
        
        .cl span {
            display: block;
            line-height: 100px;
            font-size: 2rem;
            text-align: center;
            color: #fff;
        }

.dad-noSelect,.dad-noSelect *{
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
cursor: -webkit-grabbing !important;
cursor: -moz-grabbing !important;
}

.dad-container{
position: relative;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.dad-container::after{
content: '';
clear: both !important;
display: block;
}
.dad-active .dad-draggable-area{
cursor: -webkit-grab;
cursor: -moz-grab;
}
.dads-children-clone{
opacity: 0.8;
z-index: 9999;
pointer-events: none;
}
.dads-children-placeholder{
overflow: hidden;
position: absolute !important;
box-sizing: border-box;
border:4px dashed #639BF6;
margin:5px;
text-align: center;
color: #639BF6;
font-weight: bold;
}

/*!

  • jquery.dad.js v1 (http://konsolestudio.com/dad)

  • Author William Lima
    */
    (function($) {
    "use strict";

    function O_dad() {
    var self = this;
    this.x = 0;
    this.y = 0;
    this.target = false;
    this.clone = false;
    this.placeholder = false;
    this.cloneoffset = {
    x: 0,
    y: 0
    };
    this.move = function(e) {
    self.x = e.pageX;
    self.y = e.pageY;
    if(self.clone != false && self.target != false) {
    self.clone.css({
    top: self.y - self.cloneoffset.y,
    left: self.x - self.cloneoffset.x
    })
    } else {}
    };
    (window).on('mousemove', function(e) { self.move(e) }) }.prototype.dad = function(opts) {
    var me, defaults, options;
    me = this;
    defaults = {
    target: '>div',
    draggable: false,
    //空白提示drop here
    placeholder: ' ',
    callback: false,
    containerClass: 'dad-container',
    childrenClass: 'dads-children',
    cloneClass: 'dads-children-clone',
    active: true
    };
    options = .extend({}, defaults, opts);(this).each(function() {
    var mouse, target, dragClass, active, callback, placeholder, daddy, childrenClass, jQclass, cloneClass;
    mouse = new O_dad();
    active = options.active;
    daddy = (this); if(!daddy.hasClass('dad-active') && active == true) daddy.addClass('dad-active'); childrenClass = options.childrenClass; cloneClass = options.cloneClass; jQclass = '.' + childrenClass; daddy.addClass(options.containerClass); target = daddy.find(options.target); placeholder = options.placeholder; callback = options.callback; dragClass = 'dad-draggable-area'; me.addDropzone = function(selector, func) {(selector).on('mouseenter', function() {
    if(mouse.target != false) {
    mouse.placeholder.css({
    display: 'none'
    });
    mouse.target.css({
    display: 'none'
    });
    (this).addClass('active') } }).on('mouseup', function() { if(mouse.target != false) { mouse.placeholder.css({ display: 'block' }); mouse.target.css({ display: 'block' }); func(mouse.target); dad_end() }(this).removeClass('active')
    }).on('mouseleave', function() {
    if(mouse.target != false) {
    mouse.placeholder.css({
    display: 'block'
    });
    mouse.target.css({
    display: 'block'
    })
    }
    (this).removeClass('active') }) }; me.getPosition = function() { var positionArray = [];(this).find(jQclass).each(function() {
    positionArray[(this).attr('data-dad-id')] = parseInt((this).attr('data-dad-position'))
    });
    return positionArray
    };
    me.activate = function() {
    active = true;
    if(!daddy.hasClass('dad-active')) {
    daddy.addClass('dad-active')
    }
    return me
    };
    me.deactivate = function() {
    active = false;
    daddy.removeClass('dad-active');
    return me
    };
    (document).on('mouseup', function() { dad_end() }); var order = 1; target.addClass(childrenClass).each(function() { if((this).data('dad-id') == undefined) {
    (this).attr('data-dad-id', order) }(this).attr('data-dad-position', order);
    order++
    });

         function update_position(e) {
             var order = 1;
             e.find(jQclass).each(function() {
                 $(this).attr('data-dad-position', order);
                 order++
             })
         }
    
         function dad_end() {
             if(mouse.target != false && mouse.clone != false) {
                 if(callback != false) {
                     callback(mouse.target)
                 }
                 var appear = mouse.target;
                 var desapear = mouse.clone;
                 var holder = mouse.placeholder;
                 var bLeft = 0;
                 Math.floor(parseFloat(daddy.css('border-left-width')));
                 var bTop = 0;
                 Math.floor(parseFloat(daddy.css('border-top-width')));
                 if($.contains(daddy[0], mouse.target[0])) {
                     mouse.clone.animate({
                         top: mouse.target.offset().top - daddy.offset().top - bTop,
                         left: mouse.target.offset().left - daddy.offset().left - bLeft
                     }, 300, function() {
                         appear.css({
                             visibility: 'visible'
                         }).removeClass('active');
                         desapear.remove()
                     })
                 } else {
                     mouse.clone.fadeOut(300, function() {
                         desapear.remove()
                     })
                 }
                 holder.remove();
                 mouse.clone = false;
                 mouse.placeholder = false;
                 mouse.target = false;
                 update_position(daddy)
             }
             $("html,body").removeClass('dad-noSelect')
         }
    
         function dad_update(obj) {
             if(mouse.target != false && mouse.clone != false) {
                 var newplace, origin;
                 origin = $('<span style="display:none"></span>');
                 newplace = $('<span style="display:none"></span>');
                 if(obj.prevAll().hasClass('active')) {
                     obj.after(newplace)
                 } else {
                     obj.before(newplace)
                 }
                 mouse.target.before(origin);
                 newplace.before(mouse.target);
                 mouse.placeholder.css({
                     top: mouse.target.offset().top - daddy.offset().top,
                     left: mouse.target.offset().left - daddy.offset().left,
                     width: mouse.target.outerWidth() - 10,
                     height: mouse.target.outerHeight() - 10
                 });
                 origin.remove();
                 newplace.remove()
             }
         }
         var jq = (options.draggable != false) ? options.draggable : jQclass;
         daddy.find(jq).addClass(dragClass);
         daddy.find(jq).on('mousedown touchstart', function(e) {
             if(mouse.target == false && e.which == 1 && active == true) {
                 if(options.draggable != false) {
                     mouse.target = daddy.find(jQclass).has(this)
                 } else {
                     mouse.target = $(this)
                 }
                 mouse.clone = mouse.target.clone();
                 mouse.target.css({
                     visibility: 'hidden'
                 }).addClass('active');
                 mouse.clone.addClass(cloneClass);
                 daddy.append(mouse.clone);
                 mouse.placeholder = $('<div></div>');
                 mouse.placeholder.addClass('dads-children-placeholder');
                 mouse.placeholder.css({
                     top: mouse.target.offset().top - daddy.offset().top,
                     left: mouse.target.offset().left - daddy.offset().left,
                     width: mouse.target.outerWidth() - 10,
                     height: mouse.target.outerHeight() - 10,
                     lineHeight: mouse.target.height() - 18 + 'px',
                     textAlign: 'center'
                 }).text(placeholder);
                 daddy.append(mouse.placeholder);
                 var difx, dify;
                 var bLeft = Math.floor(parseFloat(daddy.css('border-left-width')));
                 var bTop = Math.floor(parseFloat(daddy.css('border-top-width')));
                 difx = mouse.x - mouse.target.offset().left + daddy.offset().left + bLeft;
                 dify = mouse.y - mouse.target.offset().top + daddy.offset().top + bTop;
                 mouse.cloneoffset.x = difx;
                 mouse.cloneoffset.y = dify;
                 mouse.clone.removeClass(childrenClass).css({
                     position: 'absolute',
                     top: mouse.y - mouse.cloneoffset.y,
                     left: mouse.x - mouse.cloneoffset.x
                 });
                 $("html,body").addClass('dad-noSelect')
             }
         });
         $(jQclass).on('mouseenter', function() {
             dad_update($(this))
         })
     });
     return this
    

    }
    }(jQuery));

调用
<script>
(function() {('.cl').dad({
draggable: '.h4'
});
});
</script>

html
<div class="cl">

        <div class="item item1">
            <h4 class ="h4">标题</h4>
            <span>1</span>
        </div>
        
        <div class="item item2">
            <h4 class="h4">标题</h4>
            <span>2</span>
        </div>
        
        <div class="item item3">
            <h4 class="h4">标题</h4>
            <span>3</span>
        </div>
        

    </div>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容