詳解原生js實現(xiàn)offset方法
在為 jTool 提供 offset (獲取當(dāng)前節(jié)點(diǎn)位置)方法時, 先后使用了兩種方式進(jìn)行實現(xiàn), 現(xiàn)整理出來以作記錄。
前后共使用了兩種方式實現(xiàn)了該方法, 這里將這兩種方法分別列出。
通過遞歸實現(xiàn)
function offset(element) { var offest = { top: 0, left: 0 }; var _position; getOffset(element, true); return offest; // 遞歸獲取 offset, 可以考慮使用 getBoundingClientRect function getOffset(node, init) { // 非Element 終止遞歸 if (node.nodeType !== 1) { return; } _position = window.getComputedStyle(node)['position']; // position=static: 繼續(xù)遞歸父節(jié)點(diǎn) if (typeof(init) === 'undefined' && _position === 'static') { getOffset(node.parentNode); return; } offest.top = node.offsetTop + offest.top - node.scrollTop; offest.left = node.offsetLeft + offest.left - node.scrollLeft; // position = fixed: 獲取值后退出遞歸 if (_position === 'fixed') { return; } getOffset(node.parentNode); } }
// 執(zhí)行offset var s_kw_wrap = document.querySelector('#s_kw_wrap'); offset(s_kw_wrap); // => Object {top: 181, left: 400}
通過ClientRect實現(xiàn)
function offset2(node) { var offest = { top: 0, left: 0 }; // 當(dāng)前為IE11以下, 直接返回{top: 0, left: 0} if (!node.getClientRects().length) { return offest; } // 當(dāng)前DOM節(jié)點(diǎn)的 display === 'node' 時, 直接返回{top: 0, left: 0} if (window.getComputedStyle(node)['display'] === 'none') { return offest; } // Element.getBoundingClientRect()方法返回元素的大小及其相對于視口的位置。 // 返回值包含了一組用于描述邊框的只讀屬性——left、top、right和bottom,單位為像素。除了 width 和 height 外的屬性都是相對于視口的左上角位置而言的。 // 返回如{top: 8, right: 1432, bottom: 548, left: 8, width: 1424…} offest = node.getBoundingClientRect(); var docElement = node.ownerDocument.documentElement; return { top: offest.top + window.pageYOffset - docElement.clientTop, left: offest.left + window.pageXOffset - docElement.clientLeft }; }
// 執(zhí)行offset var s_kw_wrap = document.querySelector('#s_kw_wrap'); offset2(s_kw_wrap); // => Object {top: 181.296875, left: 399.5}
offset2() 函數(shù)中使用到了 .getClientRects() 與 .getBoundingClientRect() 方法,IE11 以下瀏覽器并不支持; 所以該種實現(xiàn), 只適于現(xiàn)代瀏覽器。
.getClientRects()
返回值是 ClientRect 對象集合(與該元素相關(guān)的CSS邊框),每個 ClientRect 對象包含一組描述該邊框的只讀屬性——left、top、right 和 bottom,單位為像素,這些屬性值是相對于視口的top-left的。
并包含 length 屬性, IE11以下可以通過是否包含 length 來驗證當(dāng)前是否為IE11以上版現(xiàn)。
.getBoundingClientRect()
返回值包含了一組用于描述邊框的只讀屬性——left、top、right 和 bottom,單位為像素。除了 width 和 height 外的屬性都是相對于視口的左上角位置而言的。
.getBoundingClientRect() 與 .getClientRects()的關(guān)系
- 這兩個方法的區(qū)別與當(dāng)前的 display 相關(guān), 當(dāng) display=inline 時, .getClientRects() 返回當(dāng)前節(jié)點(diǎn)內(nèi)每一行文本的 ClientRect 對象數(shù)組, 此時數(shù)組長度等于文本行數(shù)。
- 當(dāng) display != inline 時, .getClientRects() 返回當(dāng)前節(jié)點(diǎn)的 ClientRect 對象數(shù)組,此時數(shù)組長度為1.
- .getBoundingClientRect() 總是返回當(dāng)前節(jié)點(diǎn)的 ClientRect 對象, 注意這里是 ClientRect 對象而不是對象數(shù)組。
提示
以上測試, 可以通過在百度首頁執(zhí)行進(jìn)行測試, document.querySelect('#s_kw_wrap') 所獲取到的節(jié)點(diǎn)為百度首頁輸入框
希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- js中offset,client , scroll 三大元素知識點(diǎn)總結(jié)
- MySQL查詢中LIMIT的大offset導(dǎo)致性能低下淺析
- JS中offset和勻速動畫詳解
- js獲取元素的偏移量offset簡單方法(必看)
- JavaScript中offsetWidth的bug及解決方法
- div的offsetLeft與style.left區(qū)別
- JavaScript中style.left與offsetLeft的使用及區(qū)別詳解
- window.setInterval()方法的定義和用法及offsetLeft與style.left的區(qū)別
- springboot中如何實現(xiàn)kafa指定offset消費(fèi)
相關(guān)文章
echarts統(tǒng)計x軸區(qū)間的數(shù)值實例代碼詳解
這篇文章主要介紹了echarts統(tǒng)計x軸區(qū)間的數(shù)值,本文給出了實現(xiàn)實例及實例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07七個基于JavaScript實現(xiàn)的情人節(jié)表白特效
情人節(jié)將至 程序員證明自己不是直男的時候到啦 我們也有自己的專屬代碼浪漫。本文將介紹七個利用JavaScript實現(xiàn)的情人節(jié)表白特效,需要的可以參考一下2022-01-01前端實現(xiàn)文件的斷點(diǎn)續(xù)傳(前端文件提交+后端PHP文件接收)
本文通過斷點(diǎn)續(xù)傳的簡單例子(前端文件提交+后端PHP文件接收),本文以圖片為實例給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,感興趣的朋友一起看看吧2016-11-11JavaScript中instanceof運(yùn)算符的用法總結(jié)
這篇文章主要是對JavaScript中instanceof運(yùn)算符的用法進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助2013-11-11js split函數(shù)用法總結(jié)(從入門到精通)
js split就是將一字符串以特定的字符分割成數(shù)組,數(shù)組一般是字符串處理比較常用的處理方法2013-03-03Gulp實現(xiàn)靜態(tài)網(wǎng)頁模塊化的方法詳解
眾所周知Gulp.js 是一個自動化構(gòu)建工具,開發(fā)者可以使用它在項目開發(fā)過程中自動執(zhí)行常見任務(wù)。下面這篇文章主要給大家介紹了關(guān)于Gulp實現(xiàn)靜態(tài)網(wǎng)頁模塊化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2018-01-01使用setTimeout實現(xiàn)SetInterval原理解析
這篇文章主要為大家介紹了使用setTimeout實現(xiàn)SetInterval原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10