盒子模型、BFC、清除浮动

盒子模型、BFC、浮动

  • 盒子模型box model。
    • 盒子属性
    • 标准盒模型、IE盒模型的区别
    • CSS如何设置这两种模型
    • JS如何设置、获取盒模型对应的宽和高
    • 根据盒模型解释边距重叠
  • BFC(边距重叠解决方案)或IFC。
  • 浮动
    • 浮动的性质
    • 浮动的清除
    • 浏览器的兼容性问题
    • 浮动中margin相关
    • 关于margin的IE6兼容问题

盒子模型box model

无论是div、span、还是a都是盒子。,图片、表单元素一律看作是文本,它们并不是盒子。比如说,一张图片里并不能放东西,它自己就是自己的内容。

盒子属性

  • width和height:内容的宽度、高度(不是盒子的宽度、高度)。
  • padding:内边距。
  • border:边框。
  • margin:外边距。
    标签默认有8像素 margin

标准盒子模型:

标准盒子模型.jpg

IE盒子模型:

IE盒子模型.jpg

标准盒模型和IE盒模型的区别:

  • 标准盒子模型中,width 和 height 指的是内容区域的宽度和高度。增加内边距、边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸。

  • IE盒子模型中,width 和 height 指的是内容区域+border+padding的宽度和高度。

CSS如何设置这两种模型

代码如下:

    /* 设置当前盒子为 标准盒模型(默认) */
    box-sizing: content-box;

    /* 设置当前盒子为 IE盒模型 */
    box-sizing: border-box;

备注:盒子默认为标准盒模型。

JS如何设置、获取盒模型对应的宽和高

方式一:通过DOM节点的 style 样式获取

    element.style.width/height;

缺点:通过这种方式,只能获取行内样式,不能获取内嵌的样式和外链的样式。这种方式有局限性,但应该了解。

方式二(通用型)

    window.getComputedStyle(element).width/height;

方式二能兼容 Chrome、火狐。是通用型方式。

方式三(IE独有的)

    element.currentStyle.width/height;

和方式二相同,但这种方式只有IE独有。获取到的即时运行完之后的宽高(三种css样式都可以获取)。

方式四

    element.getBoundingClientRect().width/height;

此 api 的作用是:获取一个元素的绝对位置。绝对位置是视窗 viewport 左上角的绝对位置。

此 api 可以拿到四个属性:left、top、width、height。

总结:
上面的四种方式,要求能说出来区别,以及哪个的通用型更强。

margin塌陷/margin重叠

标准文档流中,水平方向margin叠加,竖直方向的margin不叠加,只取较大的值作为margin

如果不在标准流,比如盒子都浮动了,那么两个盒子之间是没有margin重叠的现象的。

在标准流中父子结构和兄弟结构都存在margin塌陷/重叠问题,举个例子,讲父子之间的margin重叠。

    

上面的结构中,我们尝试通过给儿子p一个margin-top:50px;的属性,让其与父亲保持50px的上边距。结果却看到了一个奇怪的现象,子元素P带着父元素一起下降了50px:

此时我们给父亲div加一个border属性,就正常了:

** 如果父亲没有border,那么儿子的margin实际上踹的是“流”,踹的是这“行”。所以,父亲整体也掉下来了。**

margin这个属性,本质上描述的是兄弟和兄弟之间的距离; 最好不要用这个marign表达父子之间的距离。所以,如果要表达父子之间的距离,我们一定要善于使用父亲的padding,而不是儿子的margin。


BFC(边距重叠解决方案)

BFC的概念:块级格式化上下文。

BFC 的原理/BFC的布局规则【非常重要】

BFC 的原理,其实也就是 BFC 的渲染规则:

  • (1)BFC 内部的子元素,在垂直方向,边距会发生重叠
  • (2)BFC在页面中是独立的容器,外面的元素不会影响里面的元素,反之亦然。(稍后看举例1
  • (3)BFC区域不与旁边的float box区域重叠。(可以用来清除浮动带来的影响)。(稍后看举例2
  • (4)计算BFC的高度时,浮动的子元素也参与计算。(稍后看举例3

如何生成BFC

有以下几种方法:

  • 方法1:overflow: 不为vidible,可以让属性是 hidden、auto。【最常用】
  • 方法2:浮动中:float的属性值不为none。意思是,只要设置了浮动,当前元素就创建了BFC。
  • 方法3:定位中:只要posiiton的值不是 static或者是relative即可,可以是absolutefixed,也就生成了一个BFC。
  • 方法4:display为inline-block, table-cell, table-caption, flex, inline-flex

参考链接:

  • BFC原理详解
  • BFC详解
  • 前端精选文摘:BFC 神奇背后的原理

BFC 的应用

举例1:解决 margin 重叠overflow: hidden

当父元素和子元素发生 margin 重叠时,解决办法:给子元素或父元素创建BFC。子元素设置overflow: hidden就创建一个 BFC,就解决了:

因为第二条:BFC区域是一个独立的区域,不会影响外面的元素

举例2:BFC区域不与float区域重叠:

针对下面这样一个div结构;




    
    Document
    



左侧,生命壹号
右侧,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,

效果如下:

image

上图中,由于右侧标准流里的元素,比左侧浮动的元素要高,导致右侧有一部分会跑到左边的下面去。

如果要解决这个问题,可以将右侧的元素创建BFC,因为第三条:BFC区域不与float box区域重叠。解决办法如下:(将right区域添加overflow属性)

    
右侧,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,
image

上图表明,解决之后,father-layout的背景色显现出来了,说明问题解决了。

举例3:清除浮动

现在有下面这样的结构:




    
    Document
    



生命壹号

效果如下:

image

上面的代码中,儿子浮动了,但由于父亲没有设置高度,导致看不到父亲的背景色(此时父亲的高度为0)。正所谓有高度的盒子,才能关住浮动

如果想要清除浮动带来的影响,方法一是给父亲设置高度,然后采用隔墙法。方法二是 BFC:给父亲增加 overflow=hidden属性即可, 增加之后,效果如下:

image

为什么父元素成为BFC之后,就有了高度呢?这就回到了第四条:计算BFC的高度时,浮动元素也参与计算。意思是,在计算BFC的高度时,子元素的float box也会参与计算

清除浮动

1、加高法:给前面一个父级元素设置高度

** 工作上,我们绝对不会给所有的盒子加高度,这是因为麻烦,并且不能适应页面的快速变化。**

2、clear:both;法:给后面的盒子添加clear属性

最简单的清除浮动的方法,就是给盒子增加clear:both;表示自己的内部元素,不受其他盒子的影响。

** 这个方法浮动确实被清除了,不会互相影响了。但是有一个问题,就是margin失效。两个div之间,没有任何的间隙了。**

3、隔墙法:

在两部分浮动元素中间,建一个墙。隔开两部分浮动,让后面的浮动元素,不去追前面的浮动元素。
外墙法:
内墙法:

4、overflow:hidden;

这个属性的本意,就是将所有溢出盒子的内容,隐藏掉。但是,我们发现这个东西能够用于浮动的清除。
我们知道,一个父亲,不能被自己浮动的儿子撑出高度,但是,如果这个父亲加上了overflow:hidden;那么这个父亲就能够被浮动的儿子撑出高度了。这个现象,不能解释,就是浏览器的偏方。
并且,overflow:hidden;能够让margin生效。

5.伪类清除浮动:.clearfix清除浮动写在父级元素身上

    .clearfix::after {
        content: '';
        display: block;
        clear: both;
    }

    /* 兼容 IE */
    .clearfix {
        zoom: 1;
    }

你可能感兴趣的:(盒子模型、BFC、清除浮动)