JavaScript -- 元素大小和位置

JavaScript 操作 DOM 的過程中我們可能需要經(jīng)常獲取一個元素的大小癣朗,在處理鼠標(biāo)事件的時候可能需要知道當(dāng)前鼠標(biāo)的點(diǎn)擊位置财松,所以我將我在開發(fā)過程中使用的一些相關(guān)屬性記錄下來奋单。

1. 偏移量

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

  • offsetHeight: 元素在垂直方向上占用的空間大小岁钓,包括元素內(nèi)容的高度佃扼,內(nèi)邊距的高度以及邊框的高度偎巢。
  • offsetWidth: 元素在水平方向上占用的空間大小,包括元素的寬度兼耀,內(nèi)邊距的寬度以及邊框的寬度压昼。
  • offsetLeft: 元素的左外邊框到父元素的左內(nèi)邊框的距離。
  • offsetTop: 元素的上外邊框到父元素的上內(nèi)邊框的距離瘤运。
  • offsetParent: 當(dāng)前元素的父元素窍霞。

如果想計算出一個元素相對于整個頁面的偏移量,那我們可以使用 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;
    }

當(dāng)然,如果想獲取一個元素相對于整個頁面的 offsetTop郁季,也可以使用同樣的方式冷溃。

2. 客戶區(qū)大小

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

可見凿歼,相比于上面介紹的 offsetWidthoffsetHeightclientHeightclientWidth 省略了邊框的寬度冗恨。所以其實(shí)我們可以通過這兩種方式計算用戶的瀏覽器視口大小答憔。

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

當(dāng)然,我們也可以使用另一種方式

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

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

    html, body {
        height: 100%;
    }

3. 滾動大小

當(dāng)實(shí)現(xiàn)瀑布流的時候可能會用到滾動屬性,因?yàn)槲覀兊臄?shù)據(jù)不是一次性就加載完畢的土童,而是隨著用戶的滾動而動態(tài)的加載數(shù)據(jù)诗茎。下面是四個與滾動大小有關(guān)的屬性。

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

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

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

4. 關(guān)于位置

  • clientXclientY 是相對于視口的位置。
  • pageXpageY 在沒有滾動的情況下和 clientX弓坞, clientY 是相等的割去,如果包含滾動的話, pageX = clientX + scrollLeft , pageY = clientY + scrollTop昼丑。
  • screenXscreenY 就不是相對于瀏覽器視口的位置了,而是相對于用戶的整個計算機(jī)屏幕夸赫。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末菩帝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子茬腿,更是在濱河造成了極大的恐慌呼奢,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件切平,死亡現(xiàn)場離奇詭異握础,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)悴品,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門禀综,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人苔严,你說我怎么就攤上這事定枷。” “怎么了届氢?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵欠窒,是天一觀的道長。 經(jīng)常有香客問我退子,道長岖妄,這世上最難降的妖魔是什么型将? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮荐虐,結(jié)果婚禮上七兜,老公的妹妹穿的比我還像新娘。我一直安慰自己缚俏,他們只是感情好惊搏,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著忧换,像睡著了一般恬惯。 火紅的嫁衣襯著肌膚如雪扁远。 梳的紋絲不亂的頭發(fā)上沛申,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音煮嫌,去河邊找鬼刹缝。 笑死碗暗,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的梢夯。 我是一名探鬼主播言疗,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼颂砸!你這毒婦竟也來了噪奄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤人乓,失蹤者是張志新(化名)和其女友劉穎勤篮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體色罚,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碰缔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了戳护。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片金抡。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖腌且,靈堂內(nèi)的尸體忽然破棺而出竟终,到底是詐尸還是另有隱情,我是刑警寧澤切蟋,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布统捶,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏喘鸟。R本人自食惡果不足惜匆绣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望什黑。 院中可真熱鬧崎淳,春花似錦、人聲如沸愕把。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恨豁。三九已至嚣镜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間橘蜜,已是汗流浹背菊匿。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留计福,地道東北人跌捆。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像象颖,于是被迫代替她去往敵國和親佩厚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案说订? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,728評論 1 92
  • 在一些復(fù)雜的頁面中經(jīng)常會用JavaScript處理一些DOM元素的動態(tài)效果可款,這種時候我們經(jīng)常會用到一些元素位置和尺...
    深沉的簡單閱讀 845評論 0 0
  • HTML精確定位:scrollLeft,scrollWidth,clientWidth,offsetWidth s...
    brightranger閱讀 942評論 0 1
  • Window和document對象的區(qū)別 window對象window對象表示瀏覽器中打開的窗口window對象是...
    FConfidence閱讀 2,159評論 0 5
  • 我出生的時候,因?yàn)槭桥⒖寺欤铧c(diǎn)兒被送到別家收養(yǎng),因?yàn)閶寢屔岵坏媒钐郑涣袅讼聛戆0龋酿B(yǎng)在伯父家。 因...
    李連十三閱讀 247評論 6 1