今天在MDN看到块格式化上下文有点不以为然,关键是它写的高深莫测,读不懂...
于是下午想试试圣杯布局的时候,终究还是逃不过它。🤣
这里不介绍圣杯布局的历史,这样的文章网上不知道多少篇,我来写写千篇一律中的亮点吧,哈哈。
这篇文章有配解释图,能让你更好理解如何一步一步搭建起来~
此处是圣杯的布局
<!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>
<style>
body {
min-width: 550px;
}
* {
margin: 0;
padding: 0;
}
#container {
padding-left: 200px;
padding-right: 150px;
min-height: 300px;
}
#header,
.footer {
background-color: black;
height: 40px;
}
#center {
background-color: darkgrey;
min-height: 300px;
}
#left {
width: 200px;
margin-left: -100%;
position: relative;
right: 200px;
background-color: blue;
min-height: 300px;
}
#container .column {
float: left;
}
#center {
width: 100%;
}
#right {
width: 150px;
background-color: brown;
min-height: 300px;
margin-right: -150px;
}
#footer {
clear: both;
}
</style>
</head>
<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>
然后当我解读这段代码时候,我奇怪的是什么,left需要margin-left:-100%
就提升所谓的高度了。。。
其实正常文档流中,如果你的center宽度小点,这三个元素是并排显示的,因而margin-left的负值(应该往左移动),还是100%,将移动最左侧了,所以覆盖了。
排列位置是center,left,right,left被移动走了,再margin-right就去右边了。
那为什么left还要借助postion,right却不用呢?
margin-left设置百分比是相对于父元素宽度的,这个宽度是不包括padding在内的,所以到达了与center重叠的地方
right是往右走,其实代码不唯一,你设置-100%,照样到末尾。
而 position: relative;
,你还要注意left这边算最小宽度时候要算两遍,因为它原来的宽度是存在的。
那么为什么会提到刚刚我说的块格式化上下文,英文名就是BFC
我是看到了这篇介绍,我没看懂,感觉该作者语言组织不好。。。
没办法,于是我就去补了BFC的漏洞
当你有了理解之后,再来看本文❗
现在你终于知道为什么设置float之后,这些元素不会重叠,因为他们属于BFC并且BFC与浮动容器不重合,
可是为什么设置margin-left的负值(应该往左移动,反倒上去重合了呢?)-》margin-left强制改动了位置。