免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
JavaScript DOM 鼠標拖拽

在前端頁面交互中,鼠標拖拽是一個體驗良好的功能,實現(xiàn)鼠標拖拽需要了解鼠標行為坐標系和涉及到的許多兼容性寫法。本文介紹鼠標位置的獲取和、拽功能的實現(xiàn)以及拖拽函數(shù)的封裝

鼠標行為坐標系

  1. 鼠標行為觸發(fā)事件時,事件對象上會有一些屬性提供鼠標的位置信息

    屬性功能兼容性
    clientX/Y鼠標相對可視區(qū)域的坐標/
    x/y與 clientX/Y 功能相同firefox 低版本不支持
    pageX/Y鼠標相對整個文檔的坐標兼容 IE9 及以上
    layerX/Y與 pageX/Y 功能相同IE10 及以下同 clientX/Y
    screenX/Y鼠標位置相對屏幕坐標/
    offsetX/Y鼠標位置相對塊元素的坐標(包含邊框)safari 不包含邊框
  2. 獲取鼠標相對整個文檔的坐標:pageX/Y 兼容性差,需要進行封裝

    鼠標相對整個文檔的坐標 = 鼠標相對可視區(qū)域的坐標 + 滾動條滾動距離 - 文檔偏移

    document.documentElement.clientTop 獲取文檔偏移,在 IE 一些版本中為 undefined

    function pagePos(ev) {
        var sTop = getScrollOffset().top,
            sLeft = getScrollOffset().left,
            cTop = document.documentElement.clientTop || 0,
            cLeft = document.documentElement.clientLeft || 0;
        return {
            X: ev.clientX + sLeft - cLeft,
            Y: ev.clientY + sTop - cTop
        }
    }
    // 封裝的函數(shù):獲取滾動條滾動距離
    function getScrollOffset() {
        if (window.pageXOffset) {
            return {
                top: window.pageYOffset,
                left: window.pageXOffset
            }
        }
        else return {
            top:document.body.scrollTop || document.documentElement.scrollTop,
            left:document.body.scrollLeft || document.documentElement.scrollLeft
        }
    }

拖拽函數(shù)封裝

  1. 拖拽效果基于鼠標事件:mousedown、mousemove、mouseup

    分別為鼠標按下、鼠標移動、鼠標松開

  2. 原理:鼠標按下時,添加鼠標移動、鼠標松開的事件處理函數(shù),鼠標移動時獲取鼠標坐標,改變元素樣式,鼠標松開時清除鼠標移動和鼠標松開的事件處理函數(shù)

    <!doctype html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>Index</title>
        <style type="text/css">
            .box {
                position: absolute;
                top: 0;
                left: 0;
                width: 100px;
                height: 100px;
                background-color: red;
            }
        </style>
    </head>
    <body>
    <div class="box"></div>
    <script>
        var box = document.getElementsByTagName('div')[0];
    
        box.onmousedown = function (ev) {
            var ev = ev || window.event,
                x = pagePos(ev).X - parseInt(getStyles(box)['left']),
                y = pagePos(ev).Y - parseInt(getStyles(box)['top']);
    
            document.onmousemove = function (ev) {
                var ev = ev || window.event,
                    mPos = pagePos(ev);
                box.style.left = mPos.X - x + 'px';
                box.style.top = mPos.Y - y + 'px';
            }
            document.onmouseup = function () {
                this.onmousemove = null;
                this.onmouseup = null;
            }
        }
    
        // 封裝的函數(shù):獲取鼠標相對整個文檔的坐標
        function pagePos(ev) {
            var sTop = getScrollOffset().top,
                sLeft = getScrollOffset().left,
                cTop = document.documentElement.clientTop || 0,
                cLeft = document.documentElement.clientLeft || 0;
            return {
                X: ev.clientX + sLeft - cLeft,
                Y: ev.clientY + sTop - cTop
            }
        }
    // 封裝的函數(shù):獲取滾動條滾動距離
        function getScrollOffset() {
            if (window.pageXOffset) {
                return {
                    top: window.pageYOffset,
                    left: window.pageXOffset
                }
            } else return {
                top: document.body.scrollTop || document.documentElement.scrollTop,
                left: document.body.scrollLeft || document.documentElement.scrollLeft
            }
        }
    
        // 封裝的函數(shù):獲取元素樣式的類數(shù)組
        function getStyles(elem) {
            if (window.getComputedStyle) {
                return window.getComputedStyle(elem, null);
            } else return elem.currentStyle;
        }
    </script>
    </body>
    </html>
  3. 封裝拖拽函數(shù)

    var box = document.getElementsByTagName('div')[0];
    elemDrag(box);
    
    // 封裝的拖拽函數(shù)
    function elemDrag(elem) {
        var x,
            y;
        addEvent(elem, 'mousedown', function (ev) {
            var ev = ev || window.event;
            x = pagePos(ev).X - parseInt(getStyles(elem)['left']);
            y = pagePos(ev).Y - parseInt(getStyles(elem)['top']);
            addEvent(document, 'mousemove', mousemove);
            addEvent(document, 'mouseup', mouseup);
            cancelBubble(ev);
            preventDefaultEvent(ev);
        });
    
        function mousemove(ev) {
            var ev = ev || window.event;
            elem.style.left = pagePos(ev).X - x + 'px';
            elem.style.top = pagePos(ev).Y - y + 'px';
        }
    
        function mouseup(ev) {
            var ev = ev || window.event;
            removeEvent(document, 'mousemove', mousemove);
            removeEvent(document, 'mouseup', mouseup);
        }
    
    }
    // 綁定事件處理函數(shù)
    function addEvent(elem, type, fn) {
        if (elem.addEventListener) {
            elem.addEventListener(type, fn);
        } else if (elem.attachEvent) {
            elem.attachEvent('on' + type, function (ev) {
                fn.call(elem, ev); // call 兼容性比 bind 好
            });
        } else {
            elem['on' + type] = fn;
        }
    }
    // 解綁事件處理函數(shù)
    function removeEvent(elem, type, fn) {
        if (elem.addEventListener) {
            elem.removeEventListener(type, fn);
        } else if (elem.attachEvent) {
            elem.detachEvent('on' + type, fn);
        } else {
            elem['on' + type] = null;
        }
    }
    // 獲取鼠標在整個文檔中的坐標
    function pagePos(ev) {
        var sTop = getScrollOffset().top,
            sLeft = getScrollOffset().left,
            cTop = document.documentElement.clientTop || 0,
            cLeft = document.documentElement.clientLeft || 0;
        return {
            X: ev.clientX + sLeft - cLeft,
            Y: ev.clientY + sTop - cTop
        }
    }
    // 獲取滾動條滾動距離
    function getScrollOffset() {
        if (window.pageXOffset) {
            return {
                top: window.pageYOffset,
                left: window.pageXOffset
            }
        } else return {
            top: document.body.scrollTop || document.documentElement.scrollTop,
            left: document.body.scrollLeft || document.documentElement.scrollLeft
        }
    }
    // 獲取元素樣式的類數(shù)組
    function getStyles(elem) {
        if (window.getComputedStyle) {
            return window.getComputedStyle(elem, null);
        } else return elem.currentStyle;
    }
    // 阻止冒泡
    function cancelBubble(ev) {
        if (ev.stopPropagation) {
            ev.stopPropagation();
        } else ev.cancelBubble = true; // 兼容 IE8 及以下
    }
    // 阻止默認事件
    function preventDefaultEvent(ev) {
        if (ev.preventDefault) {
            ev.preventDefault();
        } else ev.returnValue = false; // 兼容 IE8 及以下
    }
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
js 控制鼠標在flash上 滾動時影響外面的頁面滾動
怎么用javascript進行拖拽
再談js拖拽(二)仿iGoogle自定義首頁模塊拖拽
javascript自定義事件(event) – Allen.M成長的路
Js經(jīng)典實例收集
通過JS 獲取Mouse Position(鼠標坐標)的代碼
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服