document.documentElement與document.body的區別
document.body 是 DOM 中 Document 對象里的 body 節點 document.documentElement 是文檔對象根節點(html)的引用
IE 在怪異模型(quick mode)下document.documentElement無法正確取到clietHeight、scrollHeight等值,比如clietHeight=0??梢砸奍E的怪異模型并沒有把html作為盒子模型的一部分,好在現在很少使用怪異模型。(注:不過在實測中,可以理解為document.documentElement可以理解為瀏覽器的可見窗口區域,而body則僅為內容區域。我們這里獲取常見的三個值(scrollWidth、offsetWidth和clientwidth)來比較一下:
document.documentElement.scrollWidth 返回整個文檔的寬度 document.documentElement.offsetWidth 返回整個文檔的可見寬度 document.documentElement.clientwidth 返回整個文檔的可見寬度(不包含邊框 clientwidth = offsetWidth - borderWidth)
不過一般來說,我們不會給document.documentElement來設置邊框,所以這里的 clientwidth 與 offsetWidth 一致。
document.body.scrollWidth返回body的寬度
這里的scrollWidth有個不一致的地方,基于 webkit 的瀏覽器(Chrome和Safari)返回的是整個文檔的寬度,也就是和 document.documentElement.scrollWidth 一致,opera 和 FF 返回的就是標準的 body 的 scrollWidth 個人覺得 opera 和 FF 算是比較合理的。
document.body.offsetWidth返回body的offsetWidth
document.body.clientWidth 返回body的clientWidth(不包含邊框),clientWidth = offsetWidth - borderWidth前面的例子,會發現body和documentElement的有些值是相等的,這并不是表示他們是等同的。而是因為當我們沒有給body設置寬度的時候,document.body默認占滿整個窗口寬度,于是就有:
document.body.scrollWidth = document.documentElement.scrollWidth document.body.offsetWidth = document.documentElement.offsetWidth document.body.clientWidth = document.documentElement.clientWidth - document.body.borderWidth(body的邊框寬度)
當我們給body設置了一個寬度的時候,區別就出來了。
為什么offsetWidth始終比clientWidth大呢?
原因就在于這個“邊線”。在FF1.06+和IE6.0+上,有這樣的區別:
clientWidth = width + padding clientHeight = height + padding offsetWidth = width + padding + border offsetHeight = height + padding + border
當然,如果出現的滾動條,offsetWidth也會包含滾動條的寬度,而clientWidth是不包含滾動條的寬度的。
IE9/IE8
這兩個差不多,唯一的區別是IE9包含window.innerWidth屬性,而IE8不包含window.innerWidth屬性。
1、document.documentElement.scrollWidth返回整個文檔的寬度,和FF等瀏覽器一致
2、document.documentElement.offsetWidth返回整個文檔的可見寬度(包含滾動條,值和innerWidth一致),注意,這里和FF等瀏覽器又有點區別。
3、document.documentElement.clientwidth返回整個文檔的可見寬度(不包含邊框),和FF等瀏覽器一致。clientwidth = offsetWidth - 滾動條寬度document.body.scrollWidth返回body的寬度。
注意,這里的scrollWidth和FF等瀏覽器有點區別,這里并不包括body本身的border寬度。因此例子中,相比FF少了10px。
document.body.offsetWidth返回body的offsetWidth,和FF等瀏覽器一致,document.body.clientwidth返回body的clientwidth(不包含邊框),和FF等瀏覽器一致,clientwidth = offsetWidth – borderWidth。
IE7與IE9/IE8的主要區別是
1、document.documentElement.offsetWidth的返回值不一樣,
參見上面說的,IE9/IE8的document.documentElement.offsetWidth包含滾動條,但是IE7的document.documentElement.offsetWidth不包含滾動條。
2、document.documentElement.scrollWidth返回整個文檔的寬度,注意,這里和IE9/IE8、FF等瀏覽器又有不一致,對于IE9/IE8、FF等瀏覽器,scrollWidth最小不會小于窗口的寬度,但是在IE下沒有這個限制,文檔有多小,這個就有多小,其他倒是挺一致的。
IE6
IE6的document.documentElement返回值與IE9/IE8沒有區別(由此可見,對于document.documentElement,IE7就是個奇葩)。
話說回來,IE的document.body就是個奇葩,當沒有給body設置寬度的時候,body是默認占滿整個文檔的(注意,其他的瀏覽器都是占滿整個窗口),當然,最小值是整個窗口的大小,就是說body指向了根元素。
因此,在算上IE6在解析width方面的bug,和其他的瀏覽器的區別就淋漓盡致了。
1、document.body.scrollWidth返回body的寬度,和IE9/IE8/IE7一致,
2、document.body.offsetWidth返回body的offsetWidth,注意,由于body的不同,這里的offsetWidth = scrollWidth + borderWidth
3、document.body.clientwidth返回body的clientwidth(不包含邊框)clientwidth = offsetWidth - borderWidth
另外,有一點和IE7同樣,就是document.documentElement.scrollWidth沒有最小寬度限制。
請驗證,完成請求
由于請求次數過多,請先驗證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報