scrollHeight,clientHeight,offsetHeight的區別
說明:
scrollHeight:DOM元素的實際內容的高度,不包border的高度,會隨DOM元素中內容的增加(超過可視區後)而變大。
clientHeight:DOM元素內容視覺區的高度,不包含捲軸和邊框的高度。
offsetHeight:DOM元素整體的高度,包括捲軸和邊框。
當滾動條不出現的時候
這時候DOM元素中沒有內容或內容不超過可視區
scrollWidth=clientWidth,兩者皆為可視區的寬度。
scrollHeight=clientHeight,兩者皆為可視區域的高度。
offsetWidth、offsetHeight為DOM元素的整體寬度與高度。
當滾動條出現的時候
這時候DOM元素中沒有內容或內容不超過可視區
scrollWidth>clientWidth
scrollHeight>clientHeight
scrollWidth和prollHeTrollHeight內容視覺區的寬度和高度
offsetWidth、offsetHeight為DOM元素的整體寬度和高度。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>正确理解和运用与尺寸大小相关的DOM属性</title> <style type="text/css"> html,body {margin: 0;} body {padding: 100px;} #box { overflow: scroll; width: 400px; height: 300px; padding: 20px; border: 10px solid #000; margin: 0 auto; box-sizing: content-box; /* box-sizing:content-box表示元素的宽度与高度不包括内边距与边框的宽度和高度 box-sizing:border-box表示元素的宽度与高度包括内边距与边框的宽度和高度 */ } #box2 { border: 1px solid #000; } </style> </head> <body> <div id="box"> <div id="box2">谷歌浏览器测试结果</div> </div> <script type="text/javascript"> //offsetWidth ,offsetHeight对应的是盒模型的宽度和高度 //scrollWidth,与scrollHeight对应的是滚动区域的宽度和高度,但是不包含滚动条的宽度!滚动区域由padding和content组成。 //clientWidth,clientHeight对应的是盒模型除去边框后的那部分区域的宽度和高度,不包含滚动条的宽度 var boxE=document.getElementById("box"); var box=document.getElementById("box2"); //对于scrollWidth没有发生横向的溢出,同时由于overflow: scroll的原因,scrollWidth 跟clientWidth相同,但是没有包含滚动条的宽度 console.log('scrollWidth:' + boxE.scrollWidth);//423 console.log('scrollHeight:' + boxE.scrollHeight);//672 //clientWidth与clientHeight分别等于offsetWidth与offsetHeight减掉相应边框(上下共20px,左右共20px)和滚动条宽度后的值(chrome下滚动条宽度为17px); console.log('clientWidth:' + boxE.clientWidth);//423=460-20-17 console.log('clientHeight:' + boxE.clientHeight);//323=360-20-17 //offsetWidth与offsetHeight与chrome审查元素看到的尺寸完全一致 console.log('offsetWidth :' + boxE.offsetWidth);//460=width+padding+border console.log('offsetHeight:' + boxE.offsetHeight);//360=height+padding+border </script> </body> </html>
取得body元素:document.body
使用document.documentElement.clientWidth和document.documentElement.clientHeight
注意:ie6標準模式下,上述方式可以
在混雜模式下:
注意: window.innerWidth/Height是包含捲軸的寬度和高度的。這也與document.documentElement.clientWidth/Height的區別所在。
所以在使用的時候注意相容寫法:
Demo
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>页面视口宽高</title> </head> <body> <script type="text/javascript"> //标准模式 var w=document.documentElement.clientWidth; var h=document.documentElement.clientHeight; console.log('w宽:'+w+'---'+'h高:'+h); //混杂模式 var width=document.body.clientWidth; var height=document.body.clientHeight; //兼容写法 var ww=document.documentElement.clientWidth||document.body.clientWidth; var hh=document.documentElement.clientHeight||document.body.clientHeight; console.log('ww宽:'+ww+'---'+'hh高:'+hh); </script> </body> </html>
獲取一個普通html元素的大小
docE.offsetWidth;
docE.offsetHeightvar相容性
化取條高度捲動性取得核心滾動性(.) =document.documentElement.scrollTop||document.body.scrollTop;
offsetWidth與offsetHeight
這兩個屬性表示元素的可視區的寬度和高度,這個值包括元素的邊框(border),水平padding,垂直滾動條寬度或高度,元素本身寬度或高度等。
offsetWidth與offsetHeight這兩個屬性的值只與該元素有關,與周圍元素(父級和子級元素無關)。
offsetWidth=(border-width)*2+(padding-left)+(width)+(padding-right)offsetHeight=(border-width)*2+(padding-top)+(height)+(padding -bottom)
offsetLeft與offsetTop
offsetLeft與offsetTop這兩個屬性值與offsetParent有關。
offsetParent屬性傳回一個物件的引用,這個物件是距離呼叫offsetParent的元素最近的(在包含層次中最靠近的),並且是已進行過CSS定位的容器元素。 如果這個容器元素未進行CSS定位, 則offsetParent屬性的取值為根元素(即body元素)的參考。
兩條規則:
如果目前元素的父級元素沒有進行CSS定位(position為absolute或relative),offsetParent為body。
如果目前元素的父級元素中有CSS定位(position為absolute或relative),offsetParent取最近的那個父級元素。
offsetLeft:物件元素邊界的左上角頂點相對於offsetParent的左上角頂點的水平偏移量;
offsetTop:物件元素邊界的左上角頂點相對於offsetParent的左上角頂點的垂直偏移量;
offsetLeft=(offsetParent的padding-left)+(中間元素的offsetWidth)+(當前元素的margin-left)
offsetTop=(offsetParent的padding-top)+(中間元素的offsetHeight)+(當前元素的margin-上)
當offsetParent為body時情況比較特殊:
在IE8/9/10及Chrome中:
offsetLeft = (body的margin-left)+(body的border-width)+(body的padding-left )+(當前元素的margin-left)。
在FireFox: