本篇文章主要说两个问题(移动端的H5页面):

1、在父子级嵌套的情况下,子级的margin-top会对父级产生影响;
2、根节点div的height=100vh时候,margin-bottom在浏览器中正常,在手机上不生效;

在两个容器嵌套时,子集的margin-top作用于父级元素上。代码如下:

<style>
  .box{
    background: goldenrod;
  }
  .unit{
    height: 800px;
    background: #00a2d4;
    border-radius:120px;
    margin-top:60px;
  }
</style>
<div class="box">
  <div class="unit">我是暗夜世界</div>
</div>

这并不是我想要的结果,预期效果应该是黄色区域的文字在页面顶部。

为什么会产生这样的效果呢?这要谈到css的盒模型margin的合并问题

css在盒模型中规定
    In this specification, the expression collapsing margins means that adjoining margins (no non-empty content, padding or border areas or clearance separate them) of two or more boxes (which may be next to one another or nested) combine to form a single margin. 在本规范中,所有(相邻或嵌套)两个或多个盒元素,且他们之间没有非空内容、padding或border分隔,margin将会合并为一个且共享之

先看:相邻的和元素mairgin-top合并情况,margin数值大的会将比其数值小的合并掉。


问题原因是:非空元素unit2的盒子的上面是空元素盒子unit,且unit没有padding,border,height分隔
解决此问题的方法很多,给unit加border,内容,padding,height等,当然一般人不会这么布局哈。

嵌套盒模型出现的margin合并问题,如下图(此问题比较常见):

问题原因是:嵌套盒模型之间没有非空内容,且没有padding、border分隔。
解决办法:父级unit元素加border,padding、overflow:hidden、浮动、绝对定位、改变盒模型等。
float: left或right
position: absolute
display: inline-block或table-cell或其他 table 类型
overflow: hidden或auto


如果根元素的高度是height:100vh,子集的margin-bottom不起作用。

<style>
  .body{
    min-height: 100vh;
    background: #248758;
    font-size: 30px;
    text-align: center;
    color: #fff;
  }
  .unit{
    height: 800px;
    background: #00a2d4;
    border-radius:120px;
    margin-bottom:60px;
  }
</style>
<body class="body">
  <div class="unit">我是暗夜世界</div>
</body>

显示结果:浏览器显示正常,手机端不起作用;如下图

可以看到第一张图在浏览器中margin撑开了body,第三张图margin并没有把body撑开。这是我在工作中偶然发现的问题,这个问题的关键是body上的htight:100vh,目前问题的具体有原因还在研究中。若有知道其原因的同学,欢迎指导~

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐