<!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. Redis 与 数据库处理数据的两种模式

    Redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类key-value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了Pyt ...

  2. VS2015+Win10 调试DirectX 报错

    安装完Win10调试程序突然在这个地方报错: #if (defined(DEBUG) || defined(_DEBUG)) deviceFlags |= D3D11_CREATE_DEVICE_DE ...

  3. 《Note --- Unreal 4 --- B project --- Second UV issue》

    Second uv 可以通过editor来生成: 这部分内容都是在staticMeshEditor这个文件夹下面的代码里: 关于UI的相应机制,有个文件UICommandList.cpp例如我点击st ...

  4. split和join的用法

    第一点:split 直接举例子,比较直观, >>> f = 'www.baidu.com.cn' >>> f.split()['www.baidu.com.cn'] ...

  5. [LeetCode] Convex Polygon 凸多边形

    Given a list of points that form a polygon when joined sequentially, find if this polygon is convex ...

  6. .NET跨平台之旅:增加文件日志功能遇到的挫折

    在将我们的ASP.NET 5示例站点(about.cnblogs.com)升级至ASP.NET 5 RC1的时候,我们增加了控制台日志功能. 在ASP.NET 5添加日志功能很简单,只需在projec ...

  7. 信鸽推送 10004,os文件配置出错,解决办法

    信鸽推送注册失败 返回码 10004 是 os  配置出现问题 经过询问客服,得到以下解决办法 将SDK中的so文件复制下来 新建文件夹jniLibs,并将 so 配置文件粘贴进去 便可完成注册

  8. 多线程之异步编程: 经典和最新的异步编程模型,async与await

    经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例1.使用经 ...

  9. Uncaught SyntaxError: Invalid or unexpected token

    出现错误的地方:在Jquery中,调用有参数的方法,动态传递参数时报错 出现错误的原因: 动态传递参数的时候,参数中有换行符 错误的解决:参数传递之前,将换行符替换 var  temp = model ...

  10. 使用DataTable更新数据库

    简例: string connStr = string.Format("Driver={1}Microsoft Access Driver (*.mdb){2};DBQ={0};" ...