<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
    <title>drag-demo</title>
    <style type="text/css">
    #one{width: 100px;height: 100px;background: #66CCCC;color:#FFFFFF;}
    </style>
    <script type="text/javascript">
    window.onload=function(){
        dragone('one');
    };

    // 版本一:仅仅只实现拖拽,忽略其他问题
    function dragone(domName){
        //获取需要拖到元素的dom对象
        var dom = document.getElementById(domName);
        //当这个dom元素按下的时候
        dom.onmousedown=function(e){
            /*
            浏览器兼容性判断主要是为了兼容ie8,其他的ie7、ie6没测试,不知道
             */
   
            e = e || window.event;
            /*
            设置该dom元素为绝对定位absolute
            只有设置为position:absolute才能实现left(距离页面左边)和top(距离页面顶部)设置,下面有说明
             */
            dom.style.position = 'absolute';
            /*
            e.clientX:获取鼠标按下点的位置在页面上的X(横向即水平)值
            这里假如是:e.clientX=10
            e.clientY:获取鼠标按下点的位置在页面上的Y(纵向即垂直)值
            这里假如是:e.clientY=20
            dom.offsetLeft:获取该元素距离页面左边的距离
            这里假如是:dom.offsetLeft = 5
            dom.offsetTop:获取该元素距离页面顶部的距离
            这里假如是:dom.offsetTop = 6

            这里如果不理解可以使用画图工具进行理解
            diffX:即5 = 10 - 5,计算出的5就是鼠标按下的x点距离该元素内部左边的值
            diffY:即14 = 20 - 6,计算出的14就是鼠标按下的y点距离该元素内部顶部的值
             */
            var diffX = e.clientX-dom.offsetLeft;           
            var diffY = e.clientY-dom.offsetTop;
            //当元素被点下并在界面上移动的时候
            document.onmousemove=function(e){
                e = e || window.event;//浏览器兼容
                /*
                dom.style.left和dom.style.top即距离页面左边、顶部的距离
                即用移动后的鼠标按下x,y值-之前按下点的距离内部左边、距离顶部的值
                得到的值即是移动后的元素距离页面的x,y的距离,重新赋值一下给dom元素即可
                 */
                dom.style.left = e.clientX-diffX+'px';//设置移动时left值
                dom.style.top = e.clientY-diffY+'px';//设置移动时top值
            };
            //鼠标松开的时候
            document.onmouseup=function(e){
                //去除页面移动、松开事件
                //去除后该元素下次再次被点击拖动时,这两个事件又会被绑定上的,无需担心
                document.onmousemove = null;
                document.onmouseup = null;
            };
        };
    }
    </script>
</head>
<body>
    <div id="one">版本一</div>
</body>
</html>

#附图一张,理解拖动原理


js拖拽效果实现的更多相关文章

  1. React.js实现原生js拖拽效果及思考

    一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...

  2. js拖拽效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 再谈React.js实现原生js拖拽效果

    前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目 ...

  4. js拖拽效果的实现及原理

    元素拖拽分成3个步骤:按下鼠标,移动鼠标,松开鼠标. 拖拽原理:按下拖拽元素后开始监听文档中鼠标移动事件,然后再监听鼠标松开事件:鼠标移动时,元素div要随着鼠标一起移动,需要计算元素div位移的距离 ...

  5. js拖拽效果的实现

    1.最基础的写法 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> < ...

  6. js拖拽效果详细讲解

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. js div浮动层拖拽效果代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)

    转自<JS实现漂亮的窗口拖拽效果(可改变大小.最大化.最小化.关闭)>:http://www.jb51.net/article/73157.htm   这篇文章主要介绍了JS实现漂亮的窗口 ...

  9. js实现本地图片文件拖拽效果

    如何拖拽图片到指定位置,具体方法如下 在从本地上传图片的时候,如果使用拖拽效果,想想应该是更加的高大上,下面直接上js代码 完整代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

随机推荐

  1. 严重: Exception loading sessions from persistent storage Java.io.EOFException

    tomcat启动时报此异常,但web页均能正常运行:对程序影响不大. /*具体原因时tomcat--work--(你当前运行的工程名)--session.ser*/删除即可解决 分析: EOFExce ...

  2. [转]How to: Create a Custom Principal Identity

    本文转自:https://msdn.microsoft.com/en-us/library/aa702720(v=vs.110).aspx The PrincipalPermissionAttribu ...

  3. [原]导入OpenStreetMap海图数据,并在GeoServer上发布

    转载请注明作者think8848和出处(http://think8848.cnblogs.com) 上回我们说到如何<在GeoServer中为OpenStreetMap数据设置OSM样式> ...

  4. [LeetCode] Is Subsequence 是子序列

    Given a string s and a string t, check if s is subsequence of t. You may assume that there is only l ...

  5. [LeetCode] Zigzag Iterator 之字形迭代器

    Given two 1d vectors, implement an iterator to return their elements alternately. For example, given ...

  6. [LeetCode] Word Frequency 单词频率

    Write a bash script to calculate the frequency of each word in a text file words.txt. For simplicity ...

  7. Ubuntu下git的安装与使用

    Ubuntu下git的安装与使用 Ubuntu下git的安装与使用与Windows下的大致相同,只不过个人感觉在Ubuntu下使用git更方便. 首先,确认你的系统是否已安装git,可以通过git指令 ...

  8. Workload Automation分析及其使用

    Workload Automation介绍 Workload Automation是提供一个在设备上运行各种workload的工具,使用Python编写.WA具有良好的框架结构,方便快捷的扩展.包含几 ...

  9. Codeforces Round #384(div 2)

    A 题意:有n个机场处于一直线上,可两两到达,每个机场只可能属于两家公司中的一家(用0,1表示),现在要从a机场到b机场,可任意次转机.若机场i与机场j从属同一公司,则费用为0,否则费用为1.问最小费 ...

  10. 精灵方向移动问题[math.floor]

    local xd = math.cos(math.rad(self._direction));--self._direction方向角度 local yd = math.sin(math.rad(se ...