乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      JavaScript DOM 鼠標(biāo)拖拽

       丹楓無跡 2021-11-06

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

      鼠標(biāo)行為坐標(biāo)系

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

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

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

        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. 拖拽效果基于鼠標(biāo)事件:mousedown、mousemove、mouseup

        分別為鼠標(biāo)按下、鼠標(biāo)移動、鼠標(biāo)松開

      2. 原理:鼠標(biāo)按下時,添加鼠標(biāo)移動、鼠標(biāo)松開的事件處理函數(shù),鼠標(biāo)移動時獲取鼠標(biāo)坐標(biāo),改變元素樣式,鼠標(biāo)松開時清除鼠標(biāo)移動和鼠標(biāo)松開的事件處理函數(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ù):獲取鼠標(biāo)相對整個文檔的坐標(biāo)
            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;
            }
        }
        // 獲取鼠標(biāo)在整個文檔中的坐標(biāo)
        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 及以下
        }
        // 阻止默認(rèn)事件
        function preventDefaultEvent(ev) {
            if (ev.preventDefault) {
                ev.preventDefault();
            } else ev.returnValue = false; // 兼容 IE8 及以下
        }

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多