经历了好一段的调试,终于调出了兼容IE、Firefox的鼠标拖动层。源码附上。
< head >
< meta http - equiv = " Content-Type " content = " text/html; charset=gb2312 " />
< title > Binny.cn </ title >
< script >
var obj = 0 ;
var x = 0 ;
var y = 0 ;
var ie = (navigator.appVersion.indexOf( " MSIE " ) !=- 1 ); // IE
var ff = (navigator.userAgent.indexOf( " Firefox " ) !=- 1 ); // Firefox
function find(evt,objDiv) ... {
obj = objDiv
if (ff)...{
x = document.documentElement.scrollLeft + evt.layerX;
y = document.documentElement.scrollTop + evt.layerY;
if (document.documentElement.scrollTop > 0)...{
y = evt.layerY - document.documentElement.scrollTop;
}
if (document.documentElement.scrollLeft > 0)...{
x = evt.layerX - document.documentElement.scrollLeft;
}
}
if (ie)...{
x = document.documentElement.scrollLeft + evt.offsetX;
y = document.documentElement.scrollTop + evt.offsetY;
if (document.documentElement.scrollTop > 0)...{
y = evt.offsetY - document.documentElement.scrollTop;
}
if (document.documentElement.scrollLeft > 0)...{
x = evt.offsetX - document.documentElement.scrollLeft;
}
}
}
function dragit(evt) ... {
if(obj == 0)...{
return false
}
else...{
obj.style.left = evt.clientX - x + "px";
obj.style.top = evt.clientY - y + "px";
}
}
</ script >
</ head >
< body style = " margin:0 " onmousemove = " dragit(event) " onmouseup = " obj = 0 " >
< div id = " aaa " style = " background-color:red;width:200pt;height:200pt;position:absolute " >
< div id = " aa " style = " width:200pt;height:20pt;background:blue;position:absolute " onmousedown = " find(event,document.getElementById('aaa')) " ></ div >
</ div >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >< BR >
</ body >
</ html >
以下,是关于制作鼠标拖动层的详解:
解决思路
这个效果并不算常见,通常用于游戏或个人站点中。因为拖曳是靠鼠标来操作的,所以对鼠标的位置的捕获是问题的重点,然后才是根据鼠标的位置设置层的位置。
具体步骤:
1.在对象(层)上按下鼠标时,先捕获到需要拖曳的对象,然后获取或设置该对象的相关属性。
obj=event.srcElement
obj.setCapture()
z=obj.style.zIndex
obj.style.zIndex=100
x=event.offsetX
y=event.offsetY
down=true
2.开始拖曳时,捕获鼠标当前位置,并根据该数值设置被拖曳对象的位置。
obj.style.posLeft=document.body.scrollLeft+event.x-x
obj.style.posTop=document.body.scrollTop+event.y-y
3.拖曳完松开鼠标后,重设标志 down ,还原对象的 z-index并释放对它的鼠标捕捉。
down=false
obj.style.zIndex=z
obj.releaseCapture()
4.完整代码。
<script>
var x,y,z,down=false,obj
function init(){
obj=event.srcElement //事件触发对象
obj.setCapture() //设置属于当前对象的鼠标捕捉
z=obj.style.zIndex //获取对象的z轴坐标值
//设置对象的z轴坐标值为100,确保当前层显示在最前面
obj.style.zIndex=100
x=event.offsetX //获取鼠标指针位置相对于触发事件的对象的X坐标
y=event.offsetY //获取鼠标指针位置相对于触发事件的对象的Y坐标
down=true //布尔值,判断鼠标是否已按下,true为按下,false为未按下
}
function moveit(){
//判断鼠标已被按下且onmouseover和onmousedown事件发生在同一对象上
if(down&&event.srcElement==obj){
with(obj.style){
/*设置对象的X坐标值为文档在X轴方向上的滚动距离加上当前鼠标指针相当于文档对象的X坐标值减鼠标按下时指针位置相对于触发事件的对象的X坐标*/
posLeft=document.body.scrollLeft+event.x-x
/*设置对象的Y坐标值为文档在Y轴方向上的滚动距离加上当前鼠标指针相当于文档对象的Y坐标值减鼠标按下时指针位置相对于触发事件的对象的Y坐标*/
posTop=document.body.scrollTop+event.y-y
}
}
}
function stopdrag(){
//onmouseup事件触发时说明鼠标已经松开,所以设置down变量值为false
down=false
obj.style.zIndex=z //还原对象的Z轴坐标值
obj.releaseCapture() //释放当前对象的鼠标捕捉
}
</script>
<div οnmοusedοwn=init() οnmοusemοve=moveit() οnmοuseup=stopdrag() style="position:absolute;left:20;top:190;width:100;height:150;border:1px solid #000000;z-index:1;background:#eeeeee">Layer 1</div>
<div οnmοusedοwn=init() οnmοusemοve=moveit() οnmοuseup=stopdrag() style="position:absolute;left:60;top:10;width:100;height:150;border:1px solid #000000;z-index:2;background:#eeeeee">Layer 2</div>
<div οnmοusedοwn=init() οnmοusemοve=moveit() οnmοuseup=stopdrag() style="position:absolute;left:100;top:90;width:100;height:150;border:1px solid #000000;z-index:3;background:#eeeeee">Layer 3</div>
注意:只有 CSS 的 position 属性值为 absolute 的对象才能进行拖动操作。
提示:如果需要将拖曳组件化,可以参考第二部分HTC一节。
技巧:可以在 init() 函数中加一句 event.cancelBubble=true ,以取消在该对象上的事件冒泡。
试一试:读者可以试着实现移动其他对象,例如移动一个图片或文本框。
特别提示
在拖曳对象前必须确保该对象的为绝对定位的,把上面的完整代码保存就可以看到效果了,在实际就用时务必在对象上加上 onmousedown、onmousemove和onmouseup三个事件并触发相应函数。代码运行效果如图 3.8 所示。
图 3.8 可拖动的层
特别说明
本例需要掌握的技巧比较多,捕捉鼠标,获取鼠标位置(相当于对象),释放鼠标捕捉,文档的滚动距离还有with 语句。
1. setCapture() 设置属于当前文档的对象的鼠标捕捉。
2. event.offsetX 设置或获取鼠标指针位置相对于触发事件的对象的 x 坐标。
3. event.offsetY 设置或获取鼠标指针位置相对于触发事件的对象的 y 坐标。
4. releaseCapture() 释放当前文档中对象的鼠标捕捉。
5. scrollLeft 设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离。
6. scrollTop 设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离。
7. with 为一个或多个语句设定默认对象。