问题是这样的,先上图:
最初我的想法很简单,三个浮动的栏,左右两边固定宽度,中栏宽度为auto,但是一个用负外边距实现的解决方案让我很费解,方案是这样的:
html代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Layout Test</title>
<link rel="stylesheet" type="text/css" href="page.css">
</head>
<body>
<div id="main_wrapper">
<header>
<h1>Architecting Your App in Ext JS 4</h1>
</header>
<div id="threecolwrap"> <!-- 包围全部三栏 -->
<div id="twocolwrap"> <!-- 包围左栏和中栏 -->
<nav>
<ul>
<li>Part 1</li>
<li>Part 2</li>
<li>Part 3</li>
</ul>
</nav>
<article>
<div class="inner">
<h2>Code Organization</h2>
<p>The scalability, maintainability and flexibility of an ...</p>
</div>
</article>
</div> <!-- 结束两栏外包装 -->
<aside>
<p>We have illustrated that by using some advanced controller ... </p>
</aside>
</div> <!-- 结束三栏外包装 -->
<footer>
<p>Application architecture is as much about providing ... </p>
</footer>
</div>
</body>
</html>
CSS代码:
* {
margin: 0;
padding: 0;
}
body {
font: 1em helvetica,arial,sans-serif;
}
div#mian_wrapper {
min-width: 600px;
max-width: 1100px;
/*超过最大宽度时,布局居中*/
margin: 0 auto;
}
header {
padding: 5px 10px;
background: #3f7ccf;
}
div#threecolwrap {
/*浮动强制它包围浮动的栏*/
float: left;
width: 100%;
}
div#twocolwrap {
float: left;
width: 100%;
/*把右栏拉到区块外边距腾出的位置上*/
margin-right: -210px;
}
nav {
padding: 20px 0px;
width: 150;
float: left;
background: #f00;
}
nav li {
/*去掉列表项目符号*/
list-style-type: none;
}
nav > *{margin: 0 10px}
article {
width: auto;
/*float: left;*/
background: #eee;
padding: 20px 0px;
margin-left: 150px;
/*在流动居中的栏右侧腾出空间*/
margin-right: 210px;
}
article > *{
margin: 0 20px;
}
aside {
padding: 20px 0px;
float: left;
background: #ffed53;
width: 210;
}
aside > *{
margin: 0 10px;
}
footer {
clear: both;
width: 100%;
text-align: center;
background: green;
}
以上方案大致是:将左中栏和左中右栏分别用div包裹,然后给twocolwrap设了-210px的右外边距,article设了210px的右边距,因为前面自己愚蠢的想法导致很不能理解这个方案。
这里,要注意到article并没有浮动,我试了一下让它浮动,它就变成了这个样子:
原来,article的自动宽度是相对于父元素的,它会把父元素剩余的部分全部撑满,而左右栏是浮动的,因此并不占据空间。
这样一来,我才明白了上面那个方案要干什么,应该不用多说了。。。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。