最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解原生js實(shí)現(xiàn)offset方法

 更新時(shí)間:2017年06月15日 15:52:48   作者:奔跑的大兔子  
本篇文章主要介紹了原生js實(shí)現(xiàn)offset方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

在為 jTool 提供 offset (獲取當(dāng)前節(jié)點(diǎn)位置)方法時(shí), 先后使用了兩種方式進(jìn)行實(shí)現(xiàn), 現(xiàn)整理出來(lái)以作記錄。

前后共使用了兩種方式實(shí)現(xiàn)了該方法, 這里將這兩種方法分別列出。

通過(guò)遞歸實(shí)現(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}

通過(guò)ClientRect實(shí)現(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' 時(shí), 直接返回{top: 0, left: 0}
  if (window.getComputedStyle(node)['display'] === 'none') {
    return offest;
  }
  // Element.getBoundingClientRect()方法返回元素的大小及其相對(duì)于視口的位置。
  // 返回值包含了一組用于描述邊框的只讀屬性——left、top、right和bottom,單位為像素。除了 width 和 height 外的屬性都是相對(duì)于視口的左上角位置而言的。
  // 返回如{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 以下瀏覽器并不支持; 所以該種實(shí)現(xiàn), 只適于現(xiàn)代瀏覽器。

.getClientRects()

返回值是 ClientRect 對(duì)象集合(與該元素相關(guān)的CSS邊框),每個(gè) ClientRect 對(duì)象包含一組描述該邊框的只讀屬性——left、top、right 和 bottom,單位為像素,這些屬性值是相對(duì)于視口的top-left的。

并包含 length 屬性, IE11以下可以通過(guò)是否包含 length 來(lái)驗(yàn)證當(dāng)前是否為IE11以上版現(xiàn)。

.getBoundingClientRect()

返回值包含了一組用于描述邊框的只讀屬性——left、top、right 和 bottom,單位為像素。除了 width 和 height 外的屬性都是相對(duì)于視口的左上角位置而言的。

.getBoundingClientRect() 與 .getClientRects()的關(guān)系

  1. 這兩個(gè)方法的區(qū)別與當(dāng)前的 display 相關(guān), 當(dāng) display=inline 時(shí), .getClientRects() 返回當(dāng)前節(jié)點(diǎn)內(nèi)每一行文本的 ClientRect 對(duì)象數(shù)組, 此時(shí)數(shù)組長(zhǎng)度等于文本行數(shù)。
  2. 當(dāng) display != inline 時(shí), .getClientRects() 返回當(dāng)前節(jié)點(diǎn)的 ClientRect 對(duì)象數(shù)組,此時(shí)數(shù)組長(zhǎng)度為1.
  3. .getBoundingClientRect() 總是返回當(dāng)前節(jié)點(diǎn)的 ClientRect 對(duì)象, 注意這里是 ClientRect 對(duì)象而不是對(duì)象數(shù)組。

提示

以上測(cè)試, 可以通過(guò)在百度首頁(yè)執(zhí)行進(jìn)行測(cè)試, document.querySelect('#s_kw_wrap') 所獲取到的節(jié)點(diǎn)為百度首頁(yè)輸入框

希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaScript檢測(cè)原始值、引用值、屬性

    JavaScript檢測(cè)原始值、引用值、屬性

    這篇文章主要介紹了JavaScript檢測(cè)原始值、引用值、屬性的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • 詳解瀏覽器緩存和webpack緩存配置

    詳解瀏覽器緩存和webpack緩存配置

    這篇文章主要介紹了瀏覽器緩存和webpack緩存配置,瀏覽器緩存分為兩種類(lèi)型,強(qiáng)緩存和協(xié)商緩存,具體內(nèi)容詳情大家參考下本文
    2018-07-07
  • JavaScript實(shí)現(xiàn)數(shù)組去重的14種方法大全

    JavaScript實(shí)現(xiàn)數(shù)組去重的14種方法大全

    親愛(ài)的小伙伴,對(duì)于數(shù)組javascript中的數(shù)組去重方法你知道多少種呢?學(xué)會(huì)如何對(duì)數(shù)組進(jìn)行去重對(duì)于javascript的學(xué)習(xí)來(lái)說(shuō)也是十分重要的,下邊就讓我來(lái)分享一下我所知道的集中數(shù)組去重的方法吧,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2025-03-03
  • JS獲取多維數(shù)組中相同鍵的值實(shí)現(xiàn)方法示例

    JS獲取多維數(shù)組中相同鍵的值實(shí)現(xiàn)方法示例

    這篇文章主要介紹了JS獲取多維數(shù)組中相同鍵的值實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了JS數(shù)組遍歷、判斷、鍵值獲取等操作技巧,需要的朋友可以參考下
    2017-01-01
  • 前端強(qiáng)大的圖片預(yù)覽組件Viewer.js使用方法

    前端強(qiáng)大的圖片預(yù)覽組件Viewer.js使用方法

    這篇文章主要給大家介紹了關(guān)于前端強(qiáng)大的圖片預(yù)覽組件Viewer.js使用方法的相關(guān)資料,Viewer.js是一款強(qiáng)大的圖片查看器,雖然簡(jiǎn)單且易上手,但是卻并不影響其在圖片查看方面的強(qiáng)大功能,同時(shí)這款優(yōu)秀的插件配置操作起來(lái)也非常的方便,需要的朋友可以參考下
    2024-01-01
  • js實(shí)現(xiàn)的頁(yè)面加載完畢之前l(fā)oading提示效果完整示例【附demo源碼下載】

    js實(shí)現(xiàn)的頁(yè)面加載完畢之前l(fā)oading提示效果完整示例【附demo源碼下載】

    這篇文章主要介紹了js實(shí)現(xiàn)的頁(yè)面加載完畢之前l(fā)oading提示效果,結(jié)合完整實(shí)例形式分析了js頁(yè)面加載時(shí)顯示loading效果的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-08-08
  • JS綁定事件的3種方法舉例示范(簡(jiǎn)單易懂)

    JS綁定事件的3種方法舉例示范(簡(jiǎn)單易懂)

    在JavaScript的學(xué)習(xí)中我們經(jīng)常會(huì)遇到JavaScript的事件機(jī)制,例如事件綁定、事件監(jiān)聽(tīng)、事件委托(事件代理)等,這篇文章主要給大家介紹了關(guān)于JS綁定事件的3種方法,需要的朋友可以參考下
    2023-11-11
  • JS實(shí)現(xiàn)搜索框文字可刪除功能

    JS實(shí)現(xiàn)搜索框文字可刪除功能

    本文給大家分享一段js代碼實(shí)現(xiàn)搜索框文字可刪除功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2016-12-12
  • 微信小程序開(kāi)發(fā)之toast提示插件使用示例

    微信小程序開(kāi)發(fā)之toast提示插件使用示例

    這篇文章主要給大家介紹了微信小程序開(kāi)發(fā)之toast提示插件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-06-06
  • JS集合set類(lèi)的實(shí)現(xiàn)與使用方法示例

    JS集合set類(lèi)的實(shí)現(xiàn)與使用方法示例

    這篇文章主要介紹了JS集合set類(lèi)的實(shí)現(xiàn)與使用方法,結(jié)合具體實(shí)例形式分析了javascript集合的創(chuàng)建、元素添加、刪除以及并集、交集、補(bǔ)集等運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下
    2019-02-02

最新評(píng)論

彰化县| 屏边| 望都县| 兴城市| 上饶市| 岚皋县| 香河县| 湘乡市| 铜川市| 海伦市| 枣阳市| 雅江县| 固原市| 长治市| 界首市| 南昌市| 娱乐| 府谷县| 五家渠市| 仪征市| 新巴尔虎左旗| 岗巴县| 伊宁市| 肃南| 叙永县| 静乐县| 大庆市| 开化县| 正阳县| 潜江市| 都昌县| 博罗县| 神木县| 辽阳市| 东源县| 东乡县| 松原市| 涿州市| 锦州市| 宣恩县| 油尖旺区|