码迷,mamicode.com
首页 > Web开发 > 详细

JS-拖拽(基本原理实现)

时间:2015-05-22 11:35:39      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:拖拽   drag   

主要要点:

1.拖拽3大事件onmousedown,onmousemove,onmouseup

2. 要拖动的物体需要设置成position:absolute,这样在拖拽时改变left和top值才有效

3. onmousemove和up事件应该加在document上

4. 鼠标抬起的时候,清除onmousemove和up事件

技术分享

需要清楚上面途中一些变量的意思

完整测试代码:

<body>
<div id="dragDiv"></div>
</body>
<style>
        #dragDiv{
            width: 100px;height: 100px;
            background: green;
            position: absolute;
        }
</style>

<pre name="code" class="javascript"><script>
        window.onload = function () {
            var oDiv = document.getElementById('dragDiv');

            var disX = 0;
            var disY = 0;
            oDiv.onmousedown = function(ev){
                var ev = ev|| window.event;
                disX = ev.clientX - oDiv.offsetLeft;//鼠标按下时光标的x值和 div左边框的距离
                disY = ev.clientY - oDiv.offsetTop; //鼠标按下时光标的x值和 div上边框间的距离
                if(oDiv.setCapture){
                    oDiv.setCapture();// 为了解决IE老版本的bug
                }

                document.onmousemove = function (ev) {
                    var ev = ev || window.event;
                    //拖拽限制范围,
                    var L = ev.clientX- disX;
                    var T = ev.clientY - disY;
                    // 获取浏览器窗口的宽高
                    var clientW = document.documentElement.clientWidth || document.body.clientWidth;
                    var clientH = document.documentElement.clientHeight || document.body.clientHeight;

                    var maxW = clientW-oDiv.offsetWidth; // 可拖拽的最大宽度
                    var maxH = clientH-oDiv.offsetHeight; // 可拖拽的最大高度
                    if(L<0){
                        L = 0;// 当贴住浏览器窗口的左边框就不能再拖了
                    }
                    if(L>maxW){
                        L = maxW; // 当贴住浏览器窗口的右边框就不能再拖了
                    }
                    if(T<0){
                        T = 0;// 当贴住浏览器窗口的上边框就不能再拖了
                    }
                    if(T>maxH){
                        T = maxH; // 当贴住浏览器窗口的下边框就不能再拖了
                    }
                    oDiv.style.left = L +'px';
                    oDiv.style.top = T +'px';
                };
                document.onmouseup = function(){
                    document.onmousemove = null;
                    document.onmouseup = null;
                    if(releaseCapture){
                        oDiv.releaseCapture();
                    }
                }
            }
            return false;
        }
</script>

1. 浏览器会有一些默认的行为,会造成拖拽产生bug,所以需要在最后通过return false,阻止浏览器默认行为


IE8之前版本,选中一些元素之后再进行拖拽,会出现禁止拖拽图标这样的小bug

需要在拖拽时利用setCapture生成一个透明的层

在鼠标抬起后再用releaseCapture释放这个层

JS-拖拽(基本原理实现)

标签:拖拽   drag   

原文地址:http://blog.csdn.net/u014205965/article/details/45913747

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!