今天在 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 强制改动了位置。
