浅谈盒模型、BFC以及高度塌陷的问题

2,545 阅读6分钟

本帖将会从以下几方面介绍关于盒模型的相关内容

1.标准盒模型和怪异盒模型 2.CSS如何设置这两种模型 3.外边距合并 4.BFC 5.高度塌陷

1.基本概念

盒模型的基本概念大家都会懂,由里向外content(内容)padding(内边距)border(边框)margin(外边距) 我们常说的盒模型分为标准盒模型(W3C盒模型)和怪异盒模型(IE盒模型)

标准盒模型与怪异盒模型的差别
在标准盒模型中,widthheight即为其内容区域的widthheight,但是在怪异盒模型中,它的widthheight变成了其相对应的content+padding+border 在html的首部,我们经常会看到一个<!Doctype html>的声明,浏览器根据这个声明来判断这个文件是什么类型的,并根据这来判断怎么解析文件。

2.如何设置两种盒模型

1.当我们写了<!Doctype html>的声明的时候,无论在哪种内核的浏览器下盒子模型都会被解析为 标准盒模型。即:width = content。 即我们单独设置的宽度只显示在内容上,比如我设置css样式 width: 100px这个100px指的就只是content的宽度,总宽度 = content+ padding+ border 2.但是当我们没写声明或声明丢失的时候,部分有IE内核的浏览器则会触发怪异模型(IE6,7,8),width= content+ padding+ border即宽度为三个加一起的宽度。总宽度 = width

在CSS3中我们可以通过设置 box-sizing的属性来完成标准盒模型或者怪异盒模型之间的切换。

/* 标准盒模型 */
box-sizing:content-box;

 /*怪异盒模型*/
box-sizing:border-box;

3.外边距合并

所谓外边距合并,也就是margin合并,MDN的定义是:

块级元素的上外边距和下外边距有时会合并(或折叠)为一个外边距,其大小取其中的最大者,这种行为称为外边距折叠(margin collapsing),有时也翻译为外边距合并。注意浮动元素和绝对定位元素的外边距不会折叠。

注意,是块级元素的顶部和底部,那就意味着只有块级元素的垂直方向才存在margin合并的问题。

外边距合并有这几种情况

相邻兄弟元素 代码:

	<!-- html代码 -->
	<div class="up">我是上面的盒子</div>
    <div class="down">我是下面的盒子</div>
/* css代码 */
div.up{
        width: 100px;
        height: 100px;
        margin: 100px;
        background: #ff6600;
    }
    div.down{
        width: 100px;
        height: 100px;
        margin: 100px;
        background: aquamarine;
    }

相邻兄弟元素边距问题

我们应该觉得上下两个元素应该是相差200px距离,然而事实却是100px

父子元素

代码

  <!-- html代码 -->
    <div class="parent">
        <!-- 父亲的颜色是橙色 -->
        <div class="child">我是儿</div>
        <!-- 儿子的颜色是浅绿色 -->
    </div>
    /* css代码 */
    div.parent{
        width: 200px;
        height: 200px;
        margin-top: 50px;
        background: #ff6600;
    }
    div.child{
        width: 50px;
        height: 50px;
        margin-top: 100px;
        background: aquamarine;
    }

外边距重叠问题

我们会认为父盒子的margin-top应该是 50px ,而子盒子的顶部应该距离父盒子的顶部100px,但是事实并不是这样的。 MDN给出了三种情况,还有一种是空块元素,这里就不介绍了。 出现这种情况,就要用到BFC来解决

4.BFC

定义:

一个块格式化上下文(block formatting context) 是Web页面的可视化CSS渲染的一部分。它是块盒子的布局发生,浮动互相交互的区域。

理解: 具有BFC特性的元素可以看作是一个隔离的独立的容器,容器里面的元素不会在布局上影响外面的元素,BFC具有普通容器所没有的特性。(我们说的普通流就是FC)

如何触发BFC:

1.根元素或其它包含它的元素 2.浮动 (元素的float不是 none) 3.绝对定位的元素 (元素具有 positionabsolutefixed) 4.内联块 inline-block(元素具有 display: inline-block) 5.表格单元格 (元素具有 display: table-cellHTML表格单元格默认属性) 6.表格标题 (元素具有 display: table-caption,HTML表格标题默认属性) 7.块元素具有overflow,且值不是 visible 8.display: flow-root 根据MDN的定义,根元素已经触发了BFC 那么,BFC就会有以下特性 1.内部的box会在垂直方向,一个接着一个的放置 2.box的垂直方向的距离由margin决定,同属一个BFC两个相邻的box的margin会发生重叠 3.个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是这样 4.BFC就是一个隔离的容器,内部子元素不会影响到外部元素 5.BFC的区域不会与floatbox叠加

BFC的用途

1.自适应两栏布局 2.阻止元素被浮动覆盖 3.清除内部浮动 4.阻止margin重叠 5.解决高度塌陷问题

5.高度塌陷

既然上面已经说到了高度塌陷,那么我们就来简单说说吧

什么是高度塌陷?

父元素没有设置大小(或不设置高度)子元素浮动,子元素会跳出父元素的边界(脱标)当父元素的高度为auto时,父元素的高度直接为0。举个? 代码:

  <!-- html代码 -->
    <div class="parent">
        <!-- 父亲颜色是橙色 -->
        <div class="child">我是儿</div>
        <!-- 儿子的颜色是浅绿色 -->
    </div>
     /* css代码 */
    div.parent{
        width: 200px;
        background: #ff6600;
    }
    div.child{
        width: 50px;
        height: 50px;
        background: aquamarine;
        float: left;
    }

高度塌陷的图片

可以看到由于子盒子浮动脱标,造成了父盒子的高度没有内容支撑,(如果父盒子不设置高度的话,其高度会随着其子元素的高度而自适应),结果造成了父盒子高度为0;

解决高度塌陷的方法

1.给父盒子设置高度

div.parent{
height:200px;
}

2.父盒子设置:

overflow:hidden;
/*或者*/
overflow:auto;
/*正常写在高度塌陷的元素上就可以,这里就不附图片了*/

3.给父盒子末尾添加一个空盒子,并设置成清除浮动

/*css代码*/
    div.emptyBox{
        clear: both;
    }
<!-- html代码 -->
    <div class="parent">
        <!-- 父亲颜色是橙色 -->
        <div class="child">我是儿</div>
        <!-- 儿子的颜色是浅绿色 -->
        <div class="emptyBox"></div>
    </div>

空盒子清浮动

优点:通俗易懂,易于掌握

缺点:添加了无意义标签,不易于后期维护,违背了结构和表现分离的标准

4.使用after伪元素清除浮动

E::after{
        content: "";
        display: block;
        height: 0;
        clear: both;
        overflow: hidden;
        visibility: hidden;
        /*为了保险起见把能写上的都写上叭*/
    }

使用after伪元素清除浮动

优点:这个方法和第三种方法有点类似,但实际没有在页面上添加无意义标签,是页面结构更完整。 ——————————————————————————————————————————————————————— 以上就是我个人在学习过程中对盒模型及其涉及到一些知识的理解,如果大神发现哪里有错误,还请及时纠正。第一次发帖,写的不好,还请多多包涵

下跪