用 css 实现左侧宽度自适应,右侧固定宽度 ?
1、标准浏览器的方法
当然,以不折腾人为标准的 w3c 标准早就为我们提供了制作这种自适应宽度的标准方法。
- 把 container 设为 display: table 并指定宽度 100%;
- 然后把 main + sidebar 设为 display: table-cell;
- 然后只给 sidebar 指定一个宽度,那么 main 的宽度就变成自适应了。
代码很少,而且不会有额外标签。不过这是 IE7 及以下都无效的方法。
.container {
display: table;
width: 100%;
}
.main {
display: table-cell;
}
.sidebar {
display: table-cell;
width: 300px;
}
2、固定区域浮动,自适应区域不设置宽度但设置 margin
.container {
overflow: hidden;
*zoom: 1;
}
.sidebar {
float: right;
width: 300px;
background: #333;
}
.main {
margin-right: 320px;
background: #666;
}
.footer {
margin-top: 20px;
background: #ccc;
}
其中,sidebar 让它浮动,并设置了一个宽度;而 main 没有设置宽度。
大家要注意 html 中必须使用 div 标签,不要妄图使用什么 p 标签来达到目的。因为 div 有个默认属性,即如果不设置宽度,那它会自动填满它的父标签的宽度。这里的 main 就是例子。
当然我们不能让它填满了,填满了它就不能和 sidebar 保持同一行了。我们给它设置一个 margin。由于 sidebar 在右边,所以我们设置 main 的 margin-right 值,值比 sidebar 的宽度大一点点——以便区分它们的范围,例子中是 320。
假设 main 的默认宽度是 100%,那么它设置了 margin 后,它的宽度就变成了 100% - 320,此时 main 发现自己的宽度可以与 sidebar 挤在同一行了,于是它就上来了。 而宽度 100% 是相对于它的父标签来的,如果我们改变了它父标签的宽度,那 main 的宽度也就会变——比如我们把浏览器窗口缩小,那 container 的宽度就会变小,而 main 的宽度也就变小,但它的实际宽度 100% - 320 始终是不会变的。
这个方法看起来很完美,只要我们记得清除浮动(这里我用了最简单的方法),那 footer 也不会错位。而且无论 main 和 sidebar 谁更长,都不会对布局造成影响。
但实际上这个方法有个很老火的限制——html 中 sidebar 必须在 main 之前! 但我需要 sidebar 在 main 之后!因为我的 main 里面才是网页的主要内容,我不想主要内容反而排在次要内容后面。 但如果 sidebar 在 main 之后,那上面的一切都会化为泡影。
3、固定区域使用定位,自适应区域不设置宽度,但设置 margin
.container {
position: relative;
}
.sidebar {
position: absolute;
top: 0;
right: 0;
width: 300px;
background: #333;
}
.main {
margin-right: 320px;
background: #666;
}
咦,好像不对,footer 怎么还是在那儿呢?怎么没有自动往下走呢?footer 说——我不给绝对主义者让位! 其实这与 footer 无关,而是因为 container 对 sidebar 的无视造成的——你再长,我还是没感觉。 看来这种定位方式只能满足 sidebar 自己,但对它的兄弟们却毫无益处。
4、左边浮动,右边 overflow: hidden;
*{margin:0; padding: 0;}
html,body{
height: 100%;/*高度百分百显示*/
}
#left{
width: 300px;
height: 100%;
background-color: #ccc;
float: left;
}
#right{
height: 100%;
overflow: hidden;
background-color: #eee;
}
这个方法,我利用的是创建一个新的 BFC(块级格式化上下文)来防止文字环绕的原理来实现的。
BFC 就是一个相对独立的布局环境,它内部元素的布局不受外面布局的影响。 它可以通过以下任何一种方式来创建:
- float 的值不为 none
- position 的值不为 static 或者 relative
- display 的值为 table-cell , table-caption , inline-block , flex , 或者 inline-flex 中的其中一个
- overflow 的值不为 visible
关于 BFC,在 w3c 里是这样描述的:在 BFC 中,每个盒子的左外边框紧挨着 包含块 的 左边框 (从右到左的格式化时,则为右边框紧挨)。 即使在浮动里也是这样的(尽管一个包含块的边框会因为浮动而萎缩),除非这个包含块的内部创建了一个新的 BFC。 这样,当我们给右侧的元素单独创建一个 BFC 时,它将不会紧贴在包含块的左边框,而是紧贴在左元素的右边框。