CSS盒模型和BFC

CSS盒模型及深度思考和BFC

题目:谈一谈你对CSS盒模型的认识

对于这个题目,相关知识点有以下几个方面:
(1)基本概念:标准盒模型和IE盒模型的区别及设置;
(2)JS如何设置、获取盒模型对应的宽和高;
(3)根据盒模型解释边距重叠;
(4)BFC(边距重叠解决方案)或IFC。
总结:以上几点,从上到下,知识点逐渐递增,知识面从理论、CSS、JS,又回到CSS理论。

基本概念

标准盒模型:总width/height=width/height+padding+border+margin;
其中:width/height=content的宽/高
怪异盒模型(IE盒模型):总width/height+width/height+margin;
其中:width/height=content的宽/高+padding+border

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

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

JS设置dom元素的宽高样式(一般有三种方法):

  1. 内联样式
  2. style标签
  3. 通过link标签引入

JS获取对应宽高(方法有如下4个):

  1. 通过DOM节点的 style 样式获取
    dom.style.width/height;
    缺点:通过这种方式,只能获取行内样式,不能获取内嵌的样式和外链的样式。
  2. IE独有
    dom.currentStyle.width/height;
    获取到的是运行完之后的宽高(三种css样式都可以获取)。但这种方式只有IE独有。
  3. 通用型
    window.getComputedStyle(dom).width/height;
    方式三和方式二一样。只不过,方式三能兼容 Chrome、火狐。是通用型方式。
  4. dom.getBoundingClientRect().width/height/top/left;
    拿到的是123中渲染以后的样式(同2),还可以计算元素的绝对位置(距离视口viewport左顶点的距离)。

margin塌陷/margin重叠

概念

在CSS中,两个或多个毗邻的普通流(我们常说的文档流可以分为定位流、浮动流和普通流三种)中的盒子(可能是父子元素,也可能是兄弟元素)在垂直方向上的外边距会发生叠加,这种形成的外边距称之为外边距叠加。
深入理解CSS外边距折叠(Margin Collapse)

  1. 水平方向没有塌陷现象,margin是可以叠加的;
  2. 浮动、inline-block或绝对定位的margin,不会和垂直方向上其他margin折叠;
  3. 创建了块级格式化上下文元素,不会和其子元素margin折叠;

外边距叠加存在的两种情况

一是父子外边距叠加;二是兄弟外边距叠加。

  1. 盒子的top margin和它第一个普通流子元素的top margin;
  2. 盒子的bottom margin和它下一个普通流兄弟的top margin;
  3. 盒子的bottom margin和它父元素的bottom margin;
  4. 盒子的top margin和bottom margin,且没有创建一个新的块级格式上下文,且有被计算为0的min-height,被计算为0或auto的height,且没有普通流子元素。

如何避免

其实只要破坏上面讲到的四个条件中的任何一个即可:毗邻、两个或多个、普通流和垂直方向。

  1. 浮动元素不会与任何元素发生叠加,也包括它的子元素;
  2. 创建了BFC的元素不会和它的子元素发生外边距叠加;
  3. 绝对定位元素和其他任何元素之间不发生外边距叠加,也包括它的子元素;
  4. inline-block元素和其他任何元素之间不发生外边距叠加,也包括它的子元素;
  5. 普通流中的块级元素的margin-bottom永远和它相邻的下一个块级元素的margin-top叠加,除非相邻的兄弟元素clear;
  6. 普通流中的块级元素(没有border-top、没有padding-top)的margin-top和它的第一个普通流中的子元素(没有clear)发生margin-top叠加;
  7. 普通流中的块级元素(height为auto、min-height为0、没有border-bottom、没有padding-bottom)和它的最后一个普通流中的子元素(没有自身发生margin叠加或clear)发生margin-bottom叠加;
  8. 如果一个元素的min-height为0、没有border、没有padding、高度为0或者auto、不包含子元素,那么它自身的外边距会发生叠加。

BFC(边距重叠解决方案)

BFC(Block Formatting Context):块级格式化上下文,是用于布局块级盒子的一块渲染区域。格式化上下文,它是页面中的一块渲染区域,有一套渲染规则,决定了其子元素如何布局,以及和其他元素之间的关系和作用。

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

  1. BFC 里面的元素,在垂直方向,边距会发生重叠;
  2. BFC在页面中是独立的容器,外面的元素不会影响里面的元素,反之亦然;
  3. BFC区域不与旁边的float box区域重叠(可以用来清除浮动带来的影响);
  4. 计算BFC的高度时,浮动的子元素也参与计算。(正所谓有高度的盒子,才能关住浮动。)

如何生成BFC

有以下几种方法:

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

CSS盒模型深度思考及BFC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值