原生js实现图片图标拖拽

CodeAegis
• 阅读 6725

功能概要:

  1. 原生JS实现图标图拖拽,拖拽的过程中不断输出该div的left、top值。

  2. 用html5的drag来实现拖拽有兼容性问题,使用拖拽插件代码又很多,而这个拖拽demo代码少,并且兼容所有浏览器,很值得在项目中使用,

css样式:

   #div1{ 
       width: 100px; height: 100px; 
       background-color: #4D4D4D; 
       position: absolute; cursor: pointer; 
       -webkit-box-shadow: 3px 3px 0px 3px #C7C7C7; 
       box-shadow: 3px 3px 3px 0px #C7C7C7; 
   }
   #parent{ 
       width: 500px; height: 500px; 
       border: 1px solid #CDCDCD; 
       position: relative; margin: 0 auto;   //父级元素设置为:
       background-color: #F4F4F4; 
   }
   .postText{
       width: 500px; height: 30px;margin: 0 auto; background-color: #F4F4F4;
   }
   .postText span{ 
      padding:0px 10px;
   }

html代码

<div id="parent">
    <div id="div1" onmousemove="posMove(this.id)"></div>
</div>
<div class="postText">
   移动的距离Top:<span id="posTop"></span>Left:<span id="posLeft"></span>
</div>

js代码及注释:

    function posMove(getdivid) {
        var oDiv = document.getElementById(getdivid);
        var oParent = document.getElementById('parent');
        var sent = {
            l: 10,  //设置div在父元素的活动范围,10相当于给父div设置padding-left:10;
            r: oParent.offsetWidth - oDiv.offsetWidth,  // offsetWidth:当前对象的宽度, offsetWidth = width+padding+border
            t: 10,
            b: oParent.offsetHeight - oDiv.offsetHeight,
            n: 10
        }
        drag(oDiv, sent);  
    }
    
   /**
     *
     * @param obj:被拖动的div
     * @param sent :设置div在容器中可以被拖动的区域
     * 原作者的插件下载地址如下: http://www.jq22.com/jquery-info4543
     */
    function drag(obj,sent){

        var dmW = document.documentElement.clientWidth || document.body.clientWidth;
        var dmH = document.documentElement.clientHeight || document.body.clientHeight;

        var sent = sent || {};
        var l = sent.l || 0;
        var r = sent.r || dmW - obj.offsetWidth;
        var t = sent.t || 0;
        var b = sent.b || dmH - obj.offsetHeight;
        var n = sent.n || 10;

        obj.onmousedown = function (ev){
            var oEvent = ev || event;
            var sentX = oEvent.clientX - obj.offsetLeft;
            var sentY = oEvent.clientY - obj.offsetTop;

            document.onmousemove = function (ev){
                var oEvent = ev || event;

                var slideLeft = oEvent.clientX - sentX;
                var slideTop = oEvent.clientY - sentY;

                if(slideLeft <= l){
                    slideLeft = l;
                }
                if(slideLeft >= r){
                    slideLeft = r;
                }
                if(slideTop <= t){
                    slideTop = t;
                }
                if(slideTop >= b){
                    slideTop = b;
                }

                obj.style.left = slideLeft + 'px';
                obj.style.top = slideTop + 'px';

                document.getElementById('posTop').innerHTML = slideTop;
                document.getElementById('posLeft').innerHTML = slideLeft;

            };
            document.onmouseup = function (){
                document.onmousemove = null;
                document.onmouseup = null;
            }

            return false;
        }
    }

event对象的clientX,offsetX,screenX,pageX的区别:

原生js实现图片图标拖拽

ps: 若有错误,请指出,谢谢,大家共同学习进步~~~

点赞
收藏
评论区
推荐文章
20pzqm 20pzqm
3年前
electron自定义标题栏
上贴传送门electron自定义标题栏隐藏默认标题栏constBrowserWindowrequire('electron')constwinnewBrowserWindow(frame:false)//frame设置为false支持拖拽默认情况下,无边框窗口是不可拖拽的。应用程序需要在CSS中指定webkitap
落落落洛克 落落落洛克
4年前
JavaScript进阶之实现拖拽(上)
我的前端学习笔记📒最近花了点时间把笔记整理到语雀上了,方便童鞋们阅读我的前端学习笔记📒(https://www.yuque.com/wanggangfeng
Alex799 Alex799
4年前
Vue进阶(幺柒幺):前端用户体验提升(五)Flex实现弹性布局
需求背景在实现组件拖拽设计过程中,发现组件样式中设置了display:flex属性信息,导致组件生成后无法实现拖拽效果,网上查阅资料后发现Flex布局大有天地。Flex来源
徐小夕 徐小夕
4年前
轻松教你搞定组件的拖拽, 缩放, 多控制点伸缩和拖拽数据上报
最近笔者专注于研究可视化搭建平台的解决方案,分析了很多拖拽组件和页面动态化技术,也在H5Dooring(https://github.com/MrXujiang/h5Dooring)项目中做了很多技术实现,包括:搭建平台的组件设计和分类模式拖拽生成页面方案动态表单编辑器设计页面实时预览编译技术自定义组件和自定
Wesley13 Wesley13
3年前
Unity 实现物体拖拽
Unity实现拖拽:!(http://ddlovegg.me/wpcontent/uploads/2017/10/ezgif.comvideotogif300x169.gif)也可以继承UnityEventSystem中的接口实现。当鼠标按下的时候以左键为例:UsingSystem.Collections;
Stella981 Stella981
3年前
JTopo + Vue 实现自定义拖拽流程图
JTopoVue实现自定义拖拽流程图市场上做流程图的插件比较多,这里介绍一种基于canvas编写的js插件,结合vue框架做出精美的流程图首先搭建vue框架,这里就不做介绍,由于jtopo官方demo里用到了jquery,所以我的项目里也引用了jquery插件,鉴于这里用到了很多的dom操作,所
Stella981 Stella981
3年前
ECharts 的拖拽小扩展
今天给大家介绍echarts中一个小例子『拖拽改变图表』的实现。这个例子是在原生echarts基础上做了些小小扩展,带有一定的交互性。通过这个例子,我们可以了解到,如何使用echarts提供的API实现『定制化的』『富有交互的』功能。!(http://timg01.bdimg.com/timg?pacompress&imgtype3
Stella981 Stella981
3年前
Echarts:实现拖拽效果
1<!DOCTYPEhtml2<html3<head4<metacharset"utf8"5<scriptsrc"./echarts.js"</script6</head7<body8<div
Easter79 Easter79
3年前
VUE +element el
Sortable.js是一款轻量级的拖放排序列表的js插件(虽然体积小,但是功能很强大)!(https://img2018.cnblogs.com/blog/1022288/201809/102228820180928101029146110495051.png)项目需求是要求能对element中的table进行拖拽行排序这里用到了so
Stella981 Stella981
3年前
Js使用面向对象和面向过程的方法实现拖拽物体的效果
1.面向过程的拖拽实现代码:!(https://oscimg.oschina.net/oscnet/d680c759957babef2fec0902676eaa35ad9.gif)<!DOCTYPEhtml<html<head<titledragDiv</title
馒头老爸 馒头老爸
1年前
10分钟掌握HTML拖放API!让你的网页元素瞬间拥有拖拽功能,轻松提升用户体验!
通过本文的学习,你将能够轻松掌握HTML5拖放API的使用技巧,提高拖拽功能的开发效率,为你的项目增色添彩。