JS实现拖动div层移动

在谈到拖动div层之前,我们有必要来了解下 下面JS几个属性的区别----  pageX,pageY,layerX,layerY,clientX,clientY,screenX,screenY,offsetX之间的区别!

PageX: 鼠标在页面上的位置,从页面左上角开始,即是以页面为参考点,不随滑动条移动而变化.(只有firefox等标准游览器特有,IE没有)。
  clientX: 鼠标在页面上可视区域的位置,从浏览器可视区域左上角开始,即是以浏览器滑动条此刻的滑动到的位置为参考点,随滑动条移动 而变化.

这两个最主要的区别是 在有滚动条的情况下,pageX是不随滚动条变化而变化,clientx是在可视区域内的距离,不包括滚动条的距离。

  screenX: 鼠标在屏幕上的位置,从屏幕左上角开始,这个没有任何争议.

offsetX和layerX

      offsetX   IE特有,鼠标相比较于触发事件的元素的位置,以元素盒子模型的内容区域的左上角为参考点,如果有boder,可能出现负值。

layerX:   firefox特有,鼠标相比较于当前坐标系的位置,即如果触发元素没有设置绝对定位或相对定位,以页面为参考点,如果有,将改变参考坐标系,从触发元素盒子模型的border区域的左上角为参考点 也就是当触发元素设置了相对或者绝对定位后,layerX和offsetX就幸福地生活在一起^-^,几乎相等,唯一不同就是一个从border为参考点,一个以内容为参考点,FF从border开始.

pageX,pageY只有firefox特有,IE没有,所以要针对游览器兼容性写个函数,Jquery源码中 这样写的,

所以我们也可以针对写个公用的函数,代码如下:

function pageXY(e) {
var event = e || window.event; var doc = document.documentElement,
body = document.body; // IE
if (event.pageX == null && event.clientX != null ) {
var doc = document.documentElement,
body = document.body; event.pageX = event.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); event.pageY = event.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); return {
x : event.pageX,
y : event.pageY
}
} // firefox
return {
x : event.pageX,
y : event.pageY
}
}

offsetX 是IE特有的 layerX是firefox特有的,所以针对这两个也可以写个公用的函数 代码如下:

function offsetXY(e) {
var event = e || window.event;
return {
x:event.offsetX || event.layerX,
y:event.offsetY || event.layerY
}
}

JSFiddle链接代码如下:

想看div层拖动的话 请点击我!

拖动层的基本原理是:

  首先先来理解下 我们要在页面上拖动某一块 到 页面上的另外一个位置 那么肯定这块元素是绝对定位的 并且 我们移动它时 是不断的改变他们的top值和left值!再者 我们拖动它时候肯定要触发事件!有 onmousedown事件!

  那么我们现在是要计算的是 我们这个元素被拖动到页面上的某个位置时的 左上标的位置X和Y。

如下图所示:

要计算元素的左上的x和y坐标 如上图所示:就是指x = clientX-offsetX + "px"; y= clientY-offsetY + "px";

HTML和CSS代码如下:

<div id="father" style="border:0px solid red;width:200px;">
<div id="a" style="background:red;width:100px;height:100px">长,宽都是100px</div>
<div id="b" style="border-top:0px solid red;background:yellow;width:100px;height:100px;margin-left:100px;"></div>
</div>
<style>
#oDiv{ width:200px; height:200px; color:#fff;background:#00C; position:absolute; top:200px; left:200px; z-index:100;overflow:hidden;}
</style>

JS所有代码如下:

function pageXY(e) {
var event = e || window.event; var doc = document.documentElement,
body = document.body; // IE
if (event.pageX == null && event.clientX != null ) {
var doc = document.documentElement,
body = document.body; event.pageX = event.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); event.pageY = event.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); return {
x : event.pageX,
y : event.pageY
}
} // firefox
return {
x : event.pageX,
y : event.pageY
}
} function offsetXY(e) {
var event = e || window.event;
return {
x:event.offsetX || event.layerX,
y:event.offsetY || event.layerY
}
}
var $=function(id){
return ("string"==typeof id) ? document.getElementById(id):id;
};
$('a').onmousemove = function(e){
text(e);
}
$('b').onmousemove = function(e){
text(e);
}
function text(e) {
e = e || window.event;
var offset = offsetXY(e),
page = pageXY(e); var doc = document.documentElement,
body = document.body;
$("pageX").innerHTML= page.x;
$("pageY").innerHTML= page.y;
$("clientX").innerHTML=e.clientX;
$("clientY").innerHTML=e.clientY;
$("screenX").innerHTML=e.screenY;
$("screenY").innerHTML=e.screenY;
$("scrollTop").innerHTML=doc && doc.scrollTop;
$("scrollLeft").innerHTML=doc && doc.scrollLeft;
$("offsetX").innerHTML = offset.x;
$("offsetY").innerHTML = offset.y;
} window.onload = function () {
var oDiv = document.getElementById("oDiv");//oDiv必须使用CSS定位
oDiv.onmousedown = drag;
function drag(evt) {
evt = evt || window.event;
this.onmouseup = drop;
this.onmousemove = moveDiv;
this.offset = {
x:evt.offsetX || evt.layerX, //layerX 和layerY是w3c标准的 offsetX 和 offsetY是IE标准的
y:evt.offsetY || evt.layerY
};
}
function moveDiv(evt) {
evt = evt || window.event;
this.style.left = evt.clientX-this.offset.x+"px";
this.style.top = evt.clientY-this.offset.y+"px";
}
function drop(evt) {
this.onmouseup = null;
this.onmousemove = null;
}
};

JS实现拖动div层移动的更多相关文章

  1. js弹出div层,弹出层页面底部出现UL出现一条线问题

    整个弹出div层,列表满一页时:底部会出现一条横线 原因:ul固定写在页面中了 解决方法: 将ul代码与li列表一样写在js中,如下 var newhtml = '<ul class=" ...

  2. js弹出div层内容(按回退键关闭div层及遮罩)

    <!--弹出的div列表对应的详情--> <div id="newhtml" class="white_content"> <di ...

  3. javascript实现可拖动DIV层

    原文发布时间为:2009-05-04 -- 来源于本人的百度文章 [由搬家工具导入] 注意以下红色部分是关键.如果不使用      document.documentElement,而使用docume ...

  4. js 可拖动div 调整大小

    dragBorder: function (parent, right, bottom, bottomRight) { var isDownRight = false; var isDownBotto ...

  5. JS拖动DIV布局

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

  6. vue实现拖动div元素

    html: <div id="app1"> <div v-drag class="drag"></div> <div ...

  7. js点击弹出div层

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

  8. jquery实现DIV层拖动

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

  9. JS 拖动DIV 需要JQUERY 支持

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

随机推荐

  1. ORM中自定义一个char类型字段

    自定义一个char类型字段 class MyCharField(models.Field): """ 自定义的char类型的字段类 """ ...

  2. 【代码笔记】iOS-键盘自适应弹出

    一,效果图. 二,工程图. 三,代码. ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIVie ...

  3. C# Newtonsoft.Json反序列化为dynamic对象之后的使用

    通过Newtonsoft.Json将一个json类型的字符串反序列化为dynamic后直接使用报错 源代码: namespace ConsoleApplication1 { class Program ...

  4. SpringMVC—Struts2拦截器学习网址整理

    引自:http://blog.csdn.net/wp1603710463/article/details/49982683 SpringMVC—Struts2拦截器学习网址整理 最近项目中遇到权限相关 ...

  5. OSGI企业应用开发(七)细说Blueprint & Gemini Blueprint(二)

    上篇文章介绍了标准的Blueprint 规范与 Gemini Blueprint如何自定义Bean配置文件路径,本文接着上篇文章继续介绍Blueprint的使用. 一.Bean的配置 前面提到过,Ge ...

  6. windows与虚拟机的linux共享一个文件夹

    1.安装VMware Tools,在VMware面板上选择“虚拟机-重新安装VMware tools…” 2.使用命令 Ctrl+Alt+T 打开终端: 3.切换用户到root,命令 su 回车,输入 ...

  7. autocad.net-图片打印合成

    调用打印程序“PublishToWeb JPG.pc3”进行图片打印,该打印驱动程序中内置了很多的打印方案,在同尺寸的打印方案下,数据范围越大打印出来的清晰度就越差,内置的尺寸不一定都满足,在又要通过 ...

  8. c# 子窗体打开或者切换就最大化

    “用MDI方式打开一个子窗口体后,总是不能最大化显示,明明子窗口体的WindowState设置为Maximized?”,相信有很多人会遇到这的样问题,请按下面的方法设置即可使MDI子窗体最大化:1.把 ...

  9. excel、xls文件读写操作

    python 常用的excel.xls文件读写操作,有两个模块 xlrd:读 xlwt:写 本次先写一个读的例子: class CaseData(object): def __init__(self, ...

  10. ubuntu下给raspy pi2 编译qt5库

    交叉编译时,通常要准备mkspec, 参考: http://wiki.qt.io/Building_Qt_for_Embedded_Linux mkspec包含两个文件: qmake.conf- Th ...