JavaScript中的各類寬高屬性

在js中,存在着N多的關於高度和寬度的屬性,好比:clientHeight、offsetHeight、scrollHeight、availHeight、scrollLeft、scrollTop、style.height、innerHeight、outerHeight、scree.height等等......這麼多,傻傻分不清也正常啊。
本文的目標:jquery

  1. 理清js及jquery的各類width和height瀏覽器

  2. 對width和高度作一些實際的應用安全

window和document

首先咱們來高清兩個概念:dom

  1. window和document的區別是什麼?ide

  2. window.location和document.location是同樣嗎?測試

第一個問題:spa

  • Window對象表示瀏覽器中打開的窗口;window對象能夠省略。好比alert()、window.alert()。code

  • Document對象是Window對象的一部分。那麼document.body 咱們能夠寫成window.document.body;瀏覽器的HTML文檔成爲Document對象。對象

第二問題:
window對象的location屬性引用的是Location對象,表示該窗口中當前顯示文檔的URL。
document的對象的location屬性也是引用了Location對象。
那意思是:事件

window.location === document.location;  //true

在一般狀況下同樣,frame也是同樣

與window相關的寬高介紹

與window相關的寬高有一下幾個:

  1. window.innerWidth,經過字面意思咱們知道這是一個內部的寬度

  2. window.innerHeight,內部的高度

  3. window.outWidth,外部的寬度

  4. window.outHeight,外部的高度

window.innerHeight和window.outHeight

圖片描述

我發如今Windows 10下Chrome和360安全瀏覽器不同、、、、(後面代碼測試部分)

window.innerWidth和window.outWidth

圖片描述

掛靠在window下的寬高還有window.screen, window.screen包含有關用戶屏幕的信息。它包括:

  • window.screen.width

  • window.screen.height

  • window.screen.availHeight

  • window.screen.availWidth

  • window.screenTop

  • window.screenLeft

圖解

圖片描述
圖片描述

window相關寬高代碼演示

演示代碼:

console.log("innerWidth=",innerWidth);
console.log("innerHeight=",innerHeight);
console.log("outerWidth=",outerWidth);
console.log("outerHeight=",outerHeight);

Chrome瀏覽器下效果
圖片描述
代碼:

console.info("screen.width=",screen.width);
console.info("screen.height=",screen.height);
console.info("screen.availWidth=",screen.availWidth);
console.info("screen.availHeight=",screen.availHeight);

在Chrome瀏覽器下效果
圖片描述

window相關寬高瀏覽器兼容問題

innerHeight和outerHeight是不支持IE9如下版本的,而screen系列則不存在兼容問題。

document下面client相關寬高介紹

docment下有三類屬性:

  1. 與client相關的寬高

  2. 與offset相關的寬高

  3. 與scroll相關的寬高

與client相關的寬高

與client相關的寬高又有以下幾個屬性:

  • document.body.clientWidth

  • document.body.clientHeight

  • document.body.clientLeft

  • document.body.clientTop

clientWidth和clientHeight
該屬性指的是元素的可視部分寬度和高度,即padding+contenr
若是沒有滾動條,即爲元素設定的高度和寬度。
若是出現滾動條,滾動條會遮蓋元素的寬高,那麼該屬性就是其原本寬高減去滾動條的寬高。

咱們來看以下代碼:

body{
     border: 20px solid #000;
     margin: 10px;
     padding: 40px;
     background: #eee;
     height: 350px;
     width: 500px;
     overflow: scroll;
}

console.log(document.body.clientHeight);    //430(padding*2+height)
console.log(document.body.clientWidth);     //580(padding*2+width)

咱們再看下面的代碼:

#mydiv{
      width: 200px;
      height: 200px;
      background: red;
      border: 1px solid #000;
      overflow: auto;
}

在DIV中添加文字知道出現滾動軸,這時候

var mydiv = document.getElementById("mydiv");
console.log("mydiv.clientHeight=",mydiv.clientHeight);    // 200
console.log("mydiv.clientWidth=",mydiv.clientWidth);      // 183(減去了滾動條的寬度)

而在Mac系統下,滾動條不佔高度,這時候client的寬度仍是200.

總結

  • 假入無padding無滾動條,clientWidth=style.width

  • 假若有padding無滾動軸,clientWidth=style.width+style.padding*2

  • 假若有padding有滾動,且滾動是顯示的,clientWidth=style.width+style.padding*2-滾動軸寬度

clientLeft和clientTop

這兩個返回的是元素周圍邊框的厚度,若是不指定一個邊框或者不定位該元素,他的值就是0.

咱們仍是以body爲例:

body{
     border: 20px solid #000;
     margin: 10px;
     padding: 40px;
     background: #eee;
     height: 350px;
     width: 500px;
     overflow: scroll;
}

console.log(document.body.clientLeft);    //20
console.log(document.body.clientTop);    //20

這一對屬性是用來讀取元素的body的寬度和高度的

  • clientTop=border-top的border-width

  • clientLeft=border-left的border-width

與offset相關寬高介紹

與offset相關的寬高又有以下幾個屬性:

  • document.body.offsetWidth

  • document.body.offsetHeight

  • document.offsetLeft

  • document.offsetTop

offsetWidth與offsetHeight
這一對屬性指的是元素的border+padding+content的寬度和高度。

該屬性和其內部的內容是否超出元素大小無關,只和原本設定的border以及width和height有關。
咱們仍是以body爲例:

body{
     border: 20px solid #000;
     margin: 10px;
     padding: 40px;
     background: #eee;
     height: 350px;
     width: 500px;
     overflow: scroll;
}

console.log("offsetWidth=",document.body.offsetWidth); 
//620(width+margin*2+padding*2+border*2)
console.log("offsetHeight=",document.body.offsetHeight);    
//470(width+margin*2+padding*2+border*2)

總結

  • 假如無padding無滾動條無border:

    • offsetWidth=clientWidth=style.width

  • 假若有padding無滾動條有border:

    • offsetWidth=style.width+style.padding2+(border-width)2

    • offsetWidth=clientWidth+border寬度*2

  • 假若有padding有滾動條,且滾動條是顯示的,有border:

    • offsetWidth=style.width+style.padding2+(border-width)2

    • offsetWidth=clientWidth+滾動條寬度+border寬度*2

offsetLeft和offsetTop
這兩個屬性是基於offsetParent的,瞭解這兩個屬性咱們必須先了解它,什麼是offsetParent呢?

  1. 若是當前元素的父級元素沒有進行CSS定位(position爲absolute或relative),offsetParent爲border.

  2. 假如當前元素的父級元素中有CSS定位,offsetParent取最近的那個父級元素。

在IE6/7中:
offsetLeft=(offsetParent的padding-left)+(當前元素的margin-left)

在IE8/9/10及Chrome中:
offsetLeft=(offsetParent的margin-left)+(offsetParent的border寬度)+(offsetParentd的padding-left)+(當前元素的margin-left)

在FireFox中:
offsetLeft=(offsetParent的margin-left)+(當前元素的margin-left)+(offsetParent的padding-left)

、、、、看到這裏是否是已經懵逼了?、、、仍是舉例子吧:

CSS:

body{
    border: 20px solid #000;
    margin: 10px;
    padding: 40px;
    background: #eee;
    height: 350px;
    width: 500px;
}
#mydiv{
    width: 400px;
    height: 200px;
    padding: 20px;
    margin :10px;
    background: #f60;
    border: 20px solid #888;
}

在IE8/910及Chrome中
mydiv.offsetLeft = 80
mydiv.offsetTop = 80

在火狐中
mydiv.offsetLeft = 60
mydiv.offsetTop = 60

在IE低版本IE6/7中是
mydiv.offsetLeft = 50
mydiv.offsetTop = 50

與scroll相關寬高介紹

與scroll相關的寬高屬性有以下幾個:

  • document.body.scrollWidth

  • document.body.scrollHeight

  • document.body.scrollLeft

  • document.body.scrollTop

scrollWidth和scrollHeight
document.body的scrollWidth和scrollHeight與div的scrollWidth和scrollHeight是有區別的。

咱們先來看看document.body的scrollWidth和scrollHeight:

  1. 給定寬高小於瀏覽器窗口

    • scrollWidth一般是瀏覽器窗口的寬度

    • scrollHeight一般是瀏覽器窗口的高度

  2. 給定寬高大於瀏覽器窗口,且內容小於給定寬高

    • scrollWidth給定的寬度+其全部padding、margin和border

    • scrollHeight給定的高度+其全部的padding、margin和border

  3. 給定寬高大於瀏覽器窗口,且內容大於給定寬高

    • scrollWidth內容寬度+其全部的padding、margin和border

    • scrollHeight內容高度+其全部的padding、margin和border

再來看看在某div中scrollWidth和scrollHeight:

  • 在無滾動軸的時候
    圖片描述

scrollWidth==clientWidth=style.width+style.padding*2

  • 在有滾動軸的時候
    圖片描述

scrollWidth==實際內容的寬度+padding*2
scrollHeight==實際內容的高度+padding*2

scrollLeft和scrollTop
這對屬性是可讀寫(可被從新賦值) 的,指的是當元素其中的內容超出其寬高的時候,元素被捲起來的高和寬度。
obj.style.width和obj.style.height
對於一個dom元素,它的style屬性返回的是一個對象,這個對象中的任意一個屬性是可讀寫的,style.width等於CSS屬性中的寬度style.height等於CSS屬性中的高度。

Event對象的5種座標

哪五種座標?

  1. clientX和clientY,相對於瀏覽器(但是區左上角0,0)的座標

  2. screenX和screenY,相對於設備屏幕左上角(0,0)的座標

  3. offsetX和offsetY,相對於事件源左上角(0,0)的座標

  4. pageX和pageY,相對於整個網頁左上角(0,0)的座標

  5. X和Y,原本是IE屬性,相對於用CSS動態定位的最內層包容元素


本文內容整理自慕課網課程《JS/jQuery寬高的理解和應用》課程講解和PPT

相關文章
相關標籤/搜索