你必须会的经典面试题——清除浮动和BFC的关系
浮动介绍:
在 JavaScript 中,“浮动”通常指的是 CSS 中的浮动(float)属性,它用于控制元素在页面中的布局方式。
当一个元素被设置为浮动时,它会脱离文档流,意味着其他元素会忽略它的存在并继续在文档中定位。浮动的元素会尽量向其容器的左侧或右侧移动,直到碰到容器的边缘或其他浮动的元素。这使得元素能够在页面上创建复杂的布局结构,比如实现多栏布局或者文字环绕图片等效果。
浮动:
1 .实现文字环绕效果
2 .导致一个元素脱离文档流
3 .浮动可以让一个块级元素水平排列
4 . 浮动元素可以用 margin ,但是不能用 margin:0 auto;
浮动效果
<style>
img {
width: 100px;
float: left;
}
</style>
<div class="box">
<img src="https://img1.baidu.com/it/u=3387871259,1653657207&fm=253&fmt=auto&app=138&f=JPEG?w=400&h=400" alt="">
<p>会议指出,改革开放是党和人民事业大踏步赶上时代的重要法宝。当前和今后一个时期是以中国式现代化全面推进强国建设、民族复兴伟业的关键时期。面对纷繁复杂的国际国内形势,面对新一轮科技革命和产业变革,面对人民群众新期待,必须继续把改革推向前进。这是坚持和完善中国特色社会主义制度、推进国家治理体系和治理能力现代化的必然要求,是贯彻新发展理念、更好适应我国社会主要矛盾变化的必然要求,是坚持以人民为中心、让现代化建设成果更多更公平惠及全体人民的必然要求,是应对重大风险挑战、推动党和国家事业行稳致远的必然要求,是推动构建人类命运共同体、在日趋激烈的国际竞争中赢得战略主动的必然要求,是解决大党独有难题、建设更加坚强有力的马克思主义政党的必然要求。全党必须自觉把改革摆在更加突出位置,紧紧围绕推进中国式现代化进一步全面深化改革。</p>
</div>
1.
使用 float:left 实现文字环绕效果,导致元素脱离文档流,此时图片并没有盖住文字。
可以使用绝对定位 position: absolute 仍然使元素脱离文档流,并实现覆盖效果。
2.
如何让块级元素出现在同一行?
- 使用 float: left 进行浮动布局,所以浮动可以让块级元素水平排列
- 使用 display:inline-block 设置,不过此时的三个块级元素会有间隙,这是由于 li 标签的换行导致,可以在 ul 下用 font-size: 0 消除
3. 插入一点:使用 margin 可以设置浮动元素,但是不能使用 margin: 0 auto 设置
附上完整代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
/* ul {
font-size: 0;
} */
li {
list-style: none;
}
.item{
width: 200px;
height: 50px;
/* display: inline-block; */
float: left;
margin-right: 10px;
margin: 0 auto;
}
.item:first-child{
background-color: rgba(255, 0, 0, 0.658);
}
.item:nth-child(2){
background-color: blue;
}
.item:last-child{
background-color: green;
}
</style>
</head>
<body>
<ul>
<li class="item">1</li>
<li class="item">2</li>
<li class="item">3</li>
</ul>
</body>
</html>
以上就是浮动的简单介绍。
清除浮动(重点)
清除浮动方法:
1. 设置父元素的高度
2. 在父元素结束之前添加一个空元素,并设置 clear: both;
3. 借助伪元素 ::after 清除浮动
4. 把父容器设置成 BFC 容器
5. 给后面受影响的元素设置 clear: both;
一个子元素的浮动会导致其父容器的高度塌陷,进而导致其他元素的布局。清除浮动的目的就是让其父容器的高度不塌陷。
会发现 div 和 ul 来到了同一行,此时 ul 的高度为0,标题和子元素并列在同一行,这就违背了正常的布局效果,要实现标题在上,元素在下的效果布局:
1. 通过 ul { height: 50px;
} 直接在父容器的身上设置高度。
2. 在父元素结束之前添加一个空元素,并设置 clear: both;
.clear { clear:both; }
3. 借助伪元素 ::after 清除浮动(优雅解法)
ul::after{ content: ''; clear: both; display: block; }
4. 把父容器设置成 BFC 容器 (后续详细介绍BFC)
5. 给后面受影响的元素设置 clear: both; 父容器便不会受影响。
附上完整代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
li {
list-style: none;
}
.item {
width: 200px;
height: 50px;
float: left;
}
.item:first-child {
background-color: rgba(255, 0, 0, 0.658);
}
.item:nth-child(2) {
background-color: blue;
}
.item:nth-child(3) {
background-color: green;
}
/* 清除浮动 */
/* ul {
height: 50px;
} */
/* .clear {
clear:both;
} */
ul::after{
content: '';
clear: both;
display: block;
}
/* ul{
overflow: hidden;
} */
</style>
</head>
<body>
<ul>
<li class="item">1</li>
<li class="item">2</li>
<li class="item">3</li>
<!-- <div class="clear"></div> -->
</ul>
<div class="title">这是标题</div>
</body>
</html>
最终的效果:
详细掌握浮动布局的消除很有必要,步骤方法也需要多多调试看看执行效果。
BFC
介绍: 即Block Formatting Context --- 块级格式化上下文
BFC容器内部和外部的容器相互隔离,互不影响 -- 解决margin重叠问题
BFC容器在计算高度时,浮动元素也参与计算 --- 清除浮动
设置一个wrap容器和一个子容器box,在wrap容器内添加 margin-top: 100px;
,这这是相对于body下的顶部100像素,实现下图的距离效果。
作为wrap的子容器box,在box中设置 margin-top: 50px;
,应该橙色会相对于蓝色往下移动50像素,并且上方留有50像素的蓝色边框,但是发现并没有任何的效果,事实上,box直接将父容器wrap往下拽,这是CSS中存在的一个BUG,这就margin重叠。
margin重叠
只发生在上下,不发生在左右。这就要使用BFC布局规则。
BFC布局规则:通过 overflow: hidden;
设置为BFC容器。
- 内部的BOx会在垂直方向,一个接一个地放置
- BFC容器内部和外部的容器相互隔离,互不影响 -- 解决margin重叠问题
- BFC容器内,在垂直方向上相邻元素的margin会重叠
- BFC容器在计算高度时,浮动元素也参与计算 --- 清除浮动
这里发现第一个li的底部和第二个li的顶部重叠了,所以在BFC容器内,在垂直方向上相邻元素的margin会重叠。(左右不会)
触发BFC
- overflow: hidden || auto || overlay || scroll
- flaot: left || right
- position: absolute || fixed
- display: inlne-block
- display: table-cell || table-xxx
- display: flex || inlne-flex
使用如上的方法就可以触发BFC容器。深刻理解清除浮动和BFC容器的关系,希望面前的你也能在面试中游刃有余。
转载自:https://juejin.cn/post/7363539020356321289