归纳总结CSS中的一些基础内容
说一下css盒模型
- 可参考百度前端技术学院 第五天学习笔记(CSS盒模型)
- CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:边距,边框,填充,和实际内容。
- 标准盒模型:一个块的总宽度=width+margin(左右)+padding(左右)+border(左右)
- 怪异盒模型:一个块的总宽度=width+margin(左右)(既width已经包含了padding和border值)
- 在CSS3中引入了box-sizing属性,
box-sizing:content-box;
表示标准盒模型,box-sizing:border-box
表示的是替代盒模型(IE盒模型)
box-sizing的语法和基本用处
- box-sizing规定两个并排的带边框的框,语法为
box-sizing:content-box/border-box/inherit
- content-box:标准盒模型,宽度和高度分别应用到元素的内容框,在宽度和高度之外绘制元素的内边距和边框
- border-box:替代盒模型,为元素设定的宽度和高度决定了元素的边框盒
- inherit:继承父元素的box-sizing
画一条0.5px的线
- 参考文章1/参考文章2,注意不能直接设置0.5px,每个浏览器显示效果不同
- 先决条件:
- 屏幕的分辨率要足够高,设备像素比要大于1,即css中的1个像素对应物理屏幕中1个以上的像素点。
- 对于普通电脑,屏幕物理像素和css像素一一对应,显示的最小单位就是1px。而现在的手机,屏幕物理宽度一般都大于页面显示宽度。例如苹果6s的屏幕分辨率为1334x750像素,但是以375px的宽度显示页面,设备像素比就是750/375=2;此时在css中定义0.5px的宽度,实际上对应物理屏幕的1个像素点,这就是border小于1px的的实现基础。
- 【万能方法】meta viewport:
- 这样子就能缩放到原来的0.5倍,如果是1px那么就会变成0.5px。要记得viewport只针对于移动端,只在移动端上才能看到效果。
- 在移端开发里面一般会把viewport的scale设置成1,其中
width=device-width
表示将viewport视窗的宽度调整为设备的宽度,这个宽度通常是指物理上宽度。
- 默认的缩放比例为1,如iphone 6竖屏的宽度为750px,它的dpr=2,用2px表示1px,这样设置之后viewport的宽度就变成375px。这时候0.5px的边就使用我们上面讨论的方法。
- 这样的话,viewport的宽度就是原本的750px,所以1个px还是1px,正常画就行,但这样也意味着UI需要按2倍图的出,整体面面的单位都会放大一倍。
1 2
| <meta name="viewport" content="width=device-width, initial-scale=0.5"/>
|
- **CSS3中box-shadow**:
box-shadow: 0 0.5px 0 #000;
设置box-shadow的第二个参数为0.5px,表示阴影垂直方向的偏移为0.5px。这个方法在Chrome和Firefox都非常完美,但是Safari不支持小于1px的boxshadow,所以完全没显示出来了。不过至少找到了一种方法能够让PC的Chrome显示0.5px。
- CSS3中
transform: scale()
:transform: scale(0.5,0.5);
会导致Chrome变虚,而粗细几乎没有变化,只有Firefox比较完美看起来是实的而且还很细,效果和直接设置0.5px一样。
- CSS3中linear-gradient:
linear-gradient(0deg, #fff, #000)
的意思是:渐变的角度从下往上,从白色#fff
渐变到黑色#000
,而且是线性的,在高清屏上,1px的逻辑像素代表的物理(设备)像素有2px,由于是线性渐变,所以第1个px只能是#fff,而剩下的那个像素只能是#000,这样就达到了画一半的目的。逻辑分析很完美,实际的效果在各个流览器上面都不完美,效果都是虚的,和完美的0.5px还是有差距。这个效果和scale 0.5的差不多,都是通过虚化线,让人觉得变细了。
【看】CSS画三角形/正方体
- 三角形/扇形可利用border+transparent实现
- 重点:
transform-style: preserve-3d;
定义所有子元素在3D空间中呈现
transform: rotateX(-35deg) rotateY(30deg);
整体旋转,这样各个面就不用单独转到歪斜
position: absolute;
所有面绝对定位,否则各个面竖直分布,无法合成正方形
transform: rotateX(90deg) translateZ(50px);
注意rotate和translate顺序!旋转后z轴方向改变为向上,故向上平移!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| <!DOCTYPE html> <html lang="en">
<head> <meta charset="UTF-8"> <title>透视骰子</title> <style> .cube { transform-style: preserve-3d; transform: rotateX(-35deg) rotateY(30deg); }
.side { position: absolute; width: 100px; height: 100px; background: rgba(255, 99, 71, 0.6); border: 1px solid rgba(0, 0, 0, 0.5); color: white; text-align: center; line-height: 100px; font-size: 50px; }
.front { transform: translateZ(50px); }
.bottom { transform: rotateX(-90deg) translateZ(50px); }
.left { transform: rotateX(90deg) translateZ(50px); }
.right { transform: rotateY(90deg) translateZ(50px); }
.top { transform: rotateY(-90deg) translateZ(50px); }
.back { transform: rotateY(180deg) translateZ(50px); } </style> </head>
<body> <div class="cube"> <div class="side front">1</div> <div class="side back">6</div> <div class="side right">4</div> <div class="side left">3</div> <div class="side top">5</div> <div class="side bottom">2</div> </div> </body>
</html>
|
- CSS3 transform 属性应用于元素的2D或3D转换。这个属性允许你将元素旋转,缩放,移动,倾斜等
rotateX(angle)
定义沿着 X 轴的 3D 旋转。
translateZ(z)
定义 3D 平移,只是用 Z 轴的值。
- 注意XYZ轴的方向,以及rotate的方向与角度正负的关系:
- 原点位于元素正中心,x轴朝右,y轴朝下,z轴屏幕朝我们
- rotate方向 左手法则:伸出左手,大拇指指向正轴方向,四个手指的指向即是旋转正向。
- 重点:rotateX(..) 和translateZ(..)的前后顺序会导致结果不一样!
transform: rotateX(90deg) translateZ(50px);
意为沿着x轴旋转90度再沿着z轴平移50px,旋转后z轴方向为向上!
transform: translateZ(50px) rotateX(90deg);
意为沿着z轴平移50px再沿着x轴旋转90度,此时z轴方向为屏幕朝我们!
- CSS3 transform-style 属性指定嵌套元素是怎样在三维空间中呈现。
- 注意: 使用此属性必须先使用 transform 属性
preserve-3d
表示所有子元素在3D空间中呈现
- rgba:颜色中Alpha为色彩空间,也就是透明度/不透明度。
- 它的范围为0.0(完全透明)到1.0(完全不透明)之间,0.5为半透明。
rgba(255,255,255,0)
则表示完全透明的白色;
rgba(0,0,0,1)
则表示完全不透明的黑色;
link标签和@import标签的区别
- link属于html标签,只能放入html源代码中使用,而@import是css提供的,可看作为css样式,作用是引入css样式功能,html和css代码中都能使用。(区别举例参考)
- 页面被加载时,link会同时被加载,而@import引用的css会等到页面加载结束后加载。
- link是html标签,因此没有兼容性,而@import只有IE5以上才能识别。
- link方式样式的权重高于@import的。
- link使用方法:
- html文件中:
<link href="CSSurl路径" rel="stylesheet" type="text/css" />
- @import使用方法:
- css文件中:
@import url(CSS文件路径地址);
- html文件中:
1 2 3
| <style type="text/css"> @import url(CSS文件路径地址); </style>
|
- 总结:
- 方法1: 子绝父相,footer用bottom固定在底部
- 方法2: flexbox,设定父元素高度,子元素中主内容
flex:1
,等比撑满所有剩余空间,header和footer使用默认的flex:0 1 auto
使其只会在空间不足时等比缩小而不会放大,如此footer自然被撑在最下方
- 父元素高度是主内容能撑起剩余空间的前提
- flexbox默认所有子元素横向排列,需要设置为纵向排列
flex-direction:column
1 2 3 4 5 6 7 8 9 10
| // 方法1、2的html <body> <div class="page"> <header> 头部 </header> <div class="content"> <p class="内容区"></p> </div> <footer> 底部 </footer> </div> </body>
|
- 子绝父相:footer使用绝对定位+bottom固定在底部:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <style type="text/css"> * { margin: 0; padding: 0; } .page { box-sizing: border-box; min-height: 100vh; position: relative; padding-top: 20px; padding-bottom: 20px; } .content { background: red; } header { background: blue; width: 100%; height: 20px; position: absolute; top: 0; } footer { background: yellow; width: 100%; height: 20px; position: absolute; bottom: 0; } </style>
|
- 使用flexbox方法(阮一峰):父元素设置100vh,子项主内容flex设置为1,header和footer使用默认的flex,则有空余空间时主内容扩张以撑满所有剩余的空间,此时header便会自动吸顶,footer自动吸底
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <style type="text/css"> * { margin: 0; padding: 0; } .page { display: flex; flex-direction: column; min-height: 100vh; } .content { flex: 1; background: red; } </style>
|
因为flex子元素的flex默认值是0 1 auto(即0:如果存在剩余空间,也不放大。1:如果空间不足,则该子项格局1的比例缩小。auto:子项初始大小参照我的width和height属性)。而flex:1
规定有空余空间时主内容扩张以撑满所有剩余的空间(注意前提是其父容器的尺寸不为零)。除了content,其他flex项都不会占有父元素剩余空间,他们只会按照自己的宽高进行等比缩小,自然就自动吸顶和吸底了。
CSS3新属性:单位vh
vh是相对于视口的高度。视口被均分为100单位的vh
水平、垂直居中的方法
- 可参考百度前端技术学院 第七天学习笔记(CSS 居中)
- 例子代码和效果可看codepen
- 水平居中:
text-align: center;
:文本(父子元素设置都可以),内联/内联块元素/图片(给父元素设置text-align)
- 定宽块级元素:元素定宽+
margin: auto;
或margin: 0 auto;
- 注意:子元素 设置margin!
- 只适用于水平边距(如果
margin-top
或margin-bottom
为auto
,则其使用值为0),不适用于浮动/内联/绝对/固定定位元素
- 不定宽块级元素:
position: absolute + left: 50% + transform: translateX(-50%)
- 拓展补充: BFC不能解决绝对定位元素的高度塌陷问题,所以子绝父相时父元素必须给个 高度来避免绝对定位元素脱离文档流的问题
display: flex + justify-content: center
- 垂直居中:(必备条件:父元素是盒子容器且高度已经设定)
- line-height: 行内文本/块内单行文本垂直居中
vertical-align: middle
,必要时可给块元素设置display: table-cell
:特别适用于需要垂直居中不同类型内容的情况
- 会影响好多啊,图片还要另外设置,可不使用table-cell,而是其父元素用行高替代高度,且字体大小设为0。子元素本身设置
vertical-align:middle
,避开避开,能不用就不用吧
- vertical-align 通常不会被继承,基本都在 元素自身上设置。但块元素居中是父元素设置vertical-align,图片居中是图自己设置vertical-align且不需要设置父元素单元格(但是父元素的高度要用行高代替,且字体大小设0),文本是父子都可,难搞
- 块内多行文本垂直居中!!
- 行内文本垂直居中
- 图片垂直居中(还是别了,父元素要用line-height代替height,如果父元素其他内容换行了就很烦,用别的方式实现图片垂直居中吧例子)
- 行内元素或内联块级元素(如图标、按钮、链接等)
- 注意:vertical-align 某种情况下不作用于span元素 (原因可看《百度前端技术学院 第七天学习笔记(CSS居中)》)
- 定高块级元素:直接计算子元素的margin-top或margin-bottom,将其设置为(父元素高度-子元素高度)/2
- 注意:直接设置auto不会起效,如果
margin-top
或margin-bottom
为auto
,则其使用值为0
- 但flex可以,父元素设置
display:flex
,子元素设置margin:auto 0
- 也可以用 **子绝父相 + top、bottom、left、right设为0 + margin: auto **
- 不定高块级元素:
- flexbox:父元素使用
display: flex;
将其设置为弹性盒子父容器,然后设置align-items: center;
定义子项在交叉轴上的对齐方式
position:absolute + top: 50% + transform: translateY(-50%)
- 水平+垂直居中:
- text-align + line-height:块/行内元素单行文本双向居中
- 父元素display: table-cell + text-align: center + vertical-align: middle:实现行内 元素/图片双向垂直
- vertical-align限制好多啊,避开它吧,能不用就不用,问了一圈同事没人在用
- 块元素居中是父元素设置vertical-align,图片居中是图自己设置vertical-align且不需要设置父元素单元格,文本是父子都可,难搞
- flex:将父元素设置为
display: flex
,并且设置align-items: center; justify-content: center;
- 子绝父相 + top、left设为50% + transform: position:absolute +left: 50% + top: 50% + transform: translate(-50%, -50%)
- 子绝父相 + top、bottom、left、right设为0 + margin: auto:定位为上下左右为0,margin:auto可以实现脱离文档流的居中(子绝父相的情况)
- 注意: 子元素需要定高定宽!!
- 原理:当top、bottom为0时,margin-top&bottom设置auto的话会无限延伸沾满空间并平分,当left、right为0时,margin-left&right设置auto会无限延伸占满空间并平分
如何实现图片在某个容器中居中的?
- 代码和效果见codepen
- 父元素与图片固定宽高:
- 直接计算并设置子元素margin值
- 子绝父相 + top、bottom、left、right设为0 + margin:auto
- 父元素
display:flex
,子元素margin:auto
- 图片 不定宽高:
- 父元素设置
display: flex
、**align-items: center; justify-content: center
**
- 【vertical-align单独用行不通,必须联合字体大小为0,且父元素用行高替代高度】父元素设置
text-align:center
,子元素本身设置vertical-align:middle
- vertical-align:middle可能会造成基线的问题导致垂直不太居中,可参考这篇文章,如果想解决这个偏差就需要设置字体大小为0
- 放弃这种方法吧,真的麻烦
- 子绝父相,图片设置
position: absolute; left: 50%; top: 50%;transform: translate(-50%,-50%);
- 不知道自身宽高的情况下,可以利用translate()函数来进行水平垂直居中。
- 当使用
position: absolute;top: 50%;left: 50%;
, 是以左上角为原点,故不处于中心位置。
translate(-50%,-50%)
作用是**往上(x轴),左(y轴)移动自身长宽的 50%**,以使其居于中心位置。
如何实现元素的垂直居中
- 代码和效果见codepen
- 行内/块内文本:line-height设置为高度
- 父元素
display: flex; align-items: center;
- 高度确定时
- 元素绝对定位,top:50%,margin-top:-(高度/2)
- top:50%定位点是左上角,所以需要使用margin-top将其调高自身一半达到垂直居中
- 父元素设置
display:flex
,子元素设置margin:auto 0
- **子绝父相 + top、bottom、left、right设为0 + margin: auto **
- 高度不确定时,元素**绝对定位+transform:translateY(-50%)**向上移动自身高度的一半
- 行内/单元格内 图片/文本/块级元素:块元素居中是父元素设置单元格 + vertical-align,图片居中是图自己设置vertical-align且不需要设置父元素单元格(但是父元素的高度要用行高代替,且字体大小设0),文本是父子都可,难搞,能避则避
- vertical-align 不作用于span元素
width300,height300在屏幕上垂直水平居中
- 代码和效果见codepen
- 【子绝父相+top+left+transform】父元素设置
position:relative
,子元素设置position:absolute; top:50%; left:50%; transform:translate(-50%,-50%)
- 【子绝父相+top、bottom、left、right设为0+margin: auto】定宽定高元素可用
- 原理:当top,bottom为0时,margin-top&bottom设置auto的话会无限延伸沾满空间并平分,当left,right为0时,margin-left&right设置auto会无限延伸占满空间并平分
- 【flex+align-items+justify-content】父元素设置
display: flex; align-items: center; justify-content: center;
- 【flex+margin】父元素设置
display:flex
,子元素设置margin:auto
- 【父单元格、vertical-align+子margin: auto】 父元素设置
display:table-cell; vertical-align:middle
达到垂直居中,子元素设置margin:auto
实现水平居中【子元素设置vertical-align不行!!要父元素设置,我真是疯了,vertical-align好复杂555】
关于js动画和css3动画的差异性
- 渲染线程分为main thread和compositor thread,如果css动画只改变transform和opacity,这时整个CSS动画得以在compositor trhead完成(而js动画则会在main thread执行,然后出发compositor thread进行下一步操作),特别注意的是如果改变transform和opacity是不会layout或者paint的。
- 区别:
- 功能涵盖面,js比css大
- 实现/重构难度不一,CSS3比js更加简单,性能跳优方向固定
- 对帧速表现不好的低版本浏览器,css3可以做到自然降级
- css动画有天然事件支持
- css3有兼容性问题
display
主要取值有none,block,inline-block,inline,flex,grid等
inline-block、inline和block的区别
- Block:块级元素,其前后都会有换行符,能设置宽度,高度,margin/padding 水平垂直方向都有效
- 常见的块级元素包括
<div>
、<p>
、<h1>
到 <h6>
、<ul>
、<ol>
、<li>
等
- Inline:行元素,设置width和height无效,宽度和高度是由其内容决定。margin在竖直方向上无效,padding在水平方向垂直方向都有效,前后无换行符
- 常见的内联元素包括
<span>
、<a>
、<strong>
、<em>
、<img>
、
- 内联元素不能包含块级元素,但可以包含其他内联元素
- Inline-block:行内块元素,能设置宽度高度,margin/padding水平垂直方向 都有效,前后无换行符
为什么img是inline还可以设置宽高
- 因为他是置换元素,置换元素一般内置宽高属性,因此可以设置其宽高。
- 置换元素就是会根据标签属性来显示的元素,反之就是非置换元素了
- 常见的置换元素包括
<img>
、<video>
、<audio>
等
- 表单元素中
<input>
和 <textarea>
具有替换内容(即用户输入的值),因此它们被归类为置换元素,但是他们可以设置宽高是因为本来就是inline-block
- 注意:置换元素通常具有尺寸、宽高比等特定的样式属性
- 示例:
1 2
| <img src="image.jpg" alt="图片">
|
怎么样让一个元素消失
visibility:hidden
,元素隐藏,不会改变页面布局,无法触发该元素已经绑定的事件
- CSS3的**
opacity:0
,元素隐藏,不会改变页面布局,可触发原绑定事件**,如果该元素已经绑定一些事件,如click事件,那么点击该区域,也能触发点击事件的
display:none
,元素隐藏,会改变页面布局,可以理解成在页面中把该元素删除掉一样。(搜索引擎会过滤掉这里面的内容)
- 注意:
display:none
的元素还是会渲染在DOM节点上,在f12上能看到<p style="display: none"></p>
- 注意:会渲染到DOM节点,并且依旧可以在CSS中通过相应选择器获取,比如“如何美化checkbox(如何使用纯CSS实现checkbox)”这个例子中chexkbox隐藏了,但是选中对应的label时还是会改变checkbox的checked状态,所以还是可以通过 伪类:checked 和 兄弟选择器+ 来获取目前选中的label元素
双边距重叠问题(外边距折叠)
- 多个相邻(兄弟或者父子关系)普通流的块元素 垂直方向 marigin会重叠
- 两个相邻的外边距都是正数时,折叠结果是它们两者之间较大的值。
- 注意:两个相邻的外边距都是负数时,折叠结果是两者绝对值的较大值。
- 两个外边距一正一负时,折叠结果是两者的相加的和。
position属性 比较
- MDN
- 默认定位Static:默认值。没有定位,元素出现在正常的流中(忽略top, bottom, left, right 或者 z-index 声明)。
- 相对定位relative:如果对一个元素进行相对定位,它将先出现在它所在的位置上,然后,可以通过设置垂直或水平位置,让这个元素“相对于”它的起点进行移动。 在使用相对定位时,无论是否进行移动,元素仍然占据原来的空间。因此,移动元素会导致它覆盖其它框。
- 绝对定位absolute:绝对定位的元素的位置相对于最近的已定位父元素,如果元素没有已定位的父元素,则它的位置相对于
<html>
。 absolute 定位使元素的位置与文档流无关,因此不占据空间。 absolute 定位的元素和其他元素重叠。
- 固定定位fixed:元素的位置相对于浏览器窗口是固定位置,即使窗口是滚动的它也不会移动。Fixed定位使元素的位置与文档流无关,因此不占据空间。 Fixed定位的元素和其他元素重叠。
- 粘性定位sticky:元素先按照普通文档流定位,然后相对于该元素的最近滚动祖先和最近的块级祖先元素定位。而后,元素定位表现为在跨越特定阈值前为相对定位,之后为固定定位。
- inherit:规定应该从父元素继承position 属性的值。
- 注意:
- 区分绝对定位和浮动,前者完全脱离文档流,后者不脱离文本流
- 大多数情况下,height和width 被设定为 auto 的绝对定位元素,按其内容大小调整尺寸。但是,被绝对定位的元素可以通过指定top和bottom ,不设置height(即auto),来填充可用的垂直空间。它们同样可以通过指定left 和 right并将width 指定为auto(或不设置width)来填充可用的水平空间
z-index的定位方法
- z-index属性设置元素的堆叠顺序
- z轴:一条从屏幕表面到你的脸的虚线。
- 正值将它们移动到堆栈上方,负值将它们向下移动到堆栈中。
- z-index 可以为负,且z-index只能在定位元素(position不为默认值static的元素)上奏效
- 它的属性值默认auto(实际上为0),默认,堆叠顺序与父元素相等,number,inherit,从父元素继承z-index属性的值
BFC(清除浮动,防止margin重叠等)
- BFC直译成:块级格式化上下文,是页面上的一个独立容器,规定了内部如何布局,并且让处于 BFC 内部的子元素与外部的元素相互隔离,使内外元素的定位不会相互影响(可参考知乎)
- BFC内部box垂直放置
- BFC区域不会与float box重叠
- 计算BFC的高度时,浮动元素也会参与计算
- 下面的元素会生成BFC:
- 根元素(
<html>
)
- float不为none的元素
- position为fixed和absolute的元素(注意relative不能生成BFC)
- display为inline-block、table-cell、table-caption,flex,inline-flex的元素(使用display:flow-root可以创建无副作用的BFC)
- overflow不为visible的元素
- BFC用于防止margin重叠:让2个会margin重叠的元素分属于2个不同的BFC,则他们之间的margin就不会重叠了。
- BFC清除浮动的原理: BFC在计算高度时,内部浮动元素的高度也要计算在内,也就是说即使BFC区域内只有一个浮动元素,BFC的高度也不会发生塌缩,所以达到了清除浮动的目的。
- 重点补充:如果高度塌陷是因为absolute或fixed子元素脱离文档流,则给父元素设置BFC不管用,得设父元素高度
浮动清除
- **推荐方法:父元素添加
display: flow-root
**可以创建无副作用的BFC
- 方法一:使用带clear属性的空元素
- 在浮动元素后使用一个空元素如
<div class="clear"></div>
,并在CSS中赋予.clear{clear:both;}
属性即可清理浮动。亦可使用<br class="clear" />
或<hr class="clear" />
来进行清理。
- 方法二:使用CSS的overflow属性
- 给浮动元素的容器(父元素)添加
overflow:hidden;
或overflow:auto;
可以清除浮动,另外在 IE6 中还需要触发 hasLayout ,例如为父元素设置容器宽高或设置 zoom:1
。在添加overflow属性后,浮动元素又回到了容器层,把容器高度撑起,达到了清理浮动的效果。
- 方法三:给浮动的元素的容器(父元素)添加浮动(BFC)
- 给浮动元素的容器也添加上浮动属性即可清除内部浮动,但是这样会使其整体浮动,影响布局,不推荐使用。
- 方法四:使用邻接元素处理
- 什么都不做,给浮动元素后面的元素添加clear属性。
- 方法五:使用CSS的
::after
伪元素
- 结合
::after
伪元素(注意这不是伪类,而是伪元素,代表一个元素之后最近的元素)和 IEhack ,可以完美兼容当前主流的各大浏览器,这里的 IEhack 指的是触发 hasLayout。
给浮动元素的容器添加一个clearfix的class,然后给这个class添加一个::after
伪元素实现元素末尾添加一个看不见的块元素(Block element)清理浮动。
overflow清除浮动的原理
- 滚动(overflow属性)
- 要讲清楚这个解决方案的原理,首先需要了解块格式化上下文,块格式化上下文是CSS可视化渲染的一部分,它是一块区域,规定了内部块盒 的渲染方式,以及浮动相互之间的影响关系
- 当元素设置了overflow样式且值不是visible时,该元素就构建了一个BFC,BFC在计算高度时,内部浮动元素的高度也要计算在内,也就是说即使BFC区域内只有一个浮动元素,BFC的高度也不会发生塌缩,所以达到了清除浮动的目的