元素脱离文档流导致高度坍塌
在日常的开发页面工作中,我们都知道在文档流内,父元素的高度默认是通过子元素来支撑的(如果我们没有设置高度),即父元素的高度==子元素的高度。一旦我们设置了子元素的float之后,子元素就会脱离文档流,引发的问题就是父元素不能再通过子元素来撑起高度,直观的表现就是高度坍塌。
一个普遍的例子就是轮播图的圆点按钮小框,比如
一般要实现这个按钮小框,我们都会选择用ul 和 li 元素以及 float样式,代码如下:
这时你会发现这段代码出来的效果并没有什么毛病,但其实高度坍塌真实发生了,只是因为我们使用position解决了内容坍塌的问题,你可以去掉position看看,会变成下面这样:
position算是解决高度坍塌的其中一种方法,下面开始详细介绍几种方法:
方法一:根据W3C标准,在页面中元素都有一个隐藏的属性叫做BLOCK FORMATTING Context,简称BFC,该属性可以通过设置来打开或者关闭,默认是关闭的。
当开启BFC后,元素将会具有以下特性:
- 元素的垂直外边距不会和子元素重叠
- 开启BFC的元素不会被浮动元素所覆盖
- 开启BFC的元素可以包含浮动元素
如何开启BFC:
- 设置元素的浮动,即给上述的ul标签设置浮动,但是会导致ul标签宽度丢失,并且下面的元素会上移,并不能解决问题
- 设置元素的绝对定位,上面的例子就是用的
position:absolute
,但是不是所有场景都适用 - 设置元素的inline-block,这样父元素的宽度会丢失,不推荐
- 将元素的overflow设置为一个非visible的值(这种方法开启BFC副作用小,IE6中可以适用hasLayout,给父元素设置zoom:1)
方法二:clear属性可以用于清除元素周围浮动元素对元素的影响。这样元素就不会因为出现浮动元素尔改变位置
可选值:
- left :忽略左侧浮动 (清除左侧浮动对当前元素的影响)
- right :忽略右侧浮动 (清除右侧浮动对当前元素的影响)
- both :忽略全部浮动 (清除两侧对他影响最大的浮动对)
- none : 不忽略浮动,默认值
方法三:通过after伪类,和添加div元素一样,但是不需要添加div元素
|
|
解决高度坍塌的方法已经介绍完了,具体那种方法,就需要大家见仁见智了!