持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情
两栏布局
就是一个边栏,一个主栏,边栏宽度固定,主栏根据设备宽度,变宽或者变窄
<div class="container">
<div class="left">left</div>
<div class="right">right</div>
</div>
1. 浮动、BFC
通过设置 overflow:hidden 触发 BFC ,BFC的区域不会与浮动元素的区域重叠
BFC( Block Formatting Context )即
块级格式上下文,简单的说,BFC是页面上的一个隔离的独立容器,其内部元素和外部元素不会相互影响
.left{
width: 200px
float: left;
background-color: blue;
}
.right{
/* 触发BFC */
overflow: hidden;
background-color: pink;
}
2. Flex布局
.container{
display: flex;
}
.left{
width: 200px;
background-color: blue;
}
.right{
flex: 1;
background-color: pink;
}
3. Grid布局
.container {
display: grid;
grid-template-columns: 200px 1fr;
}
.left{
background-color: blue;
}
.right{
background-color: pink;
}
注: grid-template-columns指定页面分成两列。第一列的宽度是200px;第二列为1fr,即所有剩余宽度。
三栏布局
中间自适应,两边定宽
1. 圣杯布局
- 三者都设置向左浮动
- 设置中间部分宽度为100%;
- 设置负边距, left设置负左边距为100%, right设置负左边距为负的自身宽度
- 设置container的padding值给左右两个子面板留出空间
- 设置两个子面板为相对定位,
left面板的left值为负的left面板宽度,right面板的right值为负的right面板的值
但是圣杯布局有个问题:当中间面板的部分比两边的子面板宽度小的时候,布局就会乱掉。因此也就有了双飞翼布局来克服这个问题。如果不增加任何标签,想实现更完美的布局非常困难,因此双飞翼布局在主面板上选择了加一个标签
<div class="container clearfix">
<div class="center"></div>
<div class="left"></div>
<div class="right"></div>
</div>
/* 解决浮动引起的高度塌陷 */
.clearfix::after{
content: "";
clear: both;
display: block;
}
.container{
padding: 0 200px;
}
.center,.left,.right{
float: left;
}
/* 中间部分宽度自适应 */
.center{
width: 100%;
min-height: 400px;
background-color: #34495e;
}
.left,.right{
width: 200px;
min-height: 400px;
}
/* 左边栏使用margin-left移动中间部分的宽度,再使用相对定位向左移动自身的宽度 */
.left{
margin-left: -100%;
background-color: #2ecc71;
position: relative;
left:-200px;
}
.right{
margin-left: -200px;
background-color: #3498db;
position: relative;
right:-200px;
}
2. 双飞翼布局
- left、container、right都设置左浮动
- 设置container宽度为100%
- 设置负边距,left设置margin-left为-100%,right设置margin-left为负的自身宽度
- 设置center的margin值为left和right宽度,为左右两个侧栏留出空间
<div class=" clearfix">
<div class="container">
<div class="center"></div>
</div>
<div class="left"></div>
<div class="right"></div>
</div>
.clearfix::after{
content: "";
clear: both;
display: block;
}
.container,.left,.right{
float: left;
}
.container{
width: 100%;
}
.center{
margin: 0 200px;
min-height: 400px;
background-color: #34495e;
}
.left,.right{
width: 200px;
min-height:400px;
}
.left{
margin-left: -100%;
background-color: #2ecc71;
}
.right{
margin-left: -200px;
background-color: #3498db;
}
双飞翼布局与圣杯布局的主要差别在于:
- 双飞翼布局给主面板(中间元素)添加了一个父标签,用来通过margin给子面板腾出空间
- 圣杯布局采用的是padding,而双飞翼布局采用的margin, 解决了圣杯布局的问题
- 双飞翼布局不用设置相对定位,以及对应的left和right值
3. Flex弹性布局
<div class="container">
<div class="left"></div>
<div class="center"></div>
<div class="right"></div>
</div>
.container{
display: flex;
min-height: 400px;
}
.left,.right{
background-color: #95a5a6;
width: 200px;
/* flex: 0 0 200px; */ 与使用宽度能够实现同样的效果
}
.center{
flex:1;
background-color: #000;
}
4. Grid 布局(网格布局)
- container 设置为
display: grid - 设置三栏的高度
grid-template-rows: 400px - 设置三栏的宽度,中间自适应,两边固定
grid-template-columns: 100px auto 200px;
grid-template-columns属性定义每一列的列宽
grid-template-rows属性定义每一行的行高
/* html同上Flex弹性布局*/
.container{
display: grid;
grid-template-rows: 400px;
grid-template-columns: 200px auto 200px;/* 设置列宽,也可使用百分比 */
}
.left,.right{
background-color: #95a5a6;
}