js實(shí)現(xiàn)jquery的offset()方法(獲取當(dāng)前元素相對(duì)于文檔的偏移量 )

背景

最近做項(xiàng)目,由于zepto使用的功能較少,想將zepto的功能用較少原生實(shí)現(xiàn),其中有個(gè)實(shí)現(xiàn)zepto的offset()方法取到各種值的難為了我,我百度了下,大體網(wǎng)上千篇一律的這樣寫(xiě)到

這篇文章主要介紹了js實(shí)現(xiàn)jquery的offset()方法,實(shí)例分析了jquery的offset()方法原理與采用javascript實(shí)現(xiàn)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
本文實(shí)例講述了js實(shí)現(xiàn)jquery的offset()方法。分享給大家供大家參考。具體分析如下:
用過(guò)jQuery的offset()的同學(xué)都知道offset().top或offset().left很方便地取得元素相對(duì)于整個(gè)頁(yè)面的偏移。
而在js里,沒(méi)有這樣直接的方法,節(jié)點(diǎn)的屬性offsetTop可以獲得該節(jié)點(diǎn)相對(duì)于父節(jié)點(diǎn)的相對(duì)偏移,但不能直接獲得其絕對(duì)偏移,我們可用節(jié)點(diǎn)逐層遞歸向上來(lái)相加offsetTop來(lái)獲得絕對(duì)偏移。
復(fù)制代碼代碼如下:
function getOffset(Node, offset) {    
    if (!offset) {        
          offset = {};
          offset.top = 0; 
          offset.left = 0;
    }
    if (Node == document.body) {
            //當(dāng)該節(jié)點(diǎn)為body節(jié)點(diǎn)時(shí),結(jié)束遞歸        
            return offset;   
     }
    offset.top += Node.offsetTop;    offset.left += Node.offsetLeft;
    return getOffset(Node.parentNode, offset);//向上累加offset里的值
}
使用時(shí),則如:
復(fù)制代碼代碼如下:
var a = document.getElementById('a');//getOffset(a).top//getOffset(a).left
希望本文所述對(duì)大家的javascript程序設(shè)計(jì)有所幫助。

我本著試試看的態(tài)度將這個(gè)方法炒了上去,打印出值結(jié)果與我需要的值相差甚遠(yuǎn),為此我仔細(xì)翻了下源碼,源碼見(jiàn)下面鏈接
源碼
找到如下方法getBoundingClientRect,翻了下caniuse發(fā)現(xiàn)兼容性還好(本人移動(dòng)端),故可以寫(xiě)成以下方式

//獲取當(dāng)前元素相對(duì)于文檔的偏移量 
let getOffset = (elem) => {    
    let docElem = document.documentElement; 
    let box = elem.getBoundingClientRect();  
    return {  
            top: box.top  +  docElem.scrollTop ,  
            left: box.left + docElem.scrollLeft   
      }

如果要考慮兼容性,請(qǐng)仔細(xì)看zepto源碼
另外上述

function getOffset(Node, offset) {    
    if (!offset) {        
          offset = {};
          offset.top = 0; 
          offset.left = 0;
    }
    if (Node == document.body) {
            //當(dāng)該節(jié)點(diǎn)為body節(jié)點(diǎn)時(shí),結(jié)束遞歸        
            return offset;   
     }
    offset.top += Node.offsetTop;    offset.left += Node.offsetLeft;
    return getOffset(Node.parentNode, offset);//向上累加offset里的值
}

改成

function getOffset(Node, offset) {    
    if (!offset) {        
          offset = {};
          offset.top = 0; 
          offset.left = 0;
    }
    if (Node == document.body) {
            //當(dāng)該節(jié)點(diǎn)為body節(jié)點(diǎn)時(shí),結(jié)束遞歸        
            return offset;   
     }
    offset.top += Node.offsetTop;    offset.left += Node.offsetLeft;
    return getOffset(Node.offsetParent, offset);//向上累加offset里的值
}

也可以實(shí)現(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容