- 现在已经很少用到浮动了,一般用flex就可以很好的解决了。但是面试还是考,所以还是写一下
- 三栏布局的关键点是要答出浮动和margin-left为负值
圣杯布局
-
圣杯布局和双飞翼布局都是前端工程师需要日常掌握的重要布局方式。两者的功能相同,都是为了实现一个两侧宽度固定,中间宽度自适应的三栏布局(中间先加载渲染)
-
在圣杯布局中,首先要给中间父容器设置左右的paddding预留出相应的宽度,比如将父容器左右的padding都设置为200px
-
然后分别为父容器中的三列子元素left、content、right设置宽度和浮动,同时对最下面footer清除浮动
-
对中间content宽度设置100%,即撑满了父容器的内容区
-
然后对左边left的div设置margin-left:-100%(即向左移动200%,这是整个content自身的宽度),然后再设置position为relative,left设置-200px,即再向左移动200px,这样left就到了最左边的位置
-
接着对right这个div,设置margin-left:-200px,然后再将position设置为relative,left设置为200px;
-
最后记得对footer清除浮动
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>圣杯布局</title>
<style>
.header,.footer{
width:100%;
background-color: pink;
height:10px
}
.wrap{
padding-left: 200px;
padding-right: 200px;
background-color: rgba(146, 186, 245, 0.5);
}
#content{
background-color: aqua;
width:100%;
height:200px;
float:left;
}
#left{
background-color: blueviolet;
width:200px;
height:200px;
float:left;
position:relative;
margin-left:-100%;
left:-200px;
}
#right{
background-color:coral;
width:200px;
height:200px;
float:left;
position:relative;
margin-left:-200px;
left:200px;
}
.footer{
clear:both
}
</style>
</head>
<body>
<div class="header"></div>
<div class="wrap">
<div id="content"></div>
<div id="left"></div>
<div id ='right'></div>
</div>
<div class="footer"></div>
</body>
双飞翼布局
- 双飞翼布局也都是将content\left\right设置为浮动,但是它并没有给他们的父容器设置padding,
- 这里,比如left和right的width都为200px,然后content区域的width为100%
- 它是直接先给left设置margin-left:-100%,这样left就覆盖到了content区域的最左边
- 然后给right设置margin-left:-200px,这样right就覆盖到了content区域的最右边
- 最后再给content容器中套一个inner容器,将inner容器的左右外边距都设置为200px
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>双飞翼布局</title>
<style>
.header,.footer{
width:100%;
height:10px;
background-color: pink;
}
.footer{
clear:both
}
.item{
float:left;
}
.content{
width:100%;
height:200px;
background-color: blue;
}
.left{
width:200px;
height:200px;
background-color: aqua;
margin-left:-100%;
}
.right{
width:200px;
height:200px;
background-color: brown;
margin-left:-200px;
}
.inner{
margin:0 200px 0 200px;
}
</style>
</head>
<body>
<div class="header"></div>
<div class="wrap">
<div class="content item">
<div class="inner">
</div>
</div>
<div class="left item"></div>
<div class ='right item'></div>
</div>
<div class="footer"></div>
</body>
- 可以看出,圣杯布局和双飞翼布局的实现效果都一样,他们都给content\left\right设置了浮动,而且在HTML中的加载顺序都是中间先渲染,然后是左右再渲染。
- 不同的地方在于,圣杯布局是先给最外层容器设置了内部边距防止覆盖中间的内容层,然后再调整左右容器的位置。但是双飞翼布局则是通过给中间容器再套一个内容容器,来防止内容被左右容器遮挡
两栏布局
- 左边定宽,右边自适应,两者不会相互影响
- 方法:给左边容器添加一个float,然后将右边容器设为一个bfc,这样便可以
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<style>
.left {
width: 200px;
height: 300px;
background-color: rgba(12, 12, 12, 0.2);
float: left;
}
.right {
height: 200px;
overflow: hidden;
background-color: rgb(21, 204, 113);
}
</style>
<body>
<div class="box">
<div class="left">
</div>
<div class="right">
</div>
</div>
</body>
</html>