先花1分钟时间,想想怎样实现一个三列布局???
在IFE的任务三和任务九中为实现这种布局想的几种方法。笔记~
PS:方便想象,左中右结构如下
1 2 3
| <div id="left"></div> <div id="middle"></div> <div id="right"></div>
|
问题描述:左右两栏宽度固定,中间一栏自适应。
应用背景:有时在网页中,左边栏通常作为侧栏显示一些次要信息,右边栏或者为广告位,需要优先渲染中间栏。
方案:
- HTML结构按中左右顺序,CSS为浮动+定位+内边距(圣杯布局)
- HTML结构按中左右顺序,CSS为浮动+外边距(双飞翼布局)
第一种方式实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| <div class="container"> <div id="middle"> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> </div> <div id="left"> <p>123</p> <p>123</p> <p>123</p> <p>123</p> </div> <div id="right"> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> </div> </div> .container { padding-left: 200px; padding-right: 220px; position: relative; overflow: hidden; background-color: #eee; } #left, #middle, #right { float: left; position: relative; } #left { left: -200px; margin-left: -100%; width: 200px; background-color: red; } #middle { width: 100%; background-color: green; } #right { right: -220px; margin-left: -220px; width: 220px; background-color: blue; }
|
注意:.container的宽度不能设置为100%!!否则左右两栏会溢出内容区
第二种方式实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| <div class="container"> <div id="middle"> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> </div> </div> <div id="left"> <p>123</p> <p>123</p> <p>123</p> <p>123</p> </div> <div id="right"> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> </div> #left, #right, .container { float: left; } #left { margin-left: -100%; width: 200px; background-color: red; } #right { margin-left: -220px; width: 220px; background-color: blue; } .container { width: 100%; background-color: #eee; } #middle { margin-left: 200px; margin-right: 220px; background-color: green; }
|
两种布局方式对比
相同点:
不同点:
- HTML结构不同,圣杯结构三栏同级,而双飞翼布局则是在中间栏外层再加上个包裹容器
- 圣杯布局利用相对定位+padding去除左栏和右栏对中间栏的遮挡
- 双飞翼布局则是利用中间栏的外边距
- 圣杯布局将中间栏的宽度设为100%,而双飞翼布局将中间栏的包裹层宽度设为100%
两种布局方式的效果是一样的:

问题扩展:不限宽高
布局策略:
- display: flex
对容器使用display: flex;,设置justify-content属性,有五个可选值:flex-star左对齐,'center’居中,flex-end右对齐,space-between两端对齐,中间内容均匀分布,space-around均匀分布(与space-between不同的是没有两端对齐)
需要对自适应的子元素设置width: 100%
最终实现等高布局,高度为子元素中最大的高度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| <div class="container"> <div id="left"> <p>123</p> <p>123</p> <p>123</p> <p>123</p> </div> <div id="middle"> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> </div> <div id="right"> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> <p>123</p> </div> </div> .container { display: flex; justify-content: space-between; background-color: #eee; } #left { width: 200px; background-color: red; } #middle { width: 100%; background-color: green; } #right { width: 220px; background-color: blue; }
|
Flex 布局教程:语法篇
Flex 布局教程:实例篇
- display: table-cell
对容器设置display: table; width: 100%,对子元素设置display: table-cell;
注意:
如果没有对容器设置width: 100%,自适应一栏的宽度只有自身宽度,不会填充容器。
对容器设置display: table; width: 100%,子元素不设置宽度,可以实现等高等宽布局。
还有一些奇奇怪怪的现象,如不设置容器宽度,子元素宽度均为100%时除第一个子元素外其他元素的宽度由自身子元素宽度决定
我所知道的几种display:table-cell的应用