CSS 三栏布局
引言
在现代网页设计中,三栏布局堪称最经典的布局方案之一。无论是传统门户网站、企业官网,还是复杂的后台管理系统,三栏布局因其出色的内容组织方式和良好的视觉层次,一直备受开发者青睐。
什么是三栏布局?
三栏布局,顾名思义,就是将页面分割为左、中、右三个部分的布局方式。通常情况下:
- 左侧栏:常用于放置导航菜单、logo等固定宽度的内容
- 中间栏:作为主要内容区域,宽度自适应
- 右侧栏:通常用于展示次要信息,如广告、用户信息等

主流实现方案
目前,实现三栏布局的方案主要有以下几种:
- 浮动布局(Float Layout)
- 绝对定位布局(Position Layout)
- 弹性布局(Flexbox Layout)
- 网格布局(Grid Layout)
- 圣杯布局(Holy Grail Layout)
- 双飞翼布局(Double Wing Layout)
选择合适的方案
在选择具体实现方案时,需要考虑以下因素:
- 项目需求
- 浏览器兼容
- 性能要求
- 首屏加载速度
- 渲染性能
- 资源占用
接下来,我们将深入探讨每种实现方案的具体细节、优缺点对比以及最佳实践。
浮动布局(Float Layout)
实现思路
利用浮动属性将元素排列在同一行,并通过设置宽度和外边距来控制布局。
代码
| <header class="header">header</header> |
| <main class="container"> |
| <div class="left">left</div> |
| <div class="right">right</div> |
| <div class="center">center</div> |
| </main> |
| <footer class="footer">footer</footer> |
复制
| .header, |
| .left, |
| .center, |
| .right, |
| .footer { |
| height: 50px; |
| line-height: 50px; |
| text-align: center; |
| color: white; |
| } |
| |
| .header { |
| background-color: green; |
| } |
| |
| .left { |
| float: left; |
| width: 200px; |
| background-color: skyblue; |
| } |
| |
| .center { |
| margin-left: 200px; |
| margin-right: 100px; |
| background-color: deeppink; |
| } |
| |
| .right { |
| float: right; |
| width: 100px; |
| background-color: orangered; |
| } |
| |
| .footer { |
| clear: both; |
| background-color: darkorange; |
| } |
复制
优点
- 兼容性好,支持IE6+
- 实现简单直观
- 使用广泛,开发者熟悉
缺点
绝对定位布局(Position Layout)
实现思路
利用绝对定位将元素放置在指定位置,并通过设置宽度和外边距来控制布局。
代码
| <header class="header">header</header> |
| <main class="container"> |
| <div class="left">left</div> |
| <div class="right">right</div> |
| <div class="center">center</div> |
| </main> |
| <footer class="footer">footer</footer> |
复制
| .header, |
| .left, |
| .center, |
| .right, |
| .footer { |
| height: 50px; |
| line-height: 50px; |
| text-align: center; |
| color: white; |
| } |
| |
| .header { |
| background-color: green; |
| } |
| |
| .container { |
| position: relative; |
| } |
| |
| .left { |
| position: absolute; |
| left: 0; |
| width: 200px; |
| background-color: skyblue; |
| } |
| |
| .center { |
| margin-left: 200px; |
| margin-right: 100px; |
| background-color: deeppink; |
| } |
| |
| .right { |
| position: absolute; |
| right: 0; |
| float: right; |
| width: 100px; |
| background-color: orangered; |
| } |
| |
| .footer { |
| background-color: darkorange; |
| } |
复制
优点
缺点
弹性布局(Flexbox Layout)
实现思路
将容器设置为弹性容器,并设置弹性布局方向为水平。将左侧和右侧元素设置为固定宽度,并将中间元素设置为自适应宽度。
代码
| <header class="header">header</header> |
| <main class="container"> |
| <div class="left">left</div> |
| <div class="center">center</div> |
| <div class="right">right</div> |
| </main> |
| <footer class="footer">footer</footer> |
复制
| .header, |
| .left, |
| .center, |
| .right, |
| .footer { |
| height: 50px; |
| line-height: 50px; |
| text-align: center; |
| color: white; |
| } |
| |
| .header { |
| background-color: green; |
| } |
| |
| .container { |
| display: flex; |
| } |
| |
| .left { |
| width: 200px; |
| background-color: skyblue; |
| } |
| |
| .center { |
| flex: 1; |
| background-color: deeppink; |
| } |
| |
| .right { |
| width: 100px; |
| background-color: orangered; |
| } |
| |
| .footer { |
| background-color: darkorange; |
| } |
复制
优点
缺点
网格布局(Grid Layout)
实现思路
将容器设置为网格布局,并设置三栏。左右两侧宽度固定,中间宽度设置为 auto。
| <header class="header">header</header> |
| <main class="container"> |
| <div class="left">left</div> |
| <div class="center">center</div> |
| <div class="right">right</div> |
| </main> |
| <footer class="footer">footer</footer> |
复制
| .header, |
| .left, |
| .center, |
| .right, |
| .footer { |
| height: 50px; |
| line-height: 50px; |
| text-align: center; |
| color: white; |
| } |
| |
| .header { |
| background-color: green; |
| } |
| |
| .container { |
| display: grid; |
| grid-template-columns: 200px auto 100px; |
| } |
| |
| .left { |
| width: 200px; |
| background-color: skyblue; |
| } |
| |
| .center { |
| background-color: deeppink; |
| } |
| |
| .right { |
| width: 100px; |
| background-color: orangered; |
| } |
| |
| .footer { |
| background-color: darkorange; |
| } |
复制
优点
缺点
圣杯布局(Holy Grail Layout)
实现思路
- 容器设置padding
- 为左右两侧预留出空间
- padding-left = 左侧栏宽度
- padding-right = 右侧栏宽度
- 三列浮动
- 所有列都设置float: left
- 使三列在同一行显示
- 中间列设置
- 左侧列定位
- margin-left: -100%将其拉到最左边
- relative定位配合left值将其移出padding区域
- 右侧列定位
| <header class="header">header</header> |
| <main class="container"> |
| <div class="center">center</div> |
| <div class="left">left</div> |
| <div class="right">right</div> |
| </main> |
| <footer class="footer">footer</footer> |
复制
| .header, |
| .left, |
| .center, |
| .right, |
| .footer { |
| height: 50px; |
| line-height: 50px; |
| text-align: center; |
| color: white; |
| } |
| |
| .header { |
| background-color: green; |
| } |
| |
| .container { |
| padding-left: 200px; |
| padding-right: 100px; |
| } |
| |
| .left { |
| float: left; |
| position: relative; |
| left: -200px; |
| margin-left: -100%; |
| width: 200px; |
| background-color: skyblue; |
| } |
| |
| .center { |
| float: left; |
| width: 100%; |
| background-color: deeppink; |
| } |
| |
| .right { |
| float: left; |
| margin-right: -100px; |
| width: 100px; |
| background-color: orangered; |
| } |
| |
| .footer { |
| clear: both; |
| background-color: darkorange; |
| } |
复制
优点
缺点
- 使用相对定位复杂
- 宽度限制严格
- 有最小宽度限制
- 维护成本高
双飞翼布局(Double Wing Layout)
实现思路
- 中间列设置
- 宽度100%占满容器
- 内部div通过margin为两侧预留空间
- 左侧列定位
- 使用margin-left: -100%
- 将左侧栏拉到最左边
- 右侧列定位
代码
| <header class="header">header</header> |
| <main class="container"> |
| <div class="center">center</div> |
| </main> |
| <div class="left">left</div> |
| <div class="right">right</div> |
| <footer class="footer">footer</footer> |
复制
| .header, |
| .left, |
| .center, |
| .right, |
| .footer { |
| height: 50px; |
| line-height: 50px; |
| text-align: center; |
| color: white; |
| } |
| |
| .header { |
| background-color: green; |
| } |
| |
| .container { |
| float: left; |
| width: 100%; |
| } |
| |
| .left { |
| float: left; |
| margin-left: -100%; |
| width: 200px; |
| background-color: skyblue; |
| } |
| |
| .center { |
| margin-left: 200px; |
| margin-right: 100px; |
| background-color: deeppink; |
| } |
| |
| .right { |
| float: left; |
| margin-left: -100px; |
| width: 100px; |
| background-color: orangered; |
| } |
| |
| .footer { |
| clear: both; |
| background-color: darkorange; |
| } |
复制
优点
缺点