视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
分享CSS两列布局实现方式的总结
2020-11-27 18:52:44 责编:小采
文档


这篇文章主要介绍了CSS两列布局实现方式的总结,讨论了包括absolute + margin和float + margin方式的一些实践和问题,需要的朋友可以参考下

两列布局大概是最经典的一种网页布局方式了,本博客就是采用的这种布局。两列布局中,以主列(main)是自适应宽度,子列(sidebar)是固定宽度的情形最为常见。
今天就来好好探讨一下如何实现这种定宽+自适应的两列布局。

1. absolute + margin 方式

首先想到的是利用 absolute + margin 的方式实现。先看看代码:

<p class="container">
 <p class="sidebar">子列</p>
 <p class="main">主列</p>
</p>
.container { 
 position: relative; 
} 
.sidebar { 
 position: absolute; 
 top: 0; 
 left: 0; 
 width: 200px; 
 height: 300px; 
 background-color: rgba(255, 0, 0, .5); 
} 
.main { 
 height: 300px; 
 margin-left: 210px; 
 background-color: rgba(0, 255, 0, .5); 
}

该方式利用 position 让 sidebar 列脱离文档流,然后通过 main 列的 margin-left 移除被 sidebar 列覆盖的部分。如此,我们就实现了定宽 + 自适应的两列布局。

(1)列顺序调整

在不修改 HTML 的情况下,只需简单修改 CSS,我们可以让左右两列顺序互换,来看代码:

.sidebar { 
 position: absolute; 
 top: 0; 
 rightright: 0; 
} 
.main { 
 margin-right: 210px; 
}

(2)主内容列优先显示

让我们考虑的更完美一点,可不可以把 main 列放 sidebar 列 的前面,使主要内容优先加载渲染? Let us try!

<p class="container">
 <p class="main">主列</p>
 <p class="sidebar">子列</p>
</p>

做上面的简单调整即可,CSS不需要任何修改!

(3)问题所在

虽然这种方式的优点很多,但是却存在一个致命缺点。因为 sidebar 列脱离了文档流,当 sidebar 列比 main 列高时会覆盖后面的布局:问题demo。
如果在 container 容器上 添加 overflow:hidden 就会使 sidebar 溢出部分被裁减。在这种布局方式下,这个问题确实没有有效的解决办法。

2. float + margin 方式

然后想到的就是 float + margin 来实现两列布局,首先实现左栏定宽,主内容自适应的两栏布局。代码如下:

<p class="sidebar">子列</p>
<p class="main">主列</p>
.sidebar { 
 float: left; 
 width: 200px; 
 height: 300px; 
 background-color: rgba(255, 0, 0, .5); 
} 
.main { 
 height: 300px; 
 margin-left: 210px; 
 background-color: rgba(0, 255, 0, .5); 
}

这种实现方式比较简单,首先把子列浮动到左边,然后在主列上设置 margin-left 为子列留出显示空间即可。

那么,这种方式支不支持调换列的位置呢?当然可以。CSS代码如下:

.sidebar { 
 float: rightright; 
 width: 200px; 
 height: 300px; 
 background-color: rgba(255, 0, 0, .5); 
} 
.main { 
 height: 300px; 
 margin-right: 210px; 
 background-color: rgba(0, 255, 0, .5); 
}

问题所在:

看起来 float + margin 方式是个好办法,然而我们前面提到过的主列在前优先显示的优化却不能实现。

3. float + 负margin 方式

废话不多说,直接上代码:

<p class="main-wrapper">
 <p class="main">主列</p>
</p>
<p class="sidebar">子列</p>
.main-wrapper { 
 float: left; 
 width: 100%; 
} 
.main { 
 height: 100px; 
 margin-left: 210px; 
 background-color: rgba(255, 0, 0, .5); 
} 
.sidebar { 
 float: left; 
 width: 200px; 
 height: 100px; 
 margin-left: -100%; 
 background-color: rgba(0, 255, 0, .5); 
}

大家应该都看出来了,这就是双飞翼布局,主列优先显示。实现的过程如下:

首先浮动 main 列和 sidebar 列,然后通过 负margin 正确定位 sidebar 列。
把 main 列嵌套在一个 p 里,该 p 的宽度值设为100%。
最后通过设置 main 列的 margin-left 消除被 sidebar 覆盖的部分即可。

下载本文
显示全文
专题