子元素的margin-top属性为什么会影响父元素的margin-top?

问题描述:

最近在开发中偶然遇到了一个问题那就是如下图:父级元素是个空的最外层包裹元素,子元素是内容,想控制子元素不从页面顶端开始,就给子元素设置一个margin-top:50px;没想到父元素也随之下移了。我们只知道相邻元素如果既有margin-bottm又有margin-top会产生margin塌陷,但是这又是为什么呢?

原因探索:

解读规范可知:相邻两个元素的margin会折叠(相邻包括兄弟元素也包括抚子元素),但是仍需满足以下几个条件:

必须是处于常规文档流(非float和绝对定位)的块级盒子,并且处于同一个BFC当中。

*没有线盒,没有空隙(clearance,下面会讲到),没有padding和border将他们分隔开

*都属于垂直方向上相邻的外边距,可以是下面任意一种情况:

*元素的margin-top与其第一个常规文档流的子元素的margin-top

*元素的margin-bottom与其下一个常规文档流的兄弟元素的margin-top

*height为auto的元素的margin-bottom与其最后一个常规文档流的子元素的margin-bottom高度为0并且最小高度也为0,不包含常规文档流的子元素,并且自身没有建立新的BFC的元素的margin-top和margin-bottom

解决办法

根据以上原因分析可知,我们只需打破它合并的规则即可解决该问题:比如给子元素设置float/position属性使其脱离文档流,或者给父元素设置border/padding然后将其box-size属性设置为border-box/padding-box等等

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 14,680评论 1 92
  • 1.在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距合并的范例 概念:在CSS当...
    饥人谷_任磊阅读 3,984评论 0 3
  • margin重叠 摘自css2.1规范中文版 CSS中,两个或者多个盒(可能但不一定是兄弟)的相邻的margin会...
    打铁大师阅读 11,944评论 0 9
  • 在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距合并的范例 在CSS当中,相邻的...
    Nicklzy阅读 4,282评论 0 49
  • •前端面试题汇总 一、HTML和CSS 21 你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么? ...
    Simon_s阅读 6,568评论 0 8