首页 > 代码库 > 【CSS】 布局之多列等高
【CSS】 布局之多列等高
这两天看了不少文章,对于css布局多了一些理解,现在来总结下。
我们来写一个最普遍的Top、Left、Content、Right、Foot布局。
第一步:自然是写一个坯子
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 2 <html> 3 <head> 4 <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 5 <title>Css布局</title> 6 </head> 7 <body> 8 <div id="parents"> 9 <div id="top">这是Top!</div>10 <div id="main">11 <div id="left">这是Left!</div>12 <div id="content">这是Content!</div>13 <div id="right">这是Right!</div>14 </div>15 <div id="foot">这是Foot!</div>16 </div>17 </body>18 </html>
效果:
第二步: 我们给这些加上背景色,并将整个parents居中
1 <style type="text/css"> 2 * { 3 margin: 0; 4 padding: 0; 5 text-Align: center; 6 } 7 #parents { 8 width: 600px; 9 border: 1px solid;10 margin: 100px auto 0 auto; 11 }12 #top {13 background: #cc00cc; 14 }15 #left {16 background: #00cc00; 17 }18 #content {19 background: #cccccc; 20 }21 #right { 22 background: #0000cc; 23 }24 #foot {25 background: #cccc00;26 }27 </style>
效果:
我们给top和foot设置100的高度,并将left和content向左浮动,right向右浮动。
1 <style type="text/css"> 2 * { 3 margin: 0; 4 padding: 0; 5 text-Align: center; 6 } 7 #parents { 8 width: 600px; 9 border: 1px solid;10 margin: 100px auto 0 auto; 11 }12 #top { 13 background: #cc00cc; 14 height: 100px; 15 }16 #left {17 background: #00cc00;18 float: left;19 }20 #content {21 background: #cccccc; 22 float: left; 23 }24 #right { 25 background: #0000cc;26 float: right; 27 }28 #foot {29 background: #cccc00;30 height: 100px;31 }32 </style>
效果:
貌似有点不对,没事。把foot给clear一下就可以了!
1 #foot {2 background: #cccc00;3 height: 100px;4 clear: both; 5 }
效果:
我们给left、content、right分别设置宽度100px、400px、100px。
1 #left { 2 background: #00cc00; 3 float: left; 4 width: 100px; 5 } 6 #content { 7 background: #cccccc; 8 float: left; 9 width: 400px; 10 }11 #right { 12 background: #0000cc;13 float: right; 14 width: 100px; 15 }
效果:
看起来貌似大功告成!
不过这里的设置还有一个大问题,在网页布局中,中间的left、content、right是根据实际需要添删内容的,而各列高度很多时候都不一样。比如我们设置left的高度为100px。
1 #left {2 background: #00cc00;3 float: left;4 width: 100px;5 height: 100px;6 }
效果:
我们看到,当其中一个高度发生变化时,其余两者并没有随之改变,这样布局就出现了一个很大的漏洞。
如何使中间层的三者在其中随意一个高度发生变化时,依旧能保持三者高度一致呢?
这里就牵涉到一个负边距的使用技巧了。
这个方法称之为padding补偿法:
首先把列的padding-bottom设为一个足够大的值,再把列的margin-bottom设一个与前面的padding-bottom的正值相抵消的负值,父容器设置超出隐藏,这样子父容器的高度就还是它里面的列没有设定padding-bottom时的高度,当它里面的任一列高度增加了,则父容器的高度被撑到它里面最高那列的高度,其他比这列矮的列则会用它们的padding-bottom来补偿这部分高度差。因为背景是可以用在padding占用的空间里的,而且边框也是跟随padding变化的,这样就成功的使得三者列高最起码看起来是等高的。这样也就满足了我们的需求。
1 #left { 2 background: #00cc00; 3 float: left; 4 width: 100px; 5 height: 100px; 6 margin-bottom: -2000px; 7 padding-bottom: 2000px; 8 } 9 #content {10 background: #cccccc; 11 float: left; 12 width: 400px; 13 margin-bottom: -2000px;14 padding-bottom: 2000px;15 }16 #right { 17 background: #0000cc;18 loat: right; 19 width: 100px; 20 margin-bottom: -2000px;21 padding-bottom: 2000px; 22 }
效果:
现在产生了一个问题,高度溢出了。
我们可以对其父元素配置一个overflow: hidden来对溢出部分进行修剪。
1 #main {2 overflow: hidden; 3 }
这样就大功告成了:
此刻,我们给content添加内容改变他的高度。
1 <div id="content">这是Content!<br><br><br>打算打算打<br><br><br>dwdoahdoa<br><br>的味道</div>
效果:
我们看到,当content的高度发生变化时,left和right的高度随之改变,这就是多列等高的奥秘。
最后附上完整代码:
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 2 <html> 3 <head> 4 <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 5 <title>PE Layout Example 1</title> 6 <style type="text/css"> 7 * { 8 margin: 0; 9 padding: 0;10 text-Align: center;11 }12 #parents {13 width: 600px;14 border: 1px solid;15 margin: 100px auto 0 auto; 16 }17 #top { 18 background: #cc00cc; 19 height: 100px; 20 }21 #main {22 overflow: hidden;23 width: 100%;24 }25 #left {26 background: #00cc00;27 float: left;28 width: 100px;29 margin-bottom: -2000px;30 padding-bottom: 2000px;31 }32 #content {33 background: #cccccc; 34 float: left; 35 width: 400px; 36 margin-bottom: -2000px;37 padding-bottom: 2000px;38 }39 #right { 40 background: #0000cc;41 float: right; 42 width: 100px; 43 margin-bottom: -2000px;44 padding-bottom: 2000px; 45 }46 #foot {47 background: #cccc00;48 height: 100px;49 clear: both;50 }51 </style>52 </head>53 <body>54 <div id="parents">55 <div id="top">这是Top!</div>56 <div id="main">57 <div id="left">这是Left!</div>58 <div id="content">这是Content!<br><br><br>打算打算打<br><br><br>dwdoahdoa<br><br>的味道</div>59 <div id="right">这是Right!</div>60 </div>61 <div id="foot">这是Foot!</div>62 </div>63 </body>64 </html>
【CSS】 布局之多列等高