鼠标事件:拖动文档元素

房东的猫 提交于 2020-02-26 15:16:18

鼠标事件对象几个重要的属性:

  • clientX: 窗口坐标,加上垂直滚动可以得到文档纵坐标
  • clientY: 窗口坐标,加上水平滚动可以得到文档横坐标
  • altKey: boolean值,点击时是否按下了alt键
  • ctrlKey: boolean值,点击时是否按下了ctrl键
  • metaKey: boolean值,点击时是否按下了meta键
  • shiftKey: boolean值,点击时是否按下了shift键

button 点击时按下的是鼠标的哪个键(不同浏览器的赋值不同,不易使用)

收录拖动文档元素的js:

/**
 * 拖动绝对定位的HTML元素
 * 该方法依赖之前收集的getScrollOffset方法
 */
function drag( elementToDrag, event ){
    // 初始化鼠标位置,转换为文档坐标
    var scroll = getScrollOffset(),
        startX = event.clientX + scroll.x,
        startY = event.clientY + scroll,y,
        // 这里假设了elementToDrag的offsetParent是文档的body元素,似乎会有问题
        origX = elementToDrag.offsetLeft,
        origY = elementToDrag.offsetTop,
        deltaX = startX - origX,
        deltaY = startY - origY;

    if( document.addEventListener ){
        document.addEventListener( "mousemove", movehandler, true );
        document.addEventListener( "mouseup", upHandler, true );
    }else if( document.attachEvent ){
        // IE的事件模型中,捕获事件是通过调用元素上的setCapture()实现的
        elementToDrag.setCapture();
        elementToDrag.attachEvent( "onmousemove", moveHandler );
        elementToDrag.attachEvent( "onmouseup", upHandler );
        // 作为mouseup事件看待鼠标捕获的丢失???
        elementToDrag.attachEvent( "onlosecapture", upHandler );
    }
    if( event.stopPropagation ) event.stopPropagation();
    else event.cancelBubble = true;

    // 现在阻止任何默认操作
    if( event.preventDefault ) event.preventDefault();
    else event.returnValue = false;

    function moveHandler( e ){
        if( !e ) e = window.event;
        var scroll = getScrollOffset();
        elementToDrag.style.left = ( e.clientX + scroll.x - deltaX ) + "px";
        elementToDrag.style.top = ( e.clientY + scroll.y -deltaY ) + "px";
        if( e.stopPropagation ) e.stopPropagation();
        else e.cancelBubble = true;
    }

    function upHandler( e ){
        if( !e ) e = window.event;
        if( document.removeEventListener ){
            document.removeEventListener( "mouseup", upHandler, true );
            document.removeEventListener( "mousemove", movehandler, true );
        }else if( document.attachEvent ){
            elementToDrag.detachEvent( "onlosecapture", upHandler );
            elementToDrag.detachEvent( "onmouseup", upHandler );
            elementToDrag.detachEvent( "onmousemove", movehandler );
            elementToDrag.releasecapture();
        }
        if( e.stopPropagation ) e.stopPropagation();
        else e.cancelBubble = true;
    }
}

调用:

<div style="position:absolute;left:120px;top:150px;width:250px; border:1px solid black;">
    <div style="background-color:#416ea5; width:250px;height:22px;cursor:move;font-weight:bold;    border-bottom:1px solid black;" onmousedown="drag(this.parentNode, event);">可拖动标题</div>
    <p>可被拖动的窗口</p>
    <p>窗口内容</p>
</div>

<img src="image/logo.jpg" alt="按住Shift可拖动"  style="position:absolute;"
 onmousedοwn="if (event.shiftKey) drag(this, event);" />
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!