参考链接:https://blog.csdn.net/h_qingyi/article/details/81269667
方案1:触发 BFC 实现清除浮动
.fahter{
width: 400px;
overflow: hidden;
}
缺点:内容增多的时候容易造成不会自动换行导致内容被隐藏掉,无法显示要溢出的元素
方案2:使用 after 伪元素清除浮动
.clearfix:after{/*伪元素是行内元素 正常浏览器清除浮动方法*/
content: "";
display: block;
height: 0;
clear:both;
visibility: hidden;
}
.clearfix{
*zoom: 1;/*ie6清除浮动的方式 *号只有IE6-IE7执行,其他浏览器不执行*/
}
优点:符合闭合浮动思想,结构语义化正确 缺点:ie6-7 不支持伪元素:after,使用 zoom:1 触发 hasLayout.
方案3:使用 before 和 after 双伪元素清除浮动
.clearfix:after,.clearfix:before{
content: "";
display: table; /* ??? */
}
.clearfix:after{
clear: both;
}
.clearfix{
*zoom: 1;
}
参考链接
https://blog.csdn.net/Cinderella_hou/article/details/52156333
https://chokcoco.github.io/CSS-Inspiration/#/./layout/holy-grail-layout
https://www.cnblogs.com/hfdj/p/7554933.html
https://www.jianshu.com/p/81ef7e7094e8
解决方案:绝对定位、圣杯布局及双飞翼布局方案、 flex 方案
原理:
- 圣杯布局的关键点是通过 margin-left 与 left 属性将左右两列放置到准确的位置
- 圣杯布局的关键点父元素需要设置 padding
- 圣杯布局的关键点 margin-left 取值为百分比时,是以其父元素的宽度为基准的
缩放浏览器能看到自适应效果,分析过程见链接1
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>三栏自自适应布局</title>
</head>
<style>
body {
min-width: 550px;
margin: 0;
padding: 0;
}
#container {
padding-left: 200px;
padding-right: 150px;
}
#container .column {
float: left;
height: 100vh;
}
#center {
width: 100%;
background: red;
}
#left {
width: 200px;
margin-left: -100%;
position: relative;
right: 200px;
background: green;
}
#right {
width: 150px;
margin-right: -150px;
background: blue;
}
#footer {
clear: both;
}
</style>
<body>
<div id="header"></div>
<div id="container">
<div id="center" class="column"></div>
<div id="left" class="column"></div>
<div id="right" class="column"></div>
</div>
<div id="footer"></div>
</body>
</html>
双飞翼布局左中右三列布局,渲染顺序中间列书写在前保证提前渲染,左右两列定宽,中间列自适应剩余宽度。
双飞翼布局与圣杯布局的不同之处,圣杯布局的的左中右三列容器,中间middle多了一个子容器存在,通过控制 middle 的子容器的 margin 或者 padding 空出左右两列的宽度。
- 双飞翼布局的关键点是通过 margin-left 属性将左右两列放置到准确的位置,通过控制 middle 的子容器的 margin 或者 padding 空出左右两列的宽度
- 双飞翼布局的关键点父元素不需要设置 padding
- 双飞翼布局的关键点 margin-left 取值为百分比时,是以其父元素的宽度为基准的
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>三栏自自适应布局</title>
</head>
<style>
body {
min-width: 500px;
margin: 0;
padding: 0;
}
#container {
width: 100%;
}
.column {
float: left;
height: 100vh;
}
#center {
margin-left: 200px;
margin-right: 150px;
background: orange;
height: 100vh;
}
#left {
width: 200px;
margin-left: -100%;
background: greenyellow;
}
#right {
width: 150px;
margin-left: -150px;
background: skyblue;
}
#footer {
clear: both;
}
</style>
<body>
<div id="header"></div>
<div id="container" class="column">
<div id="center"></div>
</div>
<div id="left" class="column"></div>
<div id="right" class="column"></div>
<div id="footer"></div>
</body>
</html>
我感觉 float 布局就是玄学吧.......
<!-- DOM结构 -->
<div id="container">
<div id="center"></div>
<div id="left"></div>
<div id="right"></div>
</div>
#container {
display: flex;
}
#center {
flex: 1; // 1 1 auto
}
#left {
flex: 0 0 200px;
order: -1;
}
#right {
flex: 0 0 150px;
}