重温圣杯布局和双飞翼布局的实现
前言
PC 端经常会用到三栏布局,而在之前常用的实现就是圣杯布局和双飞翼布局,两者的核心思想类似,只在最后处理中间内容撑开侧边栏的时候有些差异。
现在很少有必须使用圣杯和双飞翼的场景,但是对两者的大致实现还是有必要了解的。
下面会说一下两者的核心思想和实现,同时最后会附上 Flex 实现的三栏布局进行对比。
通用步骤
核心思想:内容优先,内容块在前,导航栏紧随其后。主要借助浮动和负margin值,将三栏拉齐到同一行。
第一步:写好基本样式
<div class="container">
<main class="main">#Main</main>
<nav class="left">#Left</nav>
<nav class="right">#Right</nav>
</div>
.main {
width: 100%;
height: 500px;
background-color: lightcoral;
}
.left,
.right {
width: 150px;
height: 500px;
background-color: lightblue;
}
第二步:三栏浮动,容器清除浮动
.main,
.left,
.right {
float: left;
}
.clearfix::after {
content: " ";
clear: both;
display: block;
}
第三步:负 margin 拉侧边栏
.left {
margin-left: -100%;
}
.right {
margin-left: -150px;
}
接下来圣杯和双飞翼的处理方式不同, 核心思想都是将内容栏正确显示出来。
圣杯
圣杯的处理方式纯靠 CSS 实现
第四步:容器 margin 预留两侧位置
.container {
margin: 0 150px;
}
第五步:侧边栏设置相对移动,完成布局
.left {
position: relative;
left: -150px;
}
.right {
position: relative;
right: -150px;
}
双飞翼
而双飞翼添加了一个子元素,但 CSS 样式更简单
第四步:.main
添加子元素
<main class="main">
<div class="content">#Content</div>
</main>
第五步:子元素 margin,把自己挤到中间,完成布局
.content {
margin: 0 150px 0 150px;
}
附: Flex 实现三栏布局
HTML 的基本结构和圣杯与双飞翼一样
<div class="container">
<main class="main">#Main</main>
<nav class="left">#Left</nav>
<nav class="right">#Right</nav>
</div>
CSS 样式也很简单:内容自适应增长,左右侧边栏固定宽度,最后使用 order 属性将左侧边栏提到前面即可
.container {
display: flex;
}
.main {
flex-grow: 1;
background-color: lightcoral;
}
.left,
.right {
flex-basis: 150px;
background-color: lightblue;
}
.left {
order: -1;
}
对比非常明显,使用 Flex 进行布局要简单太多了,所以说非特殊情况下,应优先考虑使用 Flex 进行三栏布局。