侧栏定宽,主栏宽度自适应且优先载入
需求
两列布局,左栏宽度固定为200px,右栏宽度自适应且优先载入;
两列间距为10px;
两列高度不确定。
方案1
html
<div id="content">
<div id="main">主栏</div>
<div id="sidebar">侧栏</div>
</div>
css
#content {
padding-left: 210px;
}
#main {
float: right;
width: 100%;
}
#sidebar {
float: left; _display: inline; /* IE6 Bug */
width: 200px;
margin-left: -210px;
}
<div id="content"> <div id="main">主栏</div> <div id="sidebar">侧栏</div> </div>
#content {
padding-left: 210px;
}
#main {
float: right;
width: 100%;
}
#sidebar {
float: left; _display: inline; /* IE6 Bug */
width: 200px;
margin-left: -210px;
}
方案2
#content {
display: box;
box-direction: reverse;
}
#main {
box-flex: 1;
}
#sidebar {
width: 200px;
margin-right: 10px;
}
注:实际应用中需要加上-moz和-webkit前缀,在此省略,以便示例代码的清晰。
分析
主栏需要优先载入,那么在html中两块内容的顺序就确定了,main要放置于sidebar前面。
两块内容并列放置,通常会用浮动或绝对定位来实现,绝对定位实现很方便,需要固定宽度的侧栏绝对定位,主栏写一个margin-left就OK。但这个需求中有一个“两列高度不确定”,有可能sidebar比main更高,如果sidebar绝对定位了,它就会脱离普通文档流,其后的内容不会随着它而流动。“两列高度不确定”也就意味着它们都要处于普通文档流当中。
如果用浮动呢?元素浮动后其宽度会自动收缩到最小,那么main浮动后,需要使其宽度自适应就只能依赖于父元素了,所以这里添加一个额外的div(#content),并设置其padding-left值为侧栏宽度以限制main的宽度范围,接下来定义sidebar的margin-left为负值让其与main并列显示。
对于这类弹性布局,CSS3的Flexible Box Layout当然是更好的选择,如方案二,Gecko和WebKit已提供了对它的支持。
