• firefox_拖动层


    <html>
    <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;200pt;height:200pt;position:absolute">
    <div id="aa" style="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>

    <divonmousedown=init()onmousemove=moveit()onmouseup=stopdrag()style="position:absolute;left:20;top:190;100;height:150;border:1px solid #000000;z-index:1;background:#eeeeee">Layer1</div>
    <divonmousedown=init()onmousemove=moveit()onmouseup=stopdrag()style="position:absolute;left:60;top:10;100;height:150;border:1px solid #000000;z-index:2;background:#eeeeee">Layer2</div>
    <divonmousedown=init()onmousemove=moveit()onmouseup=stopdrag()style="position:absolute;left:100;top:90;100;height:150;border:1px solid #000000;z-index:3;background:#eeeeee">Layer3</div>


    注意:只有 CSS 的 position 属性值为 absolute 的对象才能进行拖动操作。
    提示:如果需要将拖曳组件化,可以参考第二部分HTC一节。
    技巧:可以在 init() 函数中加一句 event.cancelBubble=true ,以取消在该对象上的事件冒泡。
    试一试:读者可以试着实现移动其他对象,例如移动一个图片或文本框。
    特别提示: 在拖曳对象前必须确保该对象的为绝对定位的,把上面的完整代码保存就可以看到效果了,在实际就用时务必在对象上加上 onmousedown、onmousemove和onmouseup三个事件并触发相应函数。

    特别说明
    本例需要掌握的技巧比较多,捕捉鼠标,获取鼠标位置(相当于对象),释放鼠标捕捉,文档的滚动距离还有with 语句。
    1. setCapture() 设置属于当前文档的对象的鼠标捕捉。
    2. event.offsetX 设置或获取鼠标指针位置相对于触发事件的对象的 x 坐标。
    3. event.offsetY 设置或获取鼠标指针位置相对于触发事件的对象的 y 坐标。
    4. releaseCapture() 释放当前文档中对象的鼠标捕捉。
    5. scrollLeft 设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离。
    6. scrollTop 设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离。
    7. with 为一个或多个语句设定默认对象。
  • 相关阅读:
    谈谈 rm -rf * 后的几点体会(年轻人得讲码德)
    shell读取文档中的命令并逐行执行
    被踢出工作群聊后的若干反思
    units命令单位转换
    想买保时捷的运维李先生学Java性能之 垃圾收集器
    想买保时捷的运维李先生学Java性能之 垃圾收集算法
    想买保时捷的运维李先生学Java性能之 生存与毁灭
    想买保时捷的运维李先生 求救求救求救求救
    想买保时捷的运维李先生学Java性能之 运行时数据区域
    想买保时捷的运维李先生学Java性能之 JIT即时编译器
  • 原文地址:https://www.cnblogs.com/wangpei/p/1316863.html
Copyright © 2020-2023  润新知