JavaScript -- 元素大小和位置

JavaScript 操作 DOM 的過程中我們可能需要經常獲取一個元素的大小,在處理鼠標事件的時候可能需要知道當前鼠標的點擊位置,所以我將我在開發(fā)過程中使用的一些相關屬性記錄下來。

1. 偏移量

如果我們想知道一個元素相對于其父元素的偏移量,可以用以下幾個屬性獲取到我們想要的數(shù)值。

  • offsetHeight: 元素在垂直方向上占用的空間大小,包括元素內容的高度,內邊距的高度以及邊框的高度。
  • offsetWidth: 元素在水平方向上占用的空間大小,包括元素的寬度,內邊距的寬度以及邊框的寬度。
  • offsetLeft: 元素的左外邊框到父元素的左內邊框的距離。
  • offsetTop: 元素的上外邊框到父元素的上內邊框的距離。
  • offsetParent: 當前元素的父元素。

如果想計算出一個元素相對于整個頁面的偏移量,那我們可以使用 offsetParent 協(xié)助完成,比如獲取一個元素相對于頁面的 offsetLeft。

    function getLeft(element) {
        var left = element.offsetLeft;
        var current = element.offsetParent;

        while(current !== null) {
            left += current.offsetLeft;
            current = current.offsetParent;
        }

        return left;
    }

當然,如果想獲取一個元素相對于整個頁面的 offsetTop,也可以使用同樣的方式。

2. 客戶區(qū)大小

有的時候我們想要知道用戶的瀏覽器到底有多寬,有多高,這就需要借助于 clientWidthclientHeight 了。clientWidth 返回的是元素的內容寬度與內邊距寬度相加之和,clientHeight 返回的是元素的的內容高度與內邊距高度相加之和。

可見,相比于上面介紹的 offsetWidthoffsetHeight,clientHeightclientWidth 省略了邊框的寬度。所以其實我們可以通過這兩種方式計算用戶的瀏覽器視口大小。

    function getViewPort() {
        return {
            width: document.documentElement.clientWidth,
            height: document.documentElement.clientHeight
        };
    }

當然,我們也可以使用另一種方式

    function getViewPort() {
        return {
            width: document.documentElement.offsetWidth,
            height: document.documentElement.offsetHeight
        };
    }

不過值得注意的是,這兩種方法是存在差異的,當 html 元素沒有充滿整個瀏覽器視口的時候,使用偏移量的方法會返回 html 的實際高度和寬度,而 clientWidthclientHeight 會返回當前瀏覽器的可見區(qū)域大小,所以說對于 html 未充滿屏幕的時候,我們想達到計算瀏覽器視口大小的功能,也可以添加如下 CSS 代碼。

    html, body {
        height: 100%;
    }

3. 滾動大小

當實現(xiàn)瀑布流的時候可能會用到滾動屬性,因為我們的數(shù)據(jù)不是一次性就加載完畢的,而是隨著用戶的滾動而動態(tài)的加載數(shù)據(jù)。下面是四個與滾動大小有關的屬性。

  • scrollHeight: 如果在沒有滾動條的情況下,該屬性和 clientHeight 返回值相同,即內容的高度與內邊距的高度之和,不包含邊框高度。如果存在滾動條,該屬性等于 scrollTop + clientHeight
  • scrollWidth: 計算方式和 scrollHeight 相同。
  • scrollTop: 被隱藏在內容區(qū)域上方的像素數(shù),通過這個屬性可以設置元素的滾動位置。說直白點這個屬性的值就是元素的總高度 - 元素的內容寬度 - 元素的 padding
  • scrollLeft: 被隱藏在內容區(qū)域左方的像素數(shù),通過這個屬性可以設置元素的滾動位置。

不過值得注意的是, 如果我們想取得當前頁面的滾動位置時,在 Opera, Chrome 都可以通過 document.body.scrollTop 來獲取,但是這個方法在 Firefox 需要通過 document.documentElement.scrollTop 來獲取。所以我們可以投機取巧的采用以下方法獲取當前瀏覽器的滾動位置。

    function getScrollTop() {
        var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
        return scrollTop;
    }

4. 關于位置

  • clientXclientY 是相對于視口的位置。
  • pageXpageY 在沒有滾動的情況下和 clientX, clientY 是相等的,如果包含滾動的話, pageX = clientX + scrollLeft , pageY = clientY + scrollTop。
  • screenXscreenY 就不是相對于瀏覽器視口的位置了,而是相對于用戶的整個計算機屏幕。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,619評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,155評論 3 425
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,635評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,539評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,255評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,646評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,838評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 49,399評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,146評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,338評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,565評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,983評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,257評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,059評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,296評論 2 376

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,779評論 1 92
  • 在一些復雜的頁面中經常會用JavaScript處理一些DOM元素的動態(tài)效果,這種時候我們經常會用到一些元素位置和尺...
    深沉的簡單閱讀 885評論 0 0
  • HTML精確定位:scrollLeft,scrollWidth,clientWidth,offsetWidth s...
    brightranger閱讀 977評論 0 1
  • Window和document對象的區(qū)別 window對象window對象表示瀏覽器中打開的窗口window對象是...
    FConfidence閱讀 2,228評論 0 5
  • 我出生的時候,因為是女孩,差點兒被送到別家收養(yǎng),因為媽媽舍不得,被留了下來,寄養(yǎng)在伯父家。 因...
    李連十三閱讀 257評論 6 1