兼容Firefox和IE的拖动div块的实现

本文介绍了一个使用JavaScript实现的拖动效果,并解决了不同浏览器下滚动条获取的问题。通过监听鼠标事件实现元素拖拽,同时确保了在Firefox和IE等浏览器下的兼容性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个功能主要是用了js的onmousedown、onmousemove、onmouseup、onmouseout几个事件。
并需要理解,FF和IE的offsetX、offsetY的差别。在FF下需要用layerX、layerY来代替offsetX、offsetY,
这两个事件属性是获得鼠标相对于父元素的相对位置。

注意:声明的DOCTYPE会影响document.documentElement.scrollTop和document.documentElement.scrollLeft的取值,
本人在网上找的解决方案如下:
关于js中 document.body.scrollTop 不能返回正确值的原因
本来是为了通过 document.body.scrollTop来获取浏览器垂直滚动条向下滚动的像素,但是不管滚动条在什么位置总是返回是0,
造成这样的原因和 html的头部声明有关,如果头部声明 为:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">,
这样肯定得到的结果是 0,如果该为<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
就能得到正确的结果,对于第一种头部声明想要得滚动条的滚动的高度怎么办,解决方法有两种
1、var scrollPos; if (typeof window.pageYOffset != 'undefined') {
scrollPos = window.pageYOffset; } else if (typeof document.compatMode != 'undefined' &&
document.compatMode != 'BackCompat') {
scrollPos = document.documentElement.scrollTop;
} else if (typeof document.body != 'undefined')
{
scrollPos = document.body.scrollTop;
}

 2、用document.documentElement.scrollTop 替代 document.body.scrollTop

本人的代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <mce:script language=javascript><!-- // var onmousedrag = new Object(); // var onmousedrag = function(){}; /** * 处理拖动事件的类,封装了拖动过程发生的事件的处理函数 * @param {Object} e */ var Onmousedrag = { mousedownflag: 0, x: 0, y: 0, mousedown: function(e){ // alert("a"); this.mousedownflag = 1; this.x = e.offsetX ? e.offsetX : e.layerX; this.y = e.offsetY ? e.offsetY : e.layerY; }, mousemove: function(e){ if (this.mousedownflag) { // alert(flag); var movey = (e.offsetY ? e.offsetY : e.layerY) - this.y; var movex = (e.offsetX ? e.offsetX : e.layerX) - this.x; // var scrollX = document.documentElement.scrollLeft; // var scrollY = document.documentElement.scrollTop; var obj = document.getElementById("movedivid"); var top = obj.style.top; var left = obj.style.left; obj.style.position = "absolute"; var xx = (movex + parseInt(left.substr(0, left.length - 2))); var yy = (movey + parseInt(top.substr(0, top.length - 2))); obj.style.left = xx + "px"; obj.style.top = yy + "px"; } }, mouseup: function(){ this.mousedownflag = 0; //alert(obj.style.width); }, mouseout: function(){ this.mousedownflag = 0; } }; var scrollEvent = { preScrollX: 0, preScrollY: 0, fixedFloatDiv: function(){ // alert('dadsa'); var obj = document.getElementById("movedivid"); var scrollX = document.documentElement.scrollLeft; var scrollY = document.documentElement.scrollTop; var top = obj.style.top; var left = obj.style.left; // alert(parseInt(top.substr(0, top.length-2))); obj.style.top = (parseInt(top.substr(0, top.length - 2)) + scrollY - this.preScrollY) + "px";//当前div块距离浏览器top的距离+(浏览器滚动条移动的距离=当前浏览器滚动的距离-上次浏览器滚动的距离) obj.style.left = (parseInt(left.substr(0, left.length - 2)) + scrollX - this.preScrollX) + "px"; this.preScrollY = scrollY;//保存这次浏览器滚动的y轴长度 this.preScrollX = scrollX;//保存这次浏览器滚动的x轴长度 } }; /** * 兼容IE和FireFox的onscroll滚动事件 */ window.onscroll = function(){ scrollEvent.fixedFloatDiv(); }; // --></mce:script> </head> <body> <div id="movedivid" style="z-index:9999;position: absolute; left: 245px; top:130px;width:300px;height:200px;background:#cccccc;cursor:move;" onmousedown="Onmousedrag.mousedown(event);" onmousemove="Onmousedrag.mousemove(event);" onmouseup="Onmousedrag.mouseup();"onmouseout="Onmousedrag.mouseout();"> test text </div> <div style="OVERFLOW:scroll;white-space:nowrap;text-overflow:ellipsis; width:200p;"> ads dadads dadads dadads dadads dadads dadads <br/> dadads <br/> dadads <br/> dadads <br/> <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> dadads <br/> </div> </body> </html>

其中chrome游览器支持的是这种方式获得滚动的距离的

window.pageYOffset

那么把

var scrollX = document.documentElement.scrollLeft;

ar scrollY = document.documentElement.scrollTop;

改成下面这种,就支持这三种游览器了,呵呵!

var scrollX = 0; var scrollY = 0; // 如果浏览器支持 pageYOffset, 通过 pageXOffset 和 pageYOffset 获取页面和视窗之间的距离 ,chrome是这种方式 if (typeof window.pageYOffset != 'undefined') { scrollX = window.pageXOffset; scrollY = window.pageYOffset; } // 如果浏览器支持 compatMode, 并且指定了 DOCTYPE, 通过 documentElement 获取滚动距离作为页面和视窗间的距离 // IE 中, 当页面指定 DOCTYPE, compatMode 的值是 CSS1Compat, 否则 compatMode 的值是 BackCompat else { if (typeof document.compatMode != 'undefined' && document.compatMode != 'BackCompat') { scrollX = document.documentElement.scrollLeft; scrollY = document.documentElement.scrollTop; } // 如果浏览器支持 document.body, 可以通过 document.body 来获取滚动高度 else { if (typeof document.body != 'undefined') { scrollX = document.body.scrollLeft; scrollY = document.body.scrollTop; } } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值