css实现三栏布局

105 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情

上文实现了双栏布局,是比较简单的,那么三栏布局呢?也是面试和开发常常遇到的。那么,本文就开始总结关于三栏布局的最常见的双飞翼布局,圣杯布局和flex布局这三种种方法及特点。

双飞翼布局

双飞翼布局是所有元素设置浮动。中间元素内部创建子元素,子元素设置margin,用来预留左右两侧元素的位置。左右元素设置margin负值。

代码如下:

<style>
    .main,.left,.right{
       float: left;
    }
    .main{
       width: 100%;
    }
    .content{
        margin:0 200px;
    }
    .left{
        width: 200px;
        margin-left: -100%;
    }
    .right{
       width: 200px;
       margin-left: -200px;
     }
</style>
<body>
  <div class="main"><div class="content">主页</div></div>
  <div class="left">左部</div>
  <div class="right">右部</div>
</body>

缺点:这个相比于其他布局,需要在main元素创建子元素,增加了dom节点,加大了渲染树生成的计算量。

圣杯布局

圣杯布局和双飞翼有一点点类似之处,但是圣杯布局是父元素使用padding预留左右两侧元素的位置,左中右元素均设置浮动,左侧元素使用margin负值和相对定位调整位置,右侧元素用margin负值调整位置

代码如下:

<style>
.middle,.left,.right{
   float: left;
 }
.main{
   padding:0 200px;
}
.middle{
   width: 100%;
}
.left{
   width: 200px;
   margin-left: -100%;
   position:relative;
   right: 200px;
}
.right{
   width: 200px;
   margin-right: -200px;
}
</style>
<body>
<div class="main">
<div class="middle">主页</div>
<div class="left">左部</div>
<div class="right">右部</div>
</div>
</body>

缺点:中间部分宽度小于左侧时,布局混乱

总结:圣杯和双飞翼最明显的区别,在main内部使用的是margin,而圣杯是直接在container部分使用padding。同时要注意的是,圣杯布局和双飞翼布局的元素顺序是需要按照中间元素位于开头。

flex布局

flex布局的话较为简单,除了需要考虑浏览器是否支持flex布局,不过目前大部分浏览器均支持,是比较推荐的一种实现三栏布局的方式。只需要将父元素设置为flex布局,由于flex默认方向属性是水平的,故直接实现三栏布局。最后根据所需位置,大小编写即可。无需要考虑元素顺序。

<style>
    *{
        margin: 0;
        padding:0;
    }
    .main{
        display: flex;
    }
    .middle{
        flex:1;
    }
    .left,.right{
        width: 200px;
    }
</style>
<body>
 <div class="main">
   <div class="left">左部</div> 
   <div class="middle">主页</div>
   <div class="right">右部</div>
  </div>
</body>

其他

实现三栏布局还可以考虑其他方法,如以下几种。

  • 浮动法

中间元素放最后,左右元素任意排列,并且左侧元素左浮动,右侧元素右浮动。

  • 绝对定位

    左右元素设置为绝对定位,中间元素使用margin预留左右元素的宽度

  • 网格布局

    中间元素位于左右两个元素之间,父元素设置网格布局,使用grid-template-rows定义行高,使用grid-template-columns定义列宽。