由于内部容器边距,内部容器正在推动外部容器的位置[重复]

Posted

技术标签:

【中文标题】由于内部容器边距,内部容器正在推动外部容器的位置[重复]【英文标题】:Inner container is pushing the outer container's position due to inner container margin [duplicate] 【发布时间】:2019-08-30 05:08:21 【问题描述】:

row div 的顶部/底部边距为 10 像素 (margin: 10px 2px)。但是,10px 正在推动主容器的位置。我想要实现的是该行在main-container 内有一个顶部/底部边距。边距是如何逃避和推动main-container

这是我的代码:

body 
    padding: 0;
    margin: 0;

.main-container 
    position: relative;
    display: block;
    width: 183px;
    height: 101px;
    background-color: red;


.row 
    position: relative;
    display: block;
    margin: 10px 2px;
    width: 175px;
    height: 15px;
    background-color: green;
<div class="main-container">
    <div class="row">
    </div>
    <div class="row">
    </div>
</div>

但是如果你运行这段代码(如下),没有row div。可以看到main-container 的位置不同。这是main-container 应该在的位置。

body 
    padding: 0;
    margin: 0;

.main-container 
    position: relative;
    display: block;
    width: 183px;
    height: 101px;
    background-color: red;
<div class="main-container">
</div>

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

您应该将.main-container 类中的position 更改为position: absolute 而不是position: relative

相对定位将随着页面的流向移动元素,而绝对定位本质上会将其锁定在您设置的任何位置。相对定位更适用于像 .row 类这样的情况,您想要它取决于.main-container 类的定位。当您不希望其他元素(特别是父元素)确定其位置时,应使用绝对定位。

body 
    padding: 0;
    margin: 0;

.main-container 
    position: absolute;
    display: block;
    width: 183px;
    height: 101px;
    background-color: red;


.row 
    position: relative;
    display: block;
    margin: 10px 2px;
    width: 175px;
    height: 15px;
    background-color: green;
<div class="main-container">
    <div class="row">
    </div>
    <div class="row">
    </div>
</div>

This article 很好地解释了当父母和孩子都拥有position: relative 时您遇到问题的原因。如果您将position 完全从父代中取出,您甚至不会注意到差异。为什么?因为没有什么可以相对定位它。如果将其从.row 类中删除,您会发现相同的结果。相对定位查找定位不同于 static 的元素。在这种情况下,没有一个,所以它并没有真正做任何事情,因为默认情况下所有的父母(body、html 等)都有position: static

body 
    padding: 0;
    margin: 0;

.main-container 
    display: block;
    width: 183px;
    height: 101px;
    background-color: red;


.row 
    position: relative;
    display: block;
    margin: 10px 2px;
    width: 175px;
    height: 15px;
    background-color: green;
<div class="main-container">
    <div class="row">
    </div>
    <div class="row">
    </div>
</div>

【讨论】:

但是为什么row会改变main-container的位置呢? row 的边距在 inside main-container?它是如何逃脱main-container 的? row 的边距应推动行位置 inside main-container 的范围 我已经为你添加了解释。 .main-container 类上的 position: relative 没有做任何事情。如果您完全删除它,您会注意到没有任何变化。并不是margin 在“逃避”main-container。这只是对position: relative 的滥用,导致定位没有变化。 @Ross 检查重复,都是关于边距折叠,无需更改位置。在这种情况下,更改位置是一个 hack,因为没有边距与 position:absolute 折叠 不一定是“黑客”,而是解决问题的众多可能解决方案之一。可以找到解决此问题的所有潜在解决方案here。【参考方案2】:
<div class="main-container">
    <div class="row">
    </div>
    <div class="row">
    </div>
</div>

body 
  padding: 10px;
  margin: 0;

.main-container 
  position: relative;
    width: 183px;
    height: 101px;
    background-color: red;


.row 
  position: relative;
  left: 50%;
  top: 35%;
  transform: translate(-50%, -50%);
  margin: 10px 0;
    width: 175px;
    height: 15px;
    background-color: green;

查看https://codepen.io/3rdsty4bl00d/pen/OGbENg?editors=1100#0

【讨论】:

你知道为什么我的代码不起作用吗?我通常一直使用这种方法来定位我的内部 div 项,但由于某种原因,今天它坏了? 使用position: absolute;position: relative; 是有问题的。这就是我避免在 css 中使用位置的原因。使用带有网格布局的 flexbox 更容易,也不会那么麻烦。 有没有办法使用position: relative; 来完成这项工作?因为在我的实际代码中,当我使用网格时它搞砸了。我一直在使用相对定位。所以我的所有东西都设置在一个相对位置 检查这个新的 codepen 代码以获得您的答案。我希望这行得通。 codepen.io/3rdsty4bl00d/pen/OGbENg?editors=1100#0 我不是在取笑position: absolute;position: relative;。在设计网页时,它们真的很棒,而且非常有用。在我发现flex-boxgrid layout 之前,我曾经使用过这些职位。在我习惯了这些布局之后,我发现定位一个元素有点太多了。 Flex-boxGrid layout 确实让定位元素变得很容易。请不要误会我的意思。我并不是说这对代码不利。 @尼克

以上是关于由于内部容器边距,内部容器正在推动外部容器的位置[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Docker ❀ 容器内部/外部通信端口映射网络模式自定义容器网络

可以从docker容器外部连接到数据库,但不能从内部(在laravel中)连接到数据库

容器内部安装scp,拷贝到外部物理机

内推 | 阿里巴巴,K8S/Docker/容器技术专家

Flutter——最详细的Container(容器)使用教程

Flutter——最详细的Container(容器)使用教程