实现容器内部拖拽 ---- drag.js

上一篇文章介绍了 sortable.js 实现拖拽,这里在介绍一种实现拖拽的方法

话不多说直接上代码

<!DOCTYPE html>
<HTML>
<HEAD>
	<meta http-equiv="content-type" content="text/html; charset=UTF-8">
	<link rel="stylesheet" href="./css/zTreeStyle/zTreeStyle.css" />
	<script src="./js/jquery-1.4.4.min.js"></script>
	<script src="./js/drag.js"></script>
</HEAD>
 <style type="text/css">
        div{
            height: 200px;
            overflow-y: auto;
        }
        ul{
            margin: 0;
            padding: 0;
            list-style: none;
            box-shadow: rgba(0, 0, 0, 0.2) 5px 5px 10px;
            display: inline-block;
        }
        .drag-item{
            width: 100px;
            padding: 0 10px;
            line-height: 38px;
            cursor: move;
        }
        .draging{
            background-color: #ccc !important;
        }
        .no-draging{
            background-color: #fff !important;
        }
    </style>
<BODY>
	<ul class="drag-box" style="width: 300px;">
	</ul>
<script type="text/javascript">
	    new Drag({
	        container: '.drag-box',
	        data: ['应用1','应用2','应用3','应用4','应用5','应用6','应用7','应用8','应用9']
	    });
	</script>
</BODY>
</HTML>

附上 drag.js 源码 

(function(win){

    function Drag(opts){
        this.init(opts);
    };

    Drag.prototype = {
        constructor: Drag,

        options: {
            container: '',
            data: [], //可以是数据,也可以是html标签
            className: 'item'
        },

        //初始化   
        init: function(opts){
            $.extend(this.options, opts);
            this.$el = $(this.get('container'));
            this._render();
            this._bindEvent();
        },

        get: function(key){
            return this.options[key];
        },

        set: function(key, value){
            this.options[key]=value;
        },

        //渲染列表
        _render: function(){
            var me = this, lis = '',
                data = me.get('data') || [];
            for(var i=0,len=data.length;i<len;i++) lis+='<li class="drag-item" id="drag-item-'+i+'">'+ data[i]+'</li>';
            me.$el.append(lis)
                  .find('li').attr('draggable',true)
                             .addClass(this.get('className'));
        },

        //绑定事件
        _bindEvent: function(){
            var me = this,
                $lis = $('li', me.$el),
                events = ['dragstart', 'dragenter', 'dragover', 'drop', 'dragend'];
            $.each(events, function(index, item){
                $lis.bind(item, function(e){
                    me['_'+item+'Handle'] && me['_'+item+'Handle'](e, me);
                });
            })
            $lis.hover(function(){
                $(this).css('background-color','#eee');
            },function(){
                $(this).css('background-color','#fff');
            });
        },

        //开始拖动
        _dragstartHandle: function(e){
            var me = this,oe = e.originalEvent;
            if(oe.dataTransfer){
                oe.dataTransfer.setData('text', '');
            }
            me.$drag = $(e.currentTarget);
            $('li',me.$el).removeClass('item-hover');
            me.$drag.addClass('draging').siblings().addClass('no-draging');
        },

        _dragenterHandle: function(e){
            var me = this;
            me.$drop = $(e.currentTarget);
            if(me.timer){clearTimeout(me.timer)} //事件控制
            me.timer = setTimeout(function(){
                if(me.$drag.attr('id') !== me.$drop.attr('id')){
                    me._createMask();
                    if(me.$drag.index()<me.$drop.index()) me.$drag.insertAfter(me.$drop);
                    else me.$drag.insertBefore(me.$drop);
                }
            }, 30);

        },

        _dragoverHandle: function(e){
            var oe = e.originalEvent;
            e.preventDefault();
            return false;
        },

        _dropHandle: function(e){
            e.preventDefault();
            e.stopPropagation();
            return false;
        },

        //拖动结束
        _dragendHandle: function(e){
            var me = this;
            me.$mask && me.$mask.remove();
            setTimeout(function(){
                $('li', me.$el).removeClass('draging no-draging');
            },30);
        },

        //创建遮罩
        _createMask: function(){
            var me = this,$mask = me.$mask = $('<div class="drag-mask"></div>');
            $mask.css({
                position: 'absolute',
                width: me.$drop.outerWidth(),//new
                height: me.$drop.outerHeight(),//new
                left: me.$drop.position().left,
                top: me.$drop.position().top+me.$el.scrollTop(),//new
                backgroundColor: '#fff'
            });
            $mask.bind({
                'drop': me._dropHandle,
                'dragover': me._dragoverHandle
            });
            this.$el.find('.drag-mask').remove();
            this.$el.append($mask);
        }

    };

    win.Drag = Drag;
})(window);

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值