栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > Web开发 > Html/CSS > CSS教程

CSS两列布局实现方式总结

CSS教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

CSS两列布局实现方式总结

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

1. absolute + margin 方式

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

XML/HTML Code复制内容到剪贴板
  1.   
  2.     子列
  
  •     主列
  •   
  •    CSS Code复制内容到剪贴板
    1. .container {   
    2.  position: relative;   
    3. }   
    4. .sidebar {   
    5.  position: absolute;   
    6.  top: 0;   
    7.  left: 0;   
    8.  width: 200px;   
    9.  height: 300px;   
    10.  background-color: rgba(255, 0, 0, .5);   
    11. }   
    12. .main {   
    13.  height: 300px;   
    14.  margin-left: 210px;   
    15.  background-color: rgba(0, 255, 0, .5);   
    16. }  

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

    (1)列顺序调整

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

    CSS Code复制内容到剪贴板
    1. .sidebar {   
    2.  position: absolute;   
    3.  top: 0;   
    4.  rightright: 0;   
    5. }   
    6. .main {   
    7.  margin-right: 210px;   
    8. }   

    (2)主内容列优先显示

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

    XML/HTML Code复制内容到剪贴板
    1.   
    2.     主列
      
  •  子列  
  •   
  • 做上面的简单调整即可,CSS不需要任何修改!

    (3)问题所在

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

    2. float + margin 方式

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

    XML/HTML Code复制内容到剪贴板
    1. 子列  
    2. 主列  
    CSS Code复制内容到剪贴板
    1. .sidebar {   
    2.  float: left;   
    3.  width: 200px;   
    4.  height: 300px;   
    5.  background-color: rgba(255, 0, 0, .5);   
    6. }   
    7. .main {   
    8.  height: 300px;   
    9.  margin-left: 210px;   
    10.  background-color: rgba(0, 255, 0, .5);   
    11. }  

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

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

    CSS Code复制内容到剪贴板
    1. .sidebar {   
    2.  float: rightright;   
    3.  width: 200px;   
    4.  height: 300px;   
    5.  background-color: rgba(255, 0, 0, .5);   
    6. }   
    7. .main {   
    8.  height: 300px;   
    9.  margin-right: 210px;   
    10.  background-color: rgba(0, 255, 0, .5);   
    11. }  

    问题所在:

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

    3. float + 负margin 方式

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

    XML/HTML Code复制内容到剪贴板
    1.   
    2.     主列  
    3.   
    4. 子列  
    CSS Code复制内容到剪贴板
    1. .main-wrapper {   
    2.  float: left;   
    3.  width: 100%;   
    4. }   
    5. .main {   
    6.  height: 100px;   
    7.  margin-left: 210px;   
    8.  background-color: rgba(255, 0, 0, .5);   
    9. }   
    10. .sidebar {   
    11.  float: left;   
    12.  width: 200px;   
    13.  height: 100px;   
    14.  margin-left: -100%;   
    15.  background-color: rgba(0, 255, 0, .5);   
    16. }  

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

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

    转载请注明:文章转载自 www.mshxw.com
    本文地址:https://www.mshxw.com/it/215865.html

    CSS教程相关栏目本月热门文章

    我们一直用心在做
    关于我们 文章归档 网站地图 联系我们

    版权所有 (c)2021-2022 MSHXW.COM

    ICP备案号:晋ICP备2021003244-6号