两栏布局、三栏布局
两栏布局
float + margin
实现步骤如下:
- 使用float左浮左边栏
- 右边栏使用margin-left,撑出内容块(避免与左边栏重叠)
- 触发父元素BFC,防止下方元素受float影响上浮
<div class="box">
<div class="left"></div>
<div class="right"></div>
</div>
<style>
.box{
overflow: hidden;
}
.left{
float: left;
width: 200px;
}
.right{
margin-left: 210px;
}
</style>
float + calc
<div class="box">
<div class="left"></div>
<div class="right"></div>
</div>
<style>
.box{
overflow: hidden;
}
.left{
float: left;
width: 200px;
}
.right{
float: right;
width: calc(100% - 200px)
}
</style>
flex
flex布局下,子元素默认是自动填满高度。 如果需要高度自动,则需要给
.box
设置align-items: flex-start
<div class="box">
<div class="left"></div>
<div class="right"></div>
</div>
<style>
.box{
display:flex;
}
.left{
width: 200px;
}
.right{
flex: 1; // 平铺满剩余的空间
}
</style>
三栏布局
圣杯布局
使用float和负margin,实现三栏布局。(外国人发明)
实现步骤如下:
- 设置三栏的宽度
- 全部左浮动,由于content的宽度是100%,所以left和right会被挤到下一行
- 给left和right设置负margin值,将left和right拉回,覆盖在content上
- 给三栏的父元素增加padding值
- 将left和right,定位到父元素的空白处(padding)
- 触发三栏父元素的BFC,自适应内部浮动元素的高度
<div class="box">
<div class="content"></div>
<div class="left"></div>
<div class="right"></div>
</div>
<style>
.box{
padding: 0 300px 0 200px;
overflow: hidden;
}
.content, .left, .right{
float: left;
}
.content{
width: 100%;
}
.left{
width: 200px;
margin-left: -100%;
position: relative;
left: -200px;
}
.right{
width: 300px;
margin-left: -300px;
position: relative;
right: 300px;
}
</style>
双飞翼布局
tip
双飞翼布局,是在圣杯布局上,做了父元素padding留白的优化。
- 给 content 加子元素
<div class="content">
<div class="inner"></div>
</div>
- 给inner设置margin值,将内容区挤到中间进行显示
<style>
.inner{
margin-left: 200px;
margin-right: 300px;
}
</style>
flex
注意点
使用flex的order属性,将元素进行优先排列,达到SEO和展示的平衡。
<div class="box">
<div class="content"></div>
<div class="left"></div>
<div class="right"></div>
</div>
<style>
.box{
display: flex;
}
.left{
width: 200px;
order: -1; /* 排序在最前 */
}
.right{
width: 300px;
}
.content{
flex: 1;
}
</style>
grid
注意点
使用grid-area属性,将元素进行优先排列,达到SEO和展示的平衡。
<div class="box">
<div class="content"></div>
<div class="left"></div>
<div class="right"></div>
</div>
<style>
.box{
display: grid;
grid-template-areas: "left content right";
grid-template-columns: 200px auto 300px;
}
.left{
grid-area: "left";
}
.right{
grid-area: "right";
}
.content{
grid-area: "content";
}
</style>