范仁义css3课程---22、float导致的父容器高度坍塌及解决
一、总结
一句话总结:
原因:浮动元素脱离文档流,使包含它的无高度样式的父容器感知不到其存在而发生内容无法撑开高度的现象
解决:增加一个空的块元素,清除浮动:clear:both;,让它把父元素撑开。
1、float布局导致的父容器高度坍塌的原因是什么?
浮动元素脱离文档流,使包含它的无高度样式的父容器感知不到其存在而发生内容无法撑开高度的现象
2、解决 float布局导致的父容器高度坍塌的 最常见方法?
增加一个空的块元素,清除浮动:clear:both;,让它把父元素撑开。
二、float布局导致的父容器高度坍塌问题及其解决方法
博客对应课程的视频位置:22、float导致的父容器高度坍塌(一)
https://www.fanrenyi.com/video/10/59
转自或参考:float布局导致的父容器高度坍塌问题及其解决方法 - 简书
https://www.jianshu.com/p/89ced81bf0f1
a、父容器高度坍塌问题
导致的原因
浮动元素脱离文档流,使包含它的无高度样式的父容器感知不到其存在而发生内容无法撑开高度的现象
实例图:
b、解决方案
1.给父容器设置高度样式(height
)
缺点:只能适用于父容器高度固定的情况下,注定了这种方案很少用;
2.因为浮动元素可以感知到浮动元素的存在,所以可以给父容器也设置浮动样式,使其感知到其内的浮动元素
缺点:给父容器设置了浮动样式后,父容器的父容器也会产生高度坍塌问题;
3.对父容器设置overflow: hidden/auto
,触发其BFC
缺点:设置hidden会导致超出部分直接被隐藏,且不占据文档流位置,而设置auto的话超出部分会生成一个滚动条,影响视觉效果。
比如相对定位的内容会被隐藏
4.使用伪类元素,再用伪类元素清除浮动
缺点:CSS代码量增多
PS:此法要注意的是,必须是
after
伪元素,且该伪类元素必须为block
元素,原因是after
伪元素在其父容器的其他标签的最后添加一个元素,渲染顺序排在了其父容器内部的最后,然后设置block
元素是为了不让其它元素与其一排,再对其设置清除浮动,父容器自然就被这个after
伪元素撑开了高度5.使用块级标签撑开高度,此法和伪类法类似
缺点:增加了无意义的标签
三、课程代码
1.给父容器设置高度样式(height)
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>float导致的父容器高度坍塌</title> 6 <style> 7 .box1{ 8 width: 300px; 9 border: 5px solid red; 10 height: 150px; 11 } 12 .box2{ 13 width: 100px; 14 height: 100px; 15 background-color: orange; 16 float: right; 17 } 18 </style> 19 </head> 20 <body> 21 <div class="box1"> 22 <div class="box2"></div> 23 24 </div> 25 </body> 26 </html>
2.父容器设置为浮动:因为浮动元素可以感知到浮动元素的存在,所以可以给父容器也设置浮动样式,使其感知到其内的浮动元素
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>float导致的父容器高度坍塌</title> 6 <style> 7 .box1{ 8 width: 300px; 9 border: 5px solid red; 10 float: left; 11 } 12 .box2{ 13 width: 100px; 14 height: 100px; 15 background-color: orange; 16 float: right; 17 } 18 </style> 19 </head> 20 <body> 21 <div class="box1"> 22 <div class="box2"></div> 23 </div> 24 </body> 25 </html>
3.bfc方式:对父容器设置overflow: hidden/auto,触发其BFC
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>float导致的父容器高度坍塌</title> 6 <style> 7 .box1{ 8 width: 300px; 9 border: 5px solid red; 10 overflow: auto; 11 } 12 .box2{ 13 width: 100px; 14 height: 100px; 15 background-color: orange; 16 float: right; 17 } 18 .box3{ 19 position: relative; 20 top: 250px; 21 left: 10px; 22 } 23 </style> 24 </head> 25 <body> 26 <div class="box1"> 27 <div class="box2"></div> 28 <div class="box3">缺点</div> 29 </div> 30 </body> 31 </html>
4.使用块级标签撑开高度, (为什么内联元素不行)
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>float导致的父容器高度坍塌</title> 6 <style> 7 .box1{ 8 width: 300px; 9 border: 5px solid red; 10 } 11 .box2{ 12 width: 100px; 13 height: 100px; 14 background-color: orange; 15 float: right; 16 } 17 .box3{ 18 clear: both; 19 } 20 </style> 21 </head> 22 <body> 23 <div class="box1"> 24 <div class="box2"></div> 25 <div class="box3"></div> 26 </div> 27 </body> 28 </html>
5.(放在父元素盒子上)使用伪类元素,再用伪类元素清除浮动
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>float导致的父容器高度坍塌</title> 6 <style> 7 .box1{ 8 width: 300px; 9 border: 5px solid red; 10 } 11 .box2{ 12 width: 100px; 13 height: 100px; 14 background-color: orange; 15 float: right; 16 } 17 .box3{ 18 clear: both; 19 } 20 .clearfix:after{ 21 content: ''; 22 display: block; 23 clear: both; 24 } 25 </style> 26 </head> 27 <body> 28 <div class="box1 clearfix"> 29 <div class="box2"></div> 30 </div> 31 </body> 32 </html>
6、float的最初目的:文字环绕
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 <style> 7 .box1{ 8 width: 200px; 9 } 10 .box2{ 11 width: 100px; 12 height: 100px; 13 background-color: orange; 14 float: left; 15 } 16 </style> 17 </head> 18 <body> 19 <div class="box1"> 20 <div class="box2"></div> 21 <div class="box3">浮动元素脱离文档流,使包含它的无高度样式的父容器感知不到其存在而发生内容无法撑开高度的现象</div> 22 </div> 23 </body> 24 </html>