前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >垂直方向margin重叠原因与解决方法 原

垂直方向margin重叠原因与解决方法 原

作者头像
tianyawhl
发布2019-04-04 09:58:00
1.8K0
发布2019-04-04 09:58:00
举报
文章被收录于专栏:前端之攻略前端之攻略

我们经常写样式的时候会遇到垂直方向margin重叠的问题,如下代码: 

代码语言:javascript
复制
    <style>
    .container1 {
        color: #fff;
    }

    .first {
        margin-bottom: 20px;
        padding-left: 10px;
        height: 200px;
        width: 200px;
        background-color: #28adbd;
       
    }

    .second {
        margin-top: 20px;
        height: 200px;
        width: 200px;
        background-color: #6871c1;
    }
    </style>

<body>
    <div class="container1">
        <div class="first">first p</div>
        <div class="second">second p</div>
    </div>
</body>

可以看出由于margin-top:20px;margin-bottom:20px,应该显示40px但是只显示20px,是什么原因呢?这就涉及到BFC

什么是BFC:Block Formatting Context,解释为块级格式化上下文 

一个HTML元素要创建BFC,则满足下列的任意一个或多个条件即可:

1、float的值不是none。(float:left 或者float:right)

2、position的值不是static或者relative。(position:absolute或者position:fixed)

3、display的值是inline-block、table-cell、flex、table-caption或者inline-flex

4、overflow的值不是visible(overflow:hidden、overflow:scroll)           

5、父元素与正常文件流的子元素(非浮动子元素)自动形成一个BFC                                                                                              

BFC中盒子怎么对齐

在一个BFC中,块盒与行盒(行盒由一行中所有的内联元素所组成)都会垂直的沿着其父元素的边框排列

W3C给出得规范是:在BFC中,每一个盒子(子元素)的左外边缘(margin-left)会触碰到容器的左边缘(border-left)(对于从右到左的格式来说,则触碰到右边缘)。浮动也是如此(尽管盒子里的行盒子 Line Box 可能由于浮动而变窄)。

正常情况下一个BFC是由父元素和子元素组成的,有时候也只有一个父元素

BFC的特征

(1)所有子元素(包含浮动元素)与容器(父元素)左边对齐

(2)属于同一个BFC的父元素和子元素,相邻的父子或者兄弟间margin垂直方向会重叠,若2个元素属于不同的BFC,则垂直方向不会重叠

(3)可以自动撑开容器(若子元素是float的,父元素设置overflow:hidden,父元素就形成一个BFC)

防止margin重叠我们就可以从BFC的特征入手,让2个相邻的元素不是属于一个BFC

代码语言:javascript
复制
    <style>
    .container1 {
        color: #fff;
    }

    .first {
        margin-bottom: 20px;
        padding-left: 10px;
        height: 200px;
        width: 200px;
        background-color: #28adbd;
    }

    .second {
        margin-top: 20px;
        height: 200px;
        width: 200px;
        background-color: #6871c1;
    }
    </style>


<body>
    <div class="container1">
        <div class="first">first p</div>
        <div style="overflow:hidden">
            <div class="second">second p</div>
        </div>
    </div>
</body>

由于class 为second的元素外面套了一个div(一定要套一个div,因为overflow:hidden 是设置在父元素上,里面一定要有子元素),并设置了overflow:hidden,相当于新创建了一个新的BFC, first 与second 属于2个BFC所以margin不会重叠

另一种方法,子元素浮动,浮动相当于新建了BFC,所以不会重叠

代码语言:javascript
复制
    <style>
    .container1 {
        color: #fff;
        width:200px;
    }

    .first {
        margin-bottom: 20px;
        padding-left: 10px;
        height: 200px;
        width: 200px;
        background-color: #28adbd;
    }

    .second {
        margin-top: 20px;
        height: 200px;
        width: 200px;
        background-color: #6871c1;
    }
    </style>


<body>
    <div class="container1">
        <div class="first" style="">first p</div>
        <div class="second" style="float:left">second p</div>
      </div>
</body>

相邻的子元素2个都浮动或者下面的一个浮动

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018/09/29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档