亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JS中獲取 DOM 元素的絕對位置實例詳解

2024-05-06 16:43:54
字體:
來源:轉載
供稿:網友

在操作頁面滾動和動畫時經常會獲取 DOM 元素的絕對位置,例如 本文 左側的懸浮導航,當頁面滾動到它以前會正常地渲染到文檔流中,當頁面滾動超過了它的位置,就會始終懸浮在左側。

本文會詳述各種獲取 DOM 元素絕對位置 的方法以及對應的兼容性。關于如何獲取 DOM 元素高度和滾動高度,請參考視口的寬高與滾動高度 一文。

概述

這些是本文涉及的 API 對應的文檔和標準,供查閱:

 

API 用途 文檔 標準
offsetTop 相對定位容器的位置 MDN CSSOM View Module
clientTop 上邊框寬度 MDN CSSOM View Module
.getBoundingClientRect() 元素大小和相對視口的位置 MDN CSSOM View Module
.getClientRects() 所有子 CSS 盒子的大小和位置 MDN CSSOM View Module
.getComputedStyle() 應用所有樣式表和計算之后的 CSS 屬性 MDN DOM Level 2 Style CSSOM

 

offsetTop/offsetLeft

HTMLElement.offsetTop 用來獲取當前元素(不包括上邊框)相對于定位容器(positioning container)的位置。也就是說,

如果所有祖先元素都是靜態定位 position:static;(這是默認的情況),offsetTop 表示與文檔最上方的高度差(文檔最上方可能已經滾出視口,這個高度可能大于視口高度)。

如果存在絕對定位的祖先元素 position:absolute/fixed,offsetTop 就會相對于這個元素。因此為了獲取相對于文檔最上方的高度差,需要遞歸地調用:

function getOffsetTop(el){ return el.offsetParent  ? el.offsetTop + getOffsetTop(el.offsetParent)  : el.offsetTop}

el.offsetParent 是當前元素的定位容器(positioning container),如果當前元素沒有絕對定位的祖先節點,這個屬性的值就是 null

兼容性和限制:幾乎所有瀏覽器都支持該屬性。如果元素被隱藏它的值就是 0,但在 IE9 下沒有影響。

clientTop/clientLeft

不要被名字誤導,Element.clientTop 是指當前元素的 上邊框的寬度 的整數值??偸堑扔?getComputedStyle() 返回的 border-top-width 屬性的四舍五入為整數后的值。

為什么呢?在 DOM 術語中,client 總是指除邊框(border)外的渲染盒子(內邊距+內容大?。ffset 總是指包含邊框的渲染盒子(邊框+內邊距+內容大?。?,clientTop 即為這兩者的 Top 之差,即邊框寬度。盒子的概念請參考:CSS Display 屬性與盒模型

兼容性和限制:同 offsetTop/offsetLeft

.getBoundingClientRect()

Element.getBoundingClientRect() 用于獲取元素的大小,以及相對于視口(viewport)的位置,返回一個 DOMRect 對象。

> document.querySelector('span').getBoundingClientRect()DOMRect {x: 2.890625, y: 218.890625, width: 1264, height: 110, top: 218.890625, …}bottom: 328.890625height: 110left: 2.890625right: 1266.890625top: 218.890625width: 1264x: 2.890625y: 218.890625

如果要獲取相對于文檔左上角的位置,需要在上述 topleft 的基礎上再加滾動位置。如下代碼來自 MDN,可兼容幾乎所有瀏覽器:

// For scrollX(((t = document.documentElement) || (t = document.body.parentNode)) && typeof t.scrollLeft == 'number' ? t : document.body).scrollLeft// For scrollY(((t = document.documentElement) || (t = document.body.parentNode)) && typeof t.scrollTop == 'number' ? t : document.body).scrollTop

兼容性和限制:同樣是 CSSOM View Module 的特性,但幾乎兼容所有瀏覽器,可參考

https://caniuse.com/#feat=getboundingclientrectIE 下窗口的左上角可能不是 0,0,在 IE9 可以這樣把它設置為 0,0:

<meta http-equiv="x-ua-compatible" content="ie=edge"/>

.getClientRects()

Element.getClientRects() 用來獲得 DOM 元素中的所有CSS 盒模型 對應的 DOMRect 組成的集合。

如果是一個塊級元素,返回的集合中應該只有一個元素,即這個塊的大小和位置。但如果是一個行內元素(或者 SVG 內的元素),則會返回其中每個 CSS 盒子。比如一個普通的被默認折行的 <span>

> document.querySelector('span').getClientRects()DOMRectList {0: DOMRect, 1: DOMRect, 2: DOMRect, length: 5}0: DOMRect {x: 2.890625, y: 262.890625, width: 1264, height: 22, top: 262.890625, …}1: DOMRect {x: 2.890625, y: 284.890625, width: 1264, height: 22, top: 284.890625, …}2: DOMRect {x: 2.890625, y: 306.890625, width: 768, height: 22, top: 306.890625, …}

這個 <span> 有三行,其中第三行的長度不足一行,每次折行都形成了一個新的 CSS 盒子。

兼容性和限制:在 IE8 及以下會返回 IE 獨有的 TextRectangle 對象(而不是 ClientRect),這個對象不具有 widthheight 屬性,而且無法給它設置屬性。參考:https://webplatform.github.io/docs/dom/HTMLElement/getClientRects/

.getComputedStyle()

Window.getComputedStyle() 可以得到一個元素的所有計算后的 CSS 屬性。對于簡單的絕對定位元素,可以通過這個 API 返回的 topleft 等屬性值獲取元素的位置。例如:

let btn = document.querySelector('#btn-scroll-up')let {top, left} = getComputedStyle(btn)console.log('top:', top, 'left:', left)

.getComputedStyle() 還有一個有用的用法,獲取偽元素的大小和位置等樣式信息:

// 以下代碼來自: https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStylevar h3 = document.querySelector('h3'); var result = getComputedStyle(h3, ':after').content;console.log('the generated content is: ', result); // returns ' rocks!'

兼容性和限制:.getComputedStyle() 幾乎兼容所有瀏覽器,可參考 https://caniuse.com/#search=getComputedStyle。但它返回的值是 CSS 屬性,用它獲取絕對位置時要注意值的類型。例如 left 可能是 13px 這樣的絕對值,也可能是 auto 這樣的 CSS 關鍵字。

總結 獲取 DOM 元素相對于文檔的位置,可以直接使用 offsetTop; 獲取 DOM 元素相對于視口的位置,可以使用 .getBoundingClientRect(); 獲取 SVG 元素或行內元素的 CSS 盒子(比如用來做文本高亮時),可以使用 .getClientRects(); 獲取絕對定位元素、偽元素的渲染后 CSS 屬性,可以使用 .getComputedStyle()

總結

以上所述是小編給大家介紹的JS中獲取 DOM 元素的絕對位置實例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品视频中文在线观看| 欧美日韩精品二区| 久热99视频在线观看| 久久综合久久美利坚合众国| 日韩免费观看av| 理论片在线不卡免费观看| 伊人久久免费视频| 亚洲一区二区三区视频播放| 亚洲最大的免费| 久久精品在线播放| 日韩一区二区三区在线播放| 这里只有精品久久| 亚洲美女久久久| 久久成人人人人精品欧| 欧美国产在线电影| 久久精品亚洲94久久精品| 亚洲精品日韩激情在线电影| 久久久久久久久网站| 91亚洲va在线va天堂va国| 国产成人精彩在线视频九色| 中文字幕综合一区| 亚洲国产中文字幕久久网| 亚洲精品美女久久久| 精品伊人久久97| 国产精品男人爽免费视频1| 中文字幕一精品亚洲无线一区| 日韩欧美精品网址| 久久成人精品一区二区三区| 亚洲综合精品伊人久久| 91免费看片网站| 国产精品中文字幕在线| 欧美大片va欧美在线播放| 亚洲视频电影图片偷拍一区| 欧美视频一区二区三区…| 国产精品久久久久久久久久新婚| 国产一区二区三区免费视频| 久久视频在线直播| 亚洲电影第1页| 欧美高清videos高潮hd| 国产欧美精品一区二区三区-老狼| 国产激情久久久久| 国产成人极品视频| 精品一区二区三区四区在线| 欧美日韩美女在线| 欧美xxxx18国产| 国产精品偷伦视频免费观看国产| 欧美日韩免费网站| 久久久亚洲精品视频| 欧美日韩另类视频| 91国语精品自产拍在线观看性色| 国产精品久久久久久久app| 国产亚洲精品久久久久久| 国产精品久久99久久| 久久视频精品在线| 欧美黄色www| 欧美亚洲视频在线观看| 成人欧美一区二区三区黑人| 国产精品视频网站| 精品视频在线播放免| 日韩一区二区三区国产| 国产成人在线一区| 日韩电影视频免费| 成人综合国产精品| 国产成人午夜视频网址| 伊人久久综合97精品| 亚洲欧美成人一区二区在线电影| 欧美电影免费观看| 欧美精品999| 欧美激情一二三| 久久久久成人精品| 91视频免费网站| 国产99久久精品一区二区 夜夜躁日日躁| 午夜免费在线观看精品视频| 亚洲国产精品悠悠久久琪琪| 欧美性猛交xxxx乱大交蜜桃| 亚洲国产精品成人一区二区| 日韩精品在线观看一区| 国产精品18久久久久久麻辣| 国产精品一区电影| 国产精品毛片a∨一区二区三区|国| 国产精品入口免费视频一| 中文字幕久热精品视频在线| 国产精品久久久久久婷婷天堂| 亚洲综合在线中文字幕| 欧美午夜片欧美片在线观看| 日韩在线观看精品| 日韩暖暖在线视频| 久久久国产在线视频| 成人久久久久久久| 亚洲2020天天堂在线观看| 欧美成人第一页| 中文字幕在线看视频国产欧美在线看完整| 国产不卡在线观看| 97香蕉久久夜色精品国产| 欧美另类精品xxxx孕妇| 91精品在线影院| 精品久久香蕉国产线看观看亚洲| 中文字幕在线看视频国产欧美在线看完整| 国产成人综合精品| 久久久精品视频成人| 欧美一级在线亚洲天堂| 久久精品成人欧美大片古装| 98视频在线噜噜噜国产| 久久不射电影网| 亚洲日韩第一页| 欧美—级a级欧美特级ar全黄| 成人免费视频97| 国内精品在线一区| 上原亚衣av一区二区三区| 久久久国产影院| 中文字幕精品国产| 国产免费一区视频观看免费| 国产成人亚洲综合91| 欧美夫妻性生活xx| 国产精品成熟老女人| 国产亚洲精品久久久久久| 久久久久久久久久久亚洲| 欧美日韩一区二区三区| 国产精品爽爽ⅴa在线观看| 久久久av亚洲男天堂| 国产精品福利无圣光在线一区| 中文字幕亚洲一区在线观看| 国产日韩欧美另类| 中文国产亚洲喷潮| 国产日韩在线一区| 亚洲黄色www网站| 国产精品吊钟奶在线| 欧美另类在线播放| 国产成人精品电影久久久| 亚洲深夜福利视频| 欧美激情视频网站| 97在线观看视频| 国产视频精品一区二区三区| 日韩成人在线免费观看| 国产一区二区动漫| 国产欧美最新羞羞视频在线观看| 精品久久久久久国产91| 欧美二区在线播放| 欧美视频不卡中文| 96pao国产成视频永久免费| 国产成人免费91av在线| 日韩电影网在线| 亚洲区在线播放| 亚洲视屏在线播放| 亚洲国产精彩中文乱码av| 尤物九九久久国产精品的特点| 国产一区二区色| 亚洲激情视频在线播放| 国产91色在线|免| 国产精品自拍视频| 欧美噜噜久久久xxx| 国内精品美女av在线播放| 欧美又大又硬又粗bbbbb| 俺也去精品视频在线观看| 亚洲一区二区国产| 精品国产老师黑色丝袜高跟鞋| 国产成人高潮免费观看精品| 国产视频999| 91麻豆国产语对白在线观看| 欧美激情成人在线视频| 国产69精品久久久久99| 一区二区欧美在线| 在线成人中文字幕| 欧美在线视频在线播放完整版免费观看|