詳解JavaScript三大家族

妹子.jpg

offset、scroll還有client這三個屬性總是讓人頭疼,好不容易記下沒過多久就又忘了晤碘。担平。。這次好好總結(jié)一下(@_@;)~

為了讓文章更顯而易見一點蹦哼,我們先定義段代碼:

  <div class="box">
      <div class="box1"></div>
  </div>
  <div class="box2"></div>

如上所示,我們有三個盒子。
然后再來定義樣式:

        .box {
            width: 300px;
            height: 300px;
            margin: 0 auto;
            padding: 50px 100px;
            background-color: orange;
            position: relative;
        }
        .box1 {
            width: 100px;
            height: 100px;
            border: 10px solid transparent;
            background-color: green;
        }
        .box2 {
            width: 100px;
            height: 100px;
            background-color: blue;
            position: absolute;
            left: 250px;
            top: 200px;
        }

這樣沦零,我們就可以得到如下的頁面:


template.png

其中橙色的box是最外一層的大盒子,包含著綠色的box1货岭,藍(lán)色的box2和box在同一級路操。
好了,有了上面這個簡單(丑陋)的頁面千贯,我們就可以好好的來研究一下了~


offset系列

打印出上面每個盒子對應(yīng)offset系列的屬性值:


offsetLog.png

由上圖我們可以看出屯仗,offsetWidth返回的是元素包含padding和border的寬度,offsetHeight一樣搔谴,只不過返回的是高度而已魁袜,但offsetLeftoffsetTap返回的值不太明顯,但其實仔細(xì)看敦第,會發(fā)現(xiàn)他們返回的都是相對于offsetParent元素的值峰弹,當(dāng)offsetParent為body時,返回相對body的距離芜果,offsetParent為box時鞠呈,返回相對于box的距離。

我們來查看一下offset系列屬性的定義:

  • offsetWidth: 只讀屬性右钾,返回一個元素的布局寬度蚁吝,包括邊框(border)、內(nèi)邊距(padding)霹粥、內(nèi)容(content)和豎直滾動條的寬度(如果有的話)灭将。
  • offsetHeight:只讀屬性,返回一個元素的像素高度后控,包括邊框(border)庙曙、內(nèi)邊距(padding)、內(nèi)容(content)和豎直滾動條的寬度(如果有的話)浩淘。
  • offsetLeft:只讀屬性捌朴,返回元素相對于offsetParent元素的左邊界對應(yīng)的像素值吴攒。
  • offsetTop: 只讀屬性,返回元素相對于offsetParent元素的頂部距離砂蔽。
  • offsetParent:只讀屬性洼怔,返回一個指向最近的包含該元素的定位元素。

這樣就很清楚了左驾,不過怎么知道offsetWidth會包含滾動條的寬度镣隶?
其實很簡單,在box的樣式里加一行代碼:

.box {
  overflow: hidden;
}

這樣就好了诡右,最后打印的結(jié)果并沒有變化安岂。

對了, 還有offsetParent屬性帆吻,如果沒有定位的父元素怎么辦呢域那?

由上面的例子可以看出,如果沒有定位的父元素猜煮,則默認(rèn)是body元素次员。

其實按照MDN的說法,如果沒有定位的父元素王带,則offsetParent為最近的table淑蔚、table-cell或根元素(body元素)。

最后愕撰,要注意的是:

offsetTop和offsetLeft在計算時不考慮父元素的邊框


scroll系列

我們還是先打印出scroll系列屬性的值來看看~


scrollLog.png

\

乍一看好像和offset沒啥區(qū)別束倍。。盟戏。不過仔細(xì)看看,會發(fā)現(xiàn)scrollWidthscrollHeight不會計算元素的邊框(border)甥桂。

但是scrollTopscrollLeft一直是0是什么鬼呢( ??? )?柿究?

想不出原因的話,我們讓元素滾動一下試試~(畢竟scroll黄选,scroll蝇摸,一直在叫我們滾嘛。办陷。貌夕。( ╯□╰ )囧)
給之前的樣式表添加如下樣式:

        .box {
            overflow: scroll;
        }
        .box1 {
            height: 1000px;
        }

就是給box加了個滾動條,把box1的高度改為了1000px民镜。

現(xiàn)在我們的圖就是這樣了:

image.png

為了看清楚scrollTop的值啡专,為box元素添加事件監(jiān)聽器,讓box在滾動的時候打印一下scrollTop~

box.addEventListener("scroll", function(e) {
    console.log("scrollTop", this.scrollTop);
});

可以得到如下的結(jié)果:


image.png

當(dāng)我從上向下移動滾動條的時候制圈,scrollTop的值在逐漸增大们童。

這下明白了畔况,原來scrollTop獲得的是元素滾動的距離。換句話說慧库,也就也是豎直滾動條到元素頂部的距離跷跪。

scrollLeft類似,就不再說了齐板。

做個小總結(jié):

  • scrollWidth: 只讀屬性吵瞻。一個元素內(nèi)容寬度的度量,包括由于溢出導(dǎo)致的視圖中不可見內(nèi)容(不包括滾動條和border)甘磨。
  • scrollHeight: 只讀屬性橡羞。一個元素內(nèi)容高度的度量,包括由于溢出導(dǎo)致的視圖中不可見內(nèi)容(不包括滾動條和border)宽档。
  • scrollTop: 讀取元素滾動條到元素頂部的距離(不包括滾動條和border)
  • scrollLeft: 讀取元素滾動條到元素左邊的距離(不包括滾動條和border)

這里補(bǔ)充一下:

offset系列屬性是包含滾動條的尉姨。


client系列

直接看結(jié)果:


image.png

可以看到,clientHeight和clientWidth和offset差不多吗冤,只不過不包含邊框的值(也不包含滾動條)又厉。

而clientTop和clientLeft則返回了元素的邊框?qū)挾取?/p>

MDN的描述如下:

  • clientHeight: 只讀屬性,對于沒有定義CSS或者內(nèi)聯(lián)布局盒子的元素為0椎瘟,同時它是元素內(nèi)部的高度(單位像素)覆致,包含內(nèi)邊距,但不包括水平滾動條肺蔚、邊框和外邊距煌妈。
  • clientWidth: 元素的內(nèi)部寬度,以像素計宣羊。該屬性包括內(nèi)邊距璧诵,但不包括垂直滾動條(如果有)、邊框和外邊距仇冯。
  • clientTop: 只讀元素之宿,一個元素頂部邊框的寬度(以像素表示)。不包括頂部外邊距或內(nèi)邊距苛坚。
  • clientLeft: 表示一個元素的左邊框的寬度比被,以像素表示。

要注意的是:

如果元素的文本方向是從右向左(RTL, right-to-left)泼舱,并且由于內(nèi)容溢出導(dǎo)致左邊出現(xiàn)了一個垂直滾動條等缀,則該屬性包括滾動條的寬度。


最后娇昙,我們拓展一點內(nèi)容

  1. 關(guān)于event事件的幾個屬性
    • clientXclientY: 相對于瀏覽器(可視區(qū)左上角0,0)的坐標(biāo)尺迂,不包含滾動區(qū)域。
    • screenXscreenY: 相對于設(shè)備屏幕左上角(0,0)的坐標(biāo)。
    • offsetXoffsetY: 相對于事件源左上角(0,0)的坐標(biāo)枪狂,不包括border危喉。
    • pageXpageY: 相對于整個網(wǎng)頁左上角(0,0)的坐標(biāo),包含滾動區(qū)域州疾。
  2. window相關(guān)寬高屬性
    • window.outerHeight:獲取整個瀏覽器窗口的高度(單位:像素)辜限,包括側(cè)邊欄(如果存在)、窗口鑲邊(window chrome)和窗口調(diào)正邊框严蓖。包含調(diào)試窗及瀏覽器邊框
    • window.outerWidtht:表示整個瀏覽器窗口的寬度薄嫡,包括側(cè)邊欄(如果存在)、窗口鑲邊(window chrome)和調(diào)正窗口大小的邊框颗胡。包含調(diào)試窗及瀏覽器邊框
    • window.innerHeight:瀏覽器窗口的視口(viewport)高度(以像素為單位)毫深,如果存在水平滾動條,則包括它毒姨。不包含調(diào)試窗及瀏覽器邊框
    • window.innerWidth:瀏覽器視口(viewport)寬度(單位:像素)哑蔫,如果存在垂直滾動條則包括它。不包含調(diào)試窗及瀏覽器邊框
    • window.screen.width:聲明了顯示當(dāng)前瀏覽器的屏幕的寬度弧呐,以像素計
    • *window.screen.height:聲明了顯示當(dāng)前瀏覽器的屏幕的高度闸迷,以像素計
    • *window.screen.availHeight:聲明了顯示瀏覽器的屏幕的可用高度,以像素計俘枫。除去我們底部任務(wù)欄外的屏幕高度
    • *window.screen.availWidth:聲明了顯示瀏覽器的屏幕的可用寬度腥沽,以像素計
    • *window.screenLeft:只讀屬性,返回窗口的左上角在屏幕上的x坐標(biāo)鸠蚪。在Firefox等瀏覽器中使用的是screenX屬性今阳。
    • *window.screenTop:只讀屬性,返回窗口的左上角在屏幕上的y坐標(biāo)茅信。在Firefox等瀏覽器中使用的是screenY屬性盾舌。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蘸鲸,隨后出現(xiàn)的幾起案子矿筝,更是在濱河造成了極大的恐慌,老刑警劉巖棚贾,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異榆综,居然都是意外死亡妙痹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門鼻疮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怯伊,“玉大人,你說我怎么就攤上這事判沟」⑶郏” “怎么了崭篡?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吧秕。 經(jīng)常有香客問我琉闪,道長,這世上最難降的妖魔是什么砸彬? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任颠毙,我火速辦了婚禮,結(jié)果婚禮上砂碉,老公的妹妹穿的比我還像新娘蛀蜜。我一直安慰自己,他們只是感情好增蹭,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布滴某。 她就那樣靜靜地躺著,像睡著了一般滋迈。 火紅的嫁衣襯著肌膚如雪霎奢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天杀怠,我揣著相機(jī)與錄音椰憋,去河邊找鬼。 笑死赔退,一個胖子當(dāng)著我的面吹牛橙依,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播硕旗,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼窗骑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了漆枚?” 一聲冷哼從身側(cè)響起创译,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎墙基,沒想到半個月后软族,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡残制,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年立砸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片初茶。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡颗祝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情螺戳,我是刑警寧澤搁宾,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站倔幼,受9級特大地震影響盖腿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凤藏,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一奸忽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧揖庄,春花似錦栗菜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至禁炒,卻和暖如春而咆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背幕袱。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工旧蛾, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留氮凝,地道東北人酣衷。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓记罚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親望迎。 傳聞我的和親對象是個殘疾皇子障癌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

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