鼠标拖拽

一、效果
一个可以在屏幕上任意拖动的红色爱心


爱心.gif

二、代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false" %>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- 
  - Author(s): Administrator
  - Date: 2019-05-06 20:08:38
  - Description:
-->
<head>
<title>mouseMoveDemo</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    <script src="<%= request.getContextPath() %>/common/nui/nui.js" type="text/javascript"></script>
    <style type="text/css">
        .love {
            /* 爱心 */
            position: absolute;/*relative、flow*/
            left:35px;
        }
        .love:before {
            content: "";
            width: 70px;
            height: 100px;
            background: #f00;
            position: absolute;
            border-top-left-radius: 50%;
            border-top-right-radius: 50%;
            transform: rotate(45deg);
        }
        .love:after {
            content: "";
            width:70px;
            height: 100px;
            background: #f00;
            position: absolute;
            border-top-left-radius: 50%;
            border-top-right-radius: 50%;
            transform: rotate(-45deg);
            left: -24px;
        }
    </style>
</head>
<body>
    <div id="love" class="love"></div>


    <script type="text/javascript">
        nui.parse();
        $("#love").mousedown(function(e){
        debugger;
            var isMove = true;
            var love = $("#love")[0];//获取div对象
            var love_before = window.getComputedStyle(love, "before");//获取dom对象的css伪元素
            var love_after = window.getComputedStyle(love, "after");//获取dom对象的css伪元素
            var window_width = window.innerWidth;//网页Iframe的宽度
            var window_height = window.innerHeight;//网页Iframe的高度
            window.outerHeight;//浏览器的高度
            window.outerWidth;//浏览器的宽度
            window.screenTop = window.screenY;//浏览器相对显示屏左上角的x坐标位置
            window.screenLeft = window.screenX;//浏览器相对显示屏左上角的y坐标位置
            var love_div_x = e.pageX - $("#love").offset().left;//鼠标离div左上角的x坐标长度
            var love_div_y = e.pageY - $("#love").offset().top;//鼠标离div左上角的y坐标长度
            var love_before_width = love_before.width;//dom对象的css伪元素的宽度
            var love_before_width_real = love_before_width.substr(0,love_before_width.length-2);
            var love_before_height = love_before.height;//dom对象的css伪元素的高度
            var love_before_height_real = love_before_height.substr(0,love_before_height.length-2);
            $(document).mousemove(function(e){
                var love_local_x = $("#love").offset().left;//dom对象左上角离Iframe网页左上角x坐标的距离长度
                var love_local_y = $("#love").offset().top;//dom对象左上角离Iframe网页左上角y坐标的距离长度
                var left = e.pageX -love_div_x;//dom元素与鼠标同步运动时left应该设置的值
                var top = e.pageY - love_div_y;//dom元素与鼠标同步运动时top应该设置的值
                if(isMove){
                    //确保dom元素不会移除网页可视区域
                    left = left>parseInt(window_width)-parseInt(love_before_width_real)-30?parseInt(window_width)-parseInt(love_before_width_real)-30:left;
                    left = left<35?35:left;
                    top = top>parseInt(window_height)-parseInt(love_before_height_real)-10?parseInt(window_height)-parseInt(love_before_height_real)-10:top;
                    top = top<-5?-5:top;
                    $("#love").css({"left":left,"top":top});
                    //document.getElementById("love").style.cssText="left:"+left+"px;top:"+top+"px;";
//document.getElementById("love").setAttribute("style", "left:"+left+"px;top:"+top+"px;")
                }
            }).mouseup(function(){
                isMove = false;
            });
        });
    </script>
</body>
</html>

三、知识点总结
3.1、获取dom对象的css伪元素通过window.getComputedStyle(love, "before")的方式获取;

3.2、window.outerHeight;//浏览器的高度
window.outerWidth;//浏览器的宽度
window.innerWidth;//网页Iframe的宽度
window.innerHeight;//网页Iframe的高度
window.screenTop = window.screenY;//浏览器相对显示屏左上角的x坐标位置
window.screenLeft = window.screenX;//浏览器相对显示屏左上角的y坐标位置

3.3、设置dom元素设置css属性:$("#love").css({"left":left,"top":top});
或者document.getElementById("love").style.cssText="left:"+left+"px;top:"+top+"px;";
或者document.getElementById("love").setAttribute("style", "left:"+left+"px;top:"+top+"px;")

3.4、var e = window.event获取到页面事件
e.clientX =e.pageX=当前网页窗口鼠标相对窗口左上角的X坐标位置(绝对位置,即不管网页本身是否伸缩,计算的是物理的鼠标位置相对左上角的X坐标位置)
e.clientY=e.pageY=当前网页窗口鼠标相对窗口左上角的Y坐标位置(同上,绝对位置)

e.offsetX=e.layerX=当前网页窗口鼠标相对窗口左上角的X坐标位置(相对位置,即网页中可能存在横向或纵向的滚动条,本处计算的是绝对位置加上滚动条滚动的位置,例如绝对位置为200,然后横向滚动条向右滚动了100,则结果为300)
e.offsetY=e.layerY=当前网页窗口鼠标相对窗口左上角的Y坐标位置(同上,相对位置位置)

e.screenX=鼠标位置相对屏幕左上角的X坐标位置
e.screenY=鼠标位置相对屏幕左上角Y坐标位置

3.5、一个position为absolute的dom元素,里面包含的元素位置会自动随着dom元素的位置变动而变动

3.6、背景图片的设置:background-image:url(../images/透明提示框01.png);
background-repeat:no repeat;
background-size:100% 100%;//自适应占满

3.7、获取body元素:document.getElementsByTagName('body')[0];

3.8、js创建dom对象:var newDiv = document.createElement("div");
newDiv.setAttribute("class", "dialoge");
newDiv.addEventListener("click", function(){alert(123);});//给对象添加点击事件
newDiv.setAttribute("style", "left:"+x+"px;top:"+y+"px;");
document.getElementsByTagName('body')[0].appendChild(context1);

3.9、js销毁对象:document.getElementsByTagName('body')[0].removeChild(document.getElementById("caililiang01"));//从body中销毁id为caililiang01的dom对象

四、封装的函数
函数用来把ID为id的div设置为可移动(注意该div的position属性必须为position:absolute)

function setDIVMoved(id){//把ID为id的div设置为可移动(注意该div的position属性必须为position:absolute)
            $("#"+id).mousedown(function(e){
                var isMove = true;//鼠标是否在移动的标志
                var temp = $("#"+id)[0];//获取到div对象
                var window_width = window.innerWidth;//网页Ifram的宽度
                var window_height = window.innerHeight;//网页Ifram的高度
                var div_x = e.pageX - $("#"+id).offset().left;//鼠标点击的位置相对于div左上角x轴坐标长度
                var div_y = e.pageY - $("#"+id).offset().top;//鼠标点击的位置相对于div左上角y轴坐标长度
                var div_width = temp.offsetWidth;//div对象的宽度
                var div_height = temp.offsetHeight;//div对象的高度
                $(document).mousemove(function(e){
                    var div_local_x = $("#"+id).offset().left;//div的左上角相对于网页左上角x坐标的长度
                    var div_local_y = $("#"+id).offset().top;//div的左上角相对于网页左上角y坐标的长度
                    //var x1 = parseInt(div_width)+parseInt(div_local_x);//div的右下角相对于网页左上角x坐标的长度
                    //var y1 = parseInt(div_height)+parseInt(div_local_y);//div的右下角相对于网页左上角y坐标的长度
                    var left = e.pageX -div_x;//算出的div左上角相对于网页左上角x坐标的长度
                    var top = e.pageY -div_y;
                    if(isMove){
                        //div不能超过窗口的右边
                        left = left>parseInt(window_width)-parseInt(div_width)?parseInt(window_width)-parseInt(div_width):left;
                        //div不能超过窗口的左边
                        left = left<1?1:left;
                        //div不能超过窗口的下边
                        top = top>parseInt(window_height)-parseInt(div_height)?parseInt(window_height)-parseInt(div_height):top;
                        //div不能超过窗口的上边
                        top = top<1?1:top;
                        $("#"+id).css({"left":left,"top":top});
                    }
                }).mouseup(function(){
                    isMove=false;
                });
            });
        }


函数二:
function setDIVMoved2(obj){
          obj.onmousedown=function(e){
            var oe=e||window.event;
            var $this=this;
            var l=oe.clientX-$this.offsetLeft;
            var t=oe.clientY-$this.offsetTop;
            document.onmousemove=function(e){
              var oe=e||window.event;
              var ol=oe.clientX-l;
              var ot=oe.clientY-t;
              if(ol<0) ol=0;
              if(ot<0) ot=0;
              if(ot>document.documentElement.clientHeight-$this.offsetHeight) ot=document.documentElement.clientHeight-$this.offsetHeight;
              if(ol>document.documentElement.clientWidth-$this.offsetWidth) ol=document.documentElement.clientWidth-$this.offsetWidth;
              $this.style.left=ol+"px";
              $this.style.top=ot+"px";
            }
            document.onmouseup=function(){
              document.onmousemove=null;
              document.onmouseup=null;
              if($this.releaseCapture) $this.releaseCapture();
            }
            if($this.setCapture){
              $this.setCapture();
            }
            if(oe.preventDefault) oe.preventDefault();
            else oe.returnValue=false;
            return false;
          }
        }
以上两个函数效果一致
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容

  • 只记录left,top同理。clientX:返回鼠标相对于浏览器的水平坐标;offsetLeft:返回当前对象距离...
    小菇凉大思想阅读 909评论 0 0
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,486评论 1 45
  • 思路: 利用onmousedown事件实现拖拽。首先获得鼠标横坐标点和纵坐标点到div的距离,然后当鼠标移动后再用...
    zhangmz阅读 963评论 0 48
  • 15.11.27远离 远离尘世的喧嚣 远离世俗的烦恼 走进山水之中 闭上眼听 倾听自然的声音 听风声呼啸 听雷声轰...
    闲垂散人阅读 231评论 4 2
  • 对于生活在城市里的人来说,公交车从来都是很重要的,城市的面积越来越大,道路越来越宽,想要凭借着双脚能够到达的地方是...
    cyyyyyyyyyyy阅读 534评论 0 1