美文网首页
inline-block、BFC、边距合并

inline-block、BFC、边距合并

作者: Iswine | 来源:发表于2016-08-26 11:00 被阅读0次

1、在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距合并的范例

Reference:w3边距合并解释
在文档流中,块级元素会从上往下依次挨着排列,此时前一个块级元素的margin-bottom会与后一个块级元素的margin-top合并。例如:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <style>
  *{
  margin:0;
  padding:0;
}
.ct{
  border:1px solid 
}
.box1{
  width:100px;
  height:100px;
  background:#f00;
  margin:20px;
}
.box2{
  width:100px;
  height:100px;
  background:#0f0;
  margin:20px
}
  </style>
</head>
<body>
<div class="ct">
  <div class="box1"></div>
  <div class="box2"></div>
</div>
</body>
</html>
</body>
</html>
output
可以看出,尽管绿盒的margin-top为20px,红盒的margin-bottom为20px,但此时中间间隙并非40px,而是合并为20px。若设置绿盒margin:10px 20px;;则中间缝隙依旧为20px,故外边距合并最终留存的结果是两者外边距较大的那一个。 output

总结规则如下:
<blockquote>
两个相邻的外边距都是正数时,折叠结果是它们两者之间较大的值。
两个相邻的外边距都是负数时,折叠结果是两者绝对值的较大值。
两个外边距一正一负时,折叠结果是两者的相加的和。
</blockquote>
若要让外边距不发生合并,从根本上来说是需要让两个元素处于不同的BFC中,即让其中一个元素处在一个新的BFC中;
生成BFC的规则:
<blockquote>

  • 根元素
  • float属性不为none
  • position为absolute或fixed
  • display为inline-block, table-cell, table-caption, flex, inline-flex
  • overflow不为visible
    </blockquote>
    由于float与position:absolute/fixed会改变文档流,所以我们一般考虑添加一个父级元素,给其添加overflow:hidden/auto;display:inline-block;来生成新的BFC。
父子外边距合并例子

如下图所示,父子的margin均为20px,显然父子上下外边距重合,发生合并。


父子外边距合并

消除方法:

  • 给父元素增加一个不为0填充(border,paddding均可);
  • 给父级元素增加overflow:hidden/auto;

2、去除inline-block内缝隙有哪几种常见方法?

  • 不换行,缝隙出现的本质原因是在于换行所出现的一个空格符号,所以不换行能够解决问题,但是代码不规整;
  • 使用浮动float:left 父元素需要用overflow:auto或者hidden撑开。
  • 给父元素font-size设为0,需要在自己在inline-block设置一下字体大小。

3、父容器使用overflow: auto| hidden撑开高度的原理是什么?

当子元素全部float脱离文档流之后,父容器可视为内部没有任何子元素而塌陷,overflow值为auto| hidden时可以闭合元素修复高度坍塌,清除浮动。

4、BFC是什么?如何形成BFC,有什么作用?

Reference:前端精选文摘:BFC 神奇背后的原理
其实第一题已经详细解答了如何形成BFC和BFC的作用,现只列出何为BFC:

BFC 定义
  BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。

BFC布局规则:
内部的Box会在垂直方向,一个接一个地放置。
Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
BFC的区域不会与float box重叠。
BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
计算BFC的高度时,浮动元素也参与计算。

5、浮动导致的父容器高度塌陷指什么?为什么会产生?有几种解决方法?

当子元素全部float脱离文档流之后,父容器可视为内部没有任何子元素而塌陷。
解决方法:

  • 给父元素添加display: inline-block; overflow: auto; 或 overflow: hidden;样式,使父容器形成BFC空间。
  • 使用伪类选择器after 给父元素最后加上子元素并且具有clear:both属性,也可以清除浮动。
.clearfix:after{ content:''; display:block; clear:both; }

6、以下代码每一行的作用是什么? 为什么会产生作用? 和BFC撑开空间有什么区别?

.clearfix:after{ content: '';    /*添加一个空字符*/
             display: block;       /*变为块级元素*/
             clear: both;           /*清除浮动*/
             }
 .clearfix{
            *zoom: 1;             /*为了兼容IE6\7*/
}

在浮动元素后添加一个没有内容(实际上有一个空字符)的块级元素,当其清除浮动后,所在位置正好是所有浮动元素的最下面,自然由其撑起的父级元素能够包裹住所有的子元素。
与BFC的区别:
BFC撑开空间是使父元素本身形成一个独立空间来包容浮动元素,而这个方法是使用内容将父容器撑开。

相关文章

  • 前端基础(问答8)

    keywords: inline-block、BFC、边距合并、overflow、高度塌陷。 在什么场景下会出现外...

  • inline-block、BFC、边距合并

    1 . 在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距合并的范例 合并场景:相...

  • inline-block、BFC、边距合并

    1.在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距合并的范例。 当block元...

  • inline-block、BFC、边距合并

    收拾心情,重新出发。加油。 一、在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距...

  • inline-block、BFC、边距合并

    1. 在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距合并的范例 外边距合并:外...

  • inline-block、BFC、边距合并

    在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距合并的范例 同一文档流中的两个相...

  • inline-block、BFC、边距合并

    1.在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距合并的范例 相邻元素当两个元...

  • inline-block、BFC、边距合并

    1.在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距合并的范例 外边距合并的场景...

  • inline-block、BFC、边距合并

    一、在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距合并的范例 块元素的top与...

  • inline-block、BFC、边距合并

    在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距合并的范例 在CSS当中,相邻的...

网友评论

      本文标题:inline-block、BFC、边距合并

      本文链接:https://www.haomeiwen.com/subject/tpaasttx.html