拖拽

19 篇文章 0 订阅

在mousedown的handler函数里加上return false;就解决问题了

猜测选中文字的执行是根据mousedown的时候返回值和mousemove的返回值进行计算,从而知道哪些文字被选中。鼠标按下时将返回值设为false,就阻止了它计算的过程了。

一、js拖拽插件的原理

常见的拖拽操作是什么样的呢?整过过程大概有下面几个步骤:

1、用鼠标点击被拖拽的元素

2、按住鼠标不放,移动鼠标

3、拖拽元素到一定位置,放开鼠标

这里的过程涉及到三个dom事件:onmousedown,onmousemove,onmouseup。所以拖拽的基本思路就是:

1、用鼠标点击被拖拽的元素触发onmousedown

(1)设置当前元素的可拖拽为true,表示可以拖拽

(2)记录当前鼠标的坐标x,y

(3)记录当前元素的坐标x,y

2、移动鼠标触发onmousemove

(1)判断元素是否可拖拽,如果是则进入步骤2,否则直接返回

(2)如果元素可拖拽,则设置元素的坐标

元素的x坐标 = 鼠标移动的横向距离+元素本来的x坐标 = 鼠标现在的x坐标 - 鼠标之前的x坐标 + 元素本来的x坐标

元素的y坐标 = 鼠标移动的横向距离+元素本来的y坐标 = 鼠标现在的y坐标 - 鼠标之前的y坐标 + 元素本来的y坐标

3、放开鼠标触发onmouseup

(1)将鼠标的可拖拽状态设置成false

在实现基本的效果之前,有几点需要说明的:

1、元素想要被拖动,它的postion属性一定要是relative或absolute

2、通过event.clientX和event.clientY获取鼠标的坐标

3、onmousemove是绑定在document元素上而不是拖拽元素本身,这样能解决快速拖动造成的延迟或停止移动的问题

偶的实现

<div class="drag-div" id="drag-div">
    <div class="drag-header" id="drag-header">my header</div>
    <div class="drag-content">abc</div>
</div>
<div class="drag-div" id="drag-div2">
    <div class="drag-header" id="drag-header2">my header</div>
    <div class="drag-content">abc</div>
</div>
<script src="../js/libs/jquery-1.11.3.js"></script>
<script>




    $.fn.dragable = function (opt) {
        var defaultTargetContain = $(this);
        var defalut = {
            "targetContain": null,
            "callBack":null
        };
        var option = $.extend(defalut,opt);


        $(this).each(function () {
            var flag = false;
            var top,left,clientX,clientY,targetClientX,targerClientY;
            var targetObj = option.targetContain==null?$(this):$(option.targetContain);


            //元素postion
            $(targetObj).css({"position":"absolute"});
            //元素 鼠标
            $(this).css({"cursor":"move"})


            //绑定鼠标mousedown
            $(this).mousedown(function (e) {
                flag = true;
                top = $(this).offset().top;
                left = $(this).offset().left;
                clientX = e.clientX;
                clientY = e.clientY;
                return false;
            });


            $(document).mousemove(function (e) {
                if(flag){
                    targetClientX = e.clientX;
                    targerClientY = e.clientY;
                    var targetTop = top+(targerClientY-clientY);
                    var targetLeft = left+(targetClientX-clientX);
                    $(targetObj).offset({
                        "top":targetTop<0?0:targetTop,
                        "left":targetLeft<0?0:targetLeft
                    });
                }
            });
            $(document).mouseup( function () {
                flag=false;
            });
        });


    };




    $("#drag-header").dragable({
        "targetContain":"#drag-div"
    });


    $("#drag-header2").dragable({
        "targetContain":"#drag-div2"
    });


</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值