js基本功——盒子模型
目录:
盒子模型
几个常用宽高尺寸
几个常用定位尺寸
先看图,在说话


一起来找茬,看出两张图的差别了吗?对了,第二张图中多了竖向滚动条,然后右边的数据中,clientWidth和scrollWidth少了10个像素,而scrollHeight则多了38个像素。
图中黑色的区域是border,对,宽50像素的边框,而且client,offset,scroll这三类尺寸值是不带单位的,虽然它们的数值表示的是像素值,但不要在赋值时画蛇添足写上px,如果一定有,至少用parseInt转换一下。
从图中数据可以看出,clientWidth是元素自身width与padding加起来的宽度,而且不包含有滚动条所占的尺寸。滚动条会占用元素的部分尺寸,这一点从图中可以看出,第二张图中每行满排的字母个数比第一张图中少了一些。这个时候如果打印元素的width,会发现还是100px,没有减少呀?确实width的数值没有减少,这也说明,元素如果有滚动条,会把自身width分成两块,一块显示元素内容,另一块显示滚动条,也就是说width包含了元素内容和滚动条的尺寸,但是在计算clientWidth是,会把滚动条的尺寸减掉。由此可以得出最终结论,clientWidth是元素可显示内容区域的宽度与padding的和。
offsetWidth是clientWidth ,滚动条宽度,border宽度的和。不包含margin
scrollWidth在没有横向滚动条时,值与clientWidth一样,scrollHeight也是如此,但第二张图中出现了竖向滚动条时,出现了变化,可以看出,scrollWidth和scrollHeight是元素内容的实际尺寸。因为内容比尺寸比元素尺寸大,所以出现了滚动条,我们在浏览器中无法看到内容究竟有多大,但从scrollWidth和scrollHeight两个尺寸值可以看出来。
1 <!DOCTYPE html> 2 <html> 3 <title>test</title> 4 <style type="text/css"> 5 table, tr, th, td{ 6 border:1px solid black; 7 border-spacing:0; 8 } 9 th, td{ 10 padding:5px; 11 } 12 </style> 13 <body> 14 <textarea id="div1" style="width: 100px;height: 100px;border: 50px solid black;padding: 30px;margin: 33px;background:green;">AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</textarea> 15 <div style="height:10000px;"></div> 16 <div id="disp" style="position:fixed;right:500px;top:42px;text-align:left"> 17 <table> 18 <tr> 19 <th>height</th> 20 <td></td> 21 </tr> 22 <tr> 23 <th>padding</th> 24 <td></td> 25 </tr> 26 <tr> 27 <th>border</th> 28 <td></td> 29 </tr> 30 <tr> 31 <th>margin</th> 32 <td></td> 33 </tr> 34 <tr> 35 <th>clientHeight</th> 36 <td></td> 37 </tr> 38 <tr> 39 <th>offsetHeight</th> 40 <td></td> 41 </tr> 42 <tr> 43 <th>scrollHeight</th> 44 <td></td> 45 </tr> 46 <tr> 47 <th>width</th> 48 <td></td> 49 </tr> 50 <tr> 51 <th>clientWidth</th> 52 <td></td> 53 </tr> 54 <tr> 55 <th>offsetWidth</th> 56 <td></td> 57 </tr> 58 <tr> 59 <th>scrollWidth</th> 60 <td></td> 61 </tr> 62 </table> 63 </div> 64 65 </body> 66 <script> 67 var w = function(str=""){document.write(str+"<br>")}; 68 var d = document; 69 window.$ = window.myQuery = function(arg){ 70 if(typeof(arg)==="string"){ 71 if(-1!=arg.search(/#.+/)){ 72 return document.getElementById(arg.replace(/#/, "")); 73 }else if(-1!=arg.search(/\..+/)){ 74 return document.getElementsByClassName(arg); 75 }else if(-1!=arg.search(/\w+/)){ 76 return document.getElementsByTagName(arg); 77 } 78 } 79 } 80 var div1 = $("#div1"); 81 alert(div1.style['width']) 82 var tbl =$('table')[0]; 83 w(); 84 w("div1.style.border:\t"+div1.style.border); 85 w("div1.style.padding:\t"+div1.style.padding); 86 w("div1.style.margin:\t"+div1.style.margin); 87 w("div1.style.height:\t"+div1.style.height); 88 w("div1.clientheight:\t"+div1.clientheight); 89 w("div1.offsetheight:\t"+div1.offsetheight); 90 w("div1.scrollheight:\t"+div1.scrollheight); 91 w("div1.scrollTop:\t"+div1.scrollTop); 92 window.onload = function(){ 93 update(); 94 window.onscroll = function(){ 95 update(); 96 } 97 } 98 function update(tb = tbl){ 99 for(var i=0; i<tb.rows.length; i++){ 100 var row = tb.rows[i]; 101 if(undefined!=div1.style[row.cells[0].innerHTML]){ 102 row.cells[1].innerHTML = div1.style[row.cells[0].innerHTML]; 103 }else if(undefined!=div1[row.cells[0].innerHTML]){ 104 row.cells[1].innerHTML = div1[row.cells[0].innerHTML]; 105 } 106 } 107 } 108 109 </script> 110 </html>

浙公网安备 33010602011771号