<div id="divMove" style="POSITION: absolute;left:300;top:300" onselectstart="return false" onmousedown="MouseDown(this)" onmousemove="MouseMove()" onmouseup="MouseUp()">
<table width="150" cellpadding="0" cellspacing="0" border="1">
<tr>
<td height="30" bgcolor="#cccccc">title</td>
</tr>
<tr>
<td height="100"><p align="center">testMove</p></td>
</tr>
</table>
</div>
<SCRIPT LANGUAGE="JavaScript">
<!--
var currentMoveObj = null;
var relLeft,relTop;
function MouseDown(obj)
{
currentMoveObj = obj;
currentMoveObj.style.position = "absolute";
relLeft = event.x - currentMoveObj.style.pixelLeft;
relTop = event.y - currentMoveObj.style.pixelTop;
}
function MouseUp()
{
currentMoveObj = null;
}

function MouseMove()
{
if(currentMoveObj != null)
{
currentMoveObj.style.pixelLeft=event.x-relLeft;
currentMoveObj.style.pixelTop=event.y-relTop;
}
} //-->
</SCRIPT>
这些代码基本可以实现拖动图层,不过就是当图层超出一屏的时候,也就是出现滚动条以后,就不能把图层拖回了,各位有什么意见,帮帮忙,
谢谢啦,
(*^__^*) 嘻嘻……

解决方案 »

  1.   

    /**
     * Drag.js: drag absolutely positioned HTML elements.
     *
     * This module defines a single drag( ) function that is designed to be called
     * from an onmousedown event handler. Subsequent mousemove events will
     * move the specified element. A mouseup event will terminate the drag.
     * If the element is dragged off the screen, the window does not scroll.
     * This implementation works with both the DOM Level 2 event model and the
     * IE event model.
     *
     * Arguments:
     *
     *   elementToDrag: the element that received the mousedown event or
     *     some containing element. It must be absolutely positioned. Its
     *     style.left and style.top values will be changed based on the user's
     *     drag.
     *
     *   event: the Event object for the mousedown event.
     **/
    function drag(elementToDrag, event) {
        // The mouse position (in window coordinates)
        // at which the drag begins
        var startX = event.clientX, startY = event.clientY;    // The original position (in document coordinates) of the
        // element that is going to be dragged. Since elementToDrag is
        // absolutely positioned, we assume that its offsetParent is the
        // document body.
        var origX = elementToDrag.offsetLeft, origY = elementToDrag.offsetTop;    // Even though the coordinates are computed in different
        // coordinate systems, we can still compute the difference between them
        // and use it in the moveHandler( ) function. This works because
        // the scrollbar position never changes during the drag.
        var deltaX = startX - origX, deltaY = startY - origY;    // Register the event handlers that will respond to the mousemove events
        // and the mouseup event that follow this mousedown event.
        if (document.addEventListener) {  // DOM Level 2 event model
            // Register capturing event handlers
            document.addEventListener("mousemove", moveHandler, true);
            document.addEventListener("mouseup", upHandler, true);
        }
        else if (document.attachEvent) {  // IE 5+ Event Model
            // In the IE event model, we capture events by calling
            // setCapture( ) on the element to capture them.
            elementToDrag.setCapture( );
            elementToDrag.attachEvent("onmousemove", moveHandler);
            elementToDrag.attachEvent("onmouseup", upHandler);
            // Treat loss of mouse capture as a mouseup event.
            elementToDrag.attachEvent("onlosecapture", upHandler);
        }
        else {  // IE 4 Event Model
            // In IE 4 we can't use attachEvent( ) or setCapture( ), so we set
            // event handlers directly on the document object and hope that the
            // mouse events we need will bubble up.
            var oldmovehandler = document.onmousemove; // used by upHandler( )
            var olduphandler = document.onmouseup;
            document.onmousemove = moveHandler;
            document.onmouseup = upHandler;
        }    // We've handled this event. Don't let anybody else see it.
        if (event.stopPropagation) event.stopPropagation( );  // DOM Level 2
        else event.cancelBubble = true;                      // IE    // Now prevent any default action.
        if (event.preventDefault) event.preventDefault( );   // DOM Level 2
        else event.returnValue = false;                     // IE    /**
         * This is the handler that captures mousemove events when an element
         * is being dragged. It is responsible for moving the element.
         **/
        function moveHandler(e) {
            if (!e) e = window.event;  // IE Event Model        // Move the element to the current mouse position, adjusted as
            // necessary by the offset of the initial mouse-click.
            elementToDrag.style.left = (e.clientX - deltaX) + "px";
            elementToDrag.style.top = (e.clientY - deltaY) + "px";        // And don't let anyone else see this event.
            if (e.stopPropagation) e.stopPropagation( );  // DOM Level 2
            else e.cancelBubble = true;                  // IE
        }    /**
         * This is the handler that captures the final mouseup event that
         * occurs at the end of a drag.
         **/
        function upHandler(e) {
            if (!e) e = window.event;  // IE Event Model        // Unregister the capturing event handlers.
            if (document.removeEventListener) {  // DOM event model
                document.removeEventListener("mouseup", upHandler, true);
                document.removeEventListener("mousemove", moveHandler, true);
            }
            else if (document.detachEvent) {  // IE 5+ Event Model
                elementToDrag.detachEvent("onlosecapture", upHandler);
                elementToDrag.detachEvent("onmouseup", upHandler);
                elementToDrag.detachEvent("onmousemove", moveHandler);
                elementToDrag.releaseCapture( );
            }
            else {  // IE 4 Event Model
                // Restore the original handlers, if any
                document.onmouseup = olduphandler;
                document.onmousemove = oldmovehandler;
            }        // And don't let the event propagate any further.
            if (e.stopPropagation) e.stopPropagation( );  // DOM Level 2
            else e.cancelBubble = true;                  // IE
        }
    }
      

  2.   

    看看这个例子:
    <html>
    <head>
    <title>_xWin</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312"><style type='text/css'>
    <!--
    body{font-size:12px;}
    a:visited{text-decoration:none;color:slategray;}
    a:hover{text-decoration:underline;color:slategray;}
    a:link{text-decoration:none;color:slategray;}
    -->
    </style>
    <script language=JScript>
    <!--
    //可以打包为js文件;
    var x0 = 0, y0 = 0, x1 = 0, y1 = 0;
    var offx = 6, offy=6;
    var moveable = false;
    var hover = 'orange', normal = '#336699';//color;
    var index = 10000;//z-index;
    //开始拖动;
    function startDrag(obj)
    {
      if (event.button == 1)
      {
        //锁定标题栏;
        obj.setCapture();
        //定义对象;
        var win = obj.parentNode;
        var sha = win.nextSibling;
        //记录鼠标和层位置;
        x0 = event.clientX;
        y0 = event.clientY;
        x1 = parseInt(win.style.left);
        y1 = parseInt(win.style.top);
        //记录颜色;
        normal = obj.style.backgroundColor;
        //改变风格;
        obj.style.backgroundColor = hover;
        win.style.borderColor = hover;
        obj.nextSibling.style.color = hover;
        sha.style.left = x1 + offx;
        sha.style.top = y1 + offy;
        moveable = true;
      }
    }
    //拖动;
    function drag(obj)
    {
      if (moveable)
      {
        var win = obj.parentNode;
        var sha = win.nextSibling;
        win.style.left = x1 + event.clientX - x0;
        win.style.top = y1 + event.clientY - y0;
        sha.style.left = parseInt(win.style.left) + offx;
        sha.style.top = parseInt(win.style.top) + offy;
      }
    }
    //停止拖动;
    function stopDrag(obj)
    {
      if (moveable)
      {
        var win = obj.parentNode;
        var sha = win.nextSibling;
        var msg = obj.nextSibling;
        win.style.borderColor = normal;
        obj.style.backgroundColor = normal;
        msg.style.color = normal;
        sha.style.left = obj.parentNode.style.left;
        sha.style.top = obj.parentNode.style.top;
        obj.releaseCapture();
        moveable = false;
      }
    }
    //获得焦点;
    function getFocus(obj)
    {
      if (obj.style.zIndex != index)
      {
        index = index + 2;
        var idx = index;
        obj.style.zIndex = idx;
        obj.nextSibling.style.zIndex = idx - 1;
      }
    }
    //最小化;
    function min(obj)
    {
      var win = obj.parentNode.parentNode;
      var sha = win.nextSibling;
      var tit = obj.parentNode;
      var msg = tit.nextSibling;
      var flg = msg.style.display=="none";
      if (flg)
      {
        win.style.height = parseInt(msg.style.height) + parseInt(tit.style.height) + 2 * 2;
        sha.style.height = win.style.height;
        msg.style.display = "block";
        obj.innerHTML = "0";
      }
      else
      {
        win.style.height = parseInt(tit.style.height) + 2 * 2;
        sha.style.height = win.style.height;
        obj.innerHTML = "2";
        msg.style.display = "none";
      }
    }
    //创建一个对象;
    function xWin(id, w, h, l, t, tit, msg)
    {
      index = index + 2;
      this.id = id;
      this.width = w;
      this.height = h;
      this.left = l;
      this.top = t;
      this.zIndex = index;
      this.title = tit;
      this.message = msg;
      this.obj = null;
      this.bulid = bulid;
      this.bulid();
    }
    //初始化;
    function bulid()
    {
      var str = ""
        + "<div id=xMsg" + this.id + " "
        + "style='"
        + "z-index:" + this.zIndex + ";"
        + "width:" + this.width + ";"
        + "height:" + this.height + ";"
        + "left:" + this.left + ";"
        + "top:" + this.top + ";"
        + "background-color:" + normal + ";"
        + "color:" + normal + ";"
        + "font-size:8pt;"
        + "font-family:Tahoma;"
        + "position:absolute;"
        + "cursor:default;"
        + "border:2px solid " + normal + ";"
        + "' "
        + "onmousedown='getFocus(this)'>"
        + "<div "
        + "style='"
        + "background-color:" + normal + ";"
        + "width:" + (this.width-2*2) + ";"
        + "height:20;"
        + "color:white;"
        + "' "
        + "onmousedown='startDrag(this)' "
        + "onmouseup='stopDrag(this)' "
        + "onmousemove='drag(this)' "
        + "ondblclick='min(this.childNodes[1])'"
        + ">"
        + "<span style='width:" + (this.width-2*12-4) + ";padding-left:3px;'>" + this.title + "</span>"
        + "<span style='width:12;border-width:0px;color:white;font-family:webdings;' onclick='min(this)'>0</span>"
        + "<span style='width:12;border-width:0px;color:white;font-family:webdings;' onclick='ShowHide(\""+this.id+"\",null)'>r</span>"
        + "</div>"
        + "<div style='"
        + "width:100%;"
        + "height:" + (this.height-20-4) + ";"
        + "background-color:white;"
        + "line-height:14px;"
        + "word-break:break-all;"
        + "padding:3px;"
        + "'>" + this.message + "</div>"
        + "</div>"
        + "<div id=xMsg" + this.id + "bg style='"
        + "width:" + this.width + ";"
        + "height:" + this.height + ";"
        + "top:" + this.top + ";"
        + "left:" + this.left + ";"
        + "z-index:" + (this.zIndex-1) + ";"
        + "position:absolute;"
        + "background-color:black;"
        + "filter:alpha(opacity=40);"
        + "'></div>";
      document.body.insertAdjacentHTML("beforeEnd", str);
    }
    //显示隐藏窗口
    function ShowHide(id, dis)
    {
      var bdisplay = (dis == null)?((document.getElementById("xMsg"+id).style.display=="")?"none":""):dis
      document.getElementById("xMsg"+id).style.display = bdisplay;
      document.getElementById("xMsg"+id+"bg").style.display = bdisplay;
    }
    //-->
    </script><script language='JScript'>
    <!--
    function initialize()
    {
      var a = new xWin("1",160,200,200,200,"窗口1","xWin <br/> A Cool Pop Div Window<br/>Version:1.0<br/>2002-8-13");
      var b = new xWin("2",240,200,100,100,"窗口2","Welcome to visited my personal website:<br/><a href=http://www.youthfly.net target=_blank>http://www.youthfly.net</a><br/>anducanalsosignmyguestbookat:<br/><ahref=http://www ... youthfly.net</a><br/><br/>thx!!!=)..."); 
      var c = new xWin("3",750,700,140,10,"<center>个人简介</center>","Copyright by 网页一班!");
      ShowHide("1","none");
      ShowHide("2","none");
      ShowHide("3","none");//隐藏窗口1
      center('1');center('2');center('3');
    }
    window.onload = initialize;
    //-->
    function center(id)
    {
    xwin = document.getElementById("xMsg"+id);
    var wleft = (document.body.clientWidth-xwin.style.width.replace("px",""))/2 < 0 ? 0 : (document.body.clientWidth-xwin.style.width.replace("px",""))/2;
    var wtop = (document.body.clientHeight-xwin.style.height.replace("px",""))/2 < 0 ? 0 : (document.body.clientHeight-xwin.style.height.replace("px",""))/2;;

    xwin.style.left = wleft;
    xwin.style.top  = wtop;

    xwinbg = document.getElementById("xMsg"+id+"bg");
    xwinbg.style.left = wleft;
    xwinbg.style.top  = wtop;
    }
    </script>
    </head>
    <!--<base target="_blank">-->
    <body onselectstart='return false' oncontextmenu='return false'>
    <a href="javascript:ShowHide('1',null)" >窗口1</a>
    <a  href="javascript:ShowHide('2',null)">窗口2</a>
    <a  href="javascript:ShowHide('3',null)">窗口3</a>
    </body>
    </html>