用 css 实现左侧宽度自适应,右侧固定宽度 ?

2022-03-12T17:34:13

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 时,它将不会紧贴在包含块的左边框,而是紧贴在左元素的右边框。

当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »