css高度塌陷问题解决方法

6,256 阅读3分钟

工欲善其事必先利其器,遇到问题我们首先要多问几个为什么?

什么是高度塌陷?什么是高度塌陷?什么是高度塌陷?

* 在文档流中,父元素的高度默认是被子元素撑开的,

* 也就是子元素多高,父元素就多高。

* 但是当为子元素设置浮动以后,子元素会完全脱离文档流,

* 此时将会导致子元素无法撑起父元素的高度,导致父元素的高度塌陷。

* 由于父元素的高度塌陷了,则父元素下的所有元素都会向上移动,这样将会导致页面布局混乱。

* 所以在开发中一定要避免出现高度塌陷的问题,

* 我们可以将父元素的高度写死,以避免塌陷的问题出现,

* 但是一旦高度写死,父元素的高度将不能自动适应子元素的高度,所以这种方案是不推荐使用的。
 * 根据W3C的标准,在页面中元素都一个隐含的属性叫做Block Formatting Context
 *     简称BFC,该属性可以设置打开或者关闭,默认是关闭的。
 * 当开启元素的BFC以后,元素将会具有如下的特性:
 *     1.父元素的垂直外边距不会和子元素重叠    
 *     2.开启BFC的元素不会被浮动元素所覆盖
 *     3.开启BFC的元素可以包含浮动的子元素
 * 
 * 如何开启元素的BFC
 *     1.设置元素浮动
 *         - 使用这种方式开启,虽然可以撑开父元素,但是会导致父元素的宽度丢失
 *             而且使用这种方式也会导致下边的元素上移,不能解决问题
 *     2.设置元素绝对定位
 *     3.设置元素为inline-block
 *         - 可以解决问题,但是会导致宽度丢失,不推荐使用这种方式
 *     4.将元素的overflow设置为一个非visible的值
 *     
 * 推荐方式:将overflow设置为hidden是副作用最小的开启BFC的方式。    
 */

/*overflow: hidden;*/

/*
 *但是在IE6及以下的浏览器中并不支持BFC,所以使用这种方式不能兼容IE6。
 * 在IE6中虽然没有BFC,但是具有另一个隐含的属性叫做hasLayout,
 * 该属性的作用和BFC类似,所在IE6浏览器可以通过开hasLayout来解决该问题
 * 开启方式很多,我们直接使用一种副作用最小的:
 *     直接将元素的zoom设置为1即可
 * 
 */

/*
 * zoom表示放大的意思,后边跟着一个数值,写几就将元素放大几倍
 * zoom:1表示不放大元素,但是通过该样式可以开启hasLayout
 * zoom这个样式,只在IE中支持,其他浏览器都不支持
 */
zoom:1;
overflow: hidden;
/*
* 解决高度塌陷方案二:
*     可以直接在高度塌陷的父元素的最后,添加一个空白的div,
*     由于这个div并没有浮动,所以他是可以撑开父元素的高度的,
*     然后在对其进行清除浮动,这样可以通过这个空白的div来撑开父元素的高度,
*     基本没有副作用
* 
* 使用这种方式虽然可以解决问题,但是会在页面中添加多余的结构。
*/
/*通过after伪类,选中box1的后边*/
/*
* 可以通过after伪类向元素的最后添加一个空白的块元素,然后对其清除浮动,
*     这样做和添加一个div的原理一样,可以达到一个相同的效果,
*     而且不会在页面中添加多余的div,这是我们最推荐使用的方式,几乎没有副作用
*/
.clearfix:after{
/*添加一个内容*/
content: "";
/*转换为一个块元素*/
display: block;
/*清除两侧的浮动*/
clear: both;
}

/*
* 在IE6中不支持after伪类,
*     所以在IE6中还需要使用hasLayout来处理
*/
.clearfix{
zoom:1;
}