【问题标题】:Is there any difference between 'margin-top, -left, -bottom, -right' and 'top, left, bottom, right' properties when element is positioned absolutely?当元素绝对定位时,'margin-top,-left,-bottom,-right'和'top,left,bottom,right'属性之间有什么区别吗?
【发布时间】:2019-09-13 19:28:18
【问题描述】:

我想知道当我在元素上使用position: absolute 属性时,边距和定位属性之间是否有任何区别。

我知道一个元素相对定位的时候有很大的不同,但是当一个元素在绝对定位的时候脱离层次,好像没有什么区别。

我尝试创建几个元素、div、段落、标题并相对绝对地定位它们。然后我添加了边距和“顶部、底部等”。属性。

* {
  margin: 0;
  padding: 0;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

*, *::before, *::after {
  box-sizing: border-box;
}

body {
  background-color: #363636;
  color: white;
  font-family: Roboto, sans-serif;
  font-size: 20px;
  text-align: justify;
}

.wrapper {
  width: 400px;
  margin: auto;
  position: relative;
}

.wrapper>* {
/*   margin-top: 20px; */
}

.header {
  color: cyan;
  
  position: absolute;
  margin-top: 20px;
/*   top: 20px; */
}

.title {
  color: red;
  
  margin-top: 100px;
}

.lorem {
  
}

.footer {
  margin-top: 40px;
}
<div class="wrapper">
  <h1 class="header">Lorem ipsum dolor sit amet.</h1>
  <h2 class="title">Lorem, ipsum dolor.</h2>
  <p class="lorem">Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente ab, cum, doloremque ratione quas officia placeat adipisci saepe hic similique perferendis voluptates molestiae ea id eius atque ipsum assumenda. Reprehenderit ullam nobis quis mollitia ab, nam eveniet ipsum in. Impedit ipsum odit quae facere! Voluptate illum, temporibus quasi natus repudiandae atque cupiditate laboriosam aliquam nostrum doloribus iste quibusdam commodi harum, earum ea doloremque! Eum temporibus commodi eaque aliquid ullam quod eius, praesentium dolores dicta! Aut eligendi repudiandae qui doloremque, id odit, nulla commodi quod quia molestiae blanditiis cum exercitationem atque eum maiores dolore quas rerum, laborum doloribus? Necessitatibus, facilis inventore.
  </p>
  <div class="footer">
    <p class="info">E-mail address</p>
    <p class="location">America</p>
  </div>
</div>

这是我的代码笔,我正在谈论的元素是 h1.header。当我更改 margin-top: 20pxtop: 20px 时,它似乎相同。

【问题讨论】:

  • 你为什么这么问?
  • 这有帮助吗?我应该标记为重复吗? stackoverflow.com/questions/4036176/css-top-vs-margin-top
  • @HassanVoyeau 你为什么要问? --> 因为这是这个网站的目的:提问
  • 换个说法,你想达到什么目的?大多数答案会说它不一样并给出示例但是如果没有确切的文档,您将如何知道所有差异,对吗?因此,如果我们知道询问的原因,那么我们会在无法指出某处记录的所有差异的情况下解决这个问题。
  • @HassanVoyeau 我们并不总是需要取得成就。通过至少举一个例子说它不一样就足以证明它们不一样,你回答这个问题,因为 OP 认为没有区别。添加引用以显示记录的原因和位置将是最佳的。仍然不需要有什么特别要实现的目标

标签: css


【解决方案1】:

是的,尤其是当绝对定位的项目不是其锚点中的第一个项目时。你会注意到我唯一改变的是我在其中添加了一个&lt;p&gt;Some text&lt;/p&gt;,现在margin-top 和top 之前的行为不那么相似了。

可能还有其他不同的规则。在某些情况下,利润会崩溃。顶部永远不会“崩溃”。

* {
  margin: 0;
  padding: 0;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

*, *::before, *::after {
  box-sizing: border-box;
}

body {
  background-color: #363636;
  color: white;
  font-family: Roboto, sans-serif;
  font-size: 20px;
  text-align: justify;
}

.wrapper {
  width: 400px;
  margin: auto;
  position: relative;
}

.wrapper>* {
/*   margin-top: 20px; */
}

.header {
  color: cyan;
  
  position: absolute;
  margin-top: 20px;
/*   top: 20px; */
}

.title {
  color: red;
  
  margin-top: 100px;
}

.lorem {
  
}

.footer {
  margin-top: 40px;
}
<div class="wrapper">
  <p>Some text</p>
  <h1 class="header">Lorem ipsum dolor sit amet.</h1>
  <h2 class="title">Lorem, ipsum dolor.</h2>
  <p class="lorem">Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente ab, cum, doloremque ratione quas officia placeat adipisci saepe hic similique perferendis voluptates molestiae ea id eius atque ipsum assumenda. Reprehenderit ullam nobis quis mollitia ab, nam eveniet ipsum in. Impedit ipsum odit quae facere! Voluptate illum, temporibus quasi natus repudiandae atque cupiditate laboriosam aliquam nostrum doloribus iste quibusdam commodi harum, earum ea doloremque! Eum temporibus commodi eaque aliquid ullam quod eius, praesentium dolores dicta! Aut eligendi repudiandae qui doloremque, id odit, nulla commodi quod quia molestiae blanditiis cum exercitationem atque eum maiores dolore quas rerum, laborum doloribus? Necessitatibus, facilis inventore.
  </p>
  <div class="footer">
    <p class="info">E-mail address</p>
    <p class="location">America</p>
  </div>
</div>

【讨论】:

  • 好的,谢谢,我想我明白区别了,margin-top 指的是这个标题之前的元素,top 指的是父元素,对吧?
  • 并非如此。边距是用来做什么的,它用来做什么通常是不同的,但是...... margin: 20px 基本上是说让所有东西都离我的边缘至少 20px 。另一方面,根据元素的位置属性,顶部具有不同的含义。如果它是 position:relative,那么 top:20px 表示将元素从原来的位置向下移动 20px,如果它是 position:static。如果元素是 position:absolute,那么它会说从它的锚元素顶部向下移动 20px。
  • 要找到某个位置的锚元素:absolute,开始向上爬取元素的祖先(它是父/容器,然后是该元素的父/容器,然后是该元素的父/容器等),直到您找到第一个不是位置:静态的。在您的情况下,.header 的父级是 .wrapper 元素,而该元素是 position:relative,所以这就是锚。
  • 感谢您的纠正,所以margin-top 将所有东西都放在一边,因为它是绝对定位的,所以它正在远离之前的元素,而top 是相对于第一个祖先元素定位的元素不同于static
  • 足够接近,是的。
【解决方案2】:

是的,存在与 静态位置相关的差异。下面是一个简单的例子来说明:

.box {
  position: relative;
  border: 2px solid green;
  width: 200px;
  position: relative;
  display: inline-block;
}

.box>div {
  height: 50px;
  width: 50px;
  background: red;
}
<div class="box">
  <h1>I am static</h1>
  <div></div>
</div>

<div class="box">
  <h1>I am static</h1>
  <div style="position:absolute;margin-top:20px;"></div>
</div>

<div class="box">
  <h1>I am static</h1>
  <div style="position:absolute;top:20px;"></div>
</div>

请注意,在第一个示例中,元素从其初始位置(我们称为静态位置)移动了20px,而在第二个示例中,它从顶部移动了20px的父元素(包含块)。

来自the specification

就本节和下节而言,术语“静态位置”(元素的)大致是指元素在正常流程中的位置。更准确地说,'top' 的静态位置是从包含块的顶部边缘到假设框的顶部边缘边缘的距离,如果其指定的 'position' 值为 ' static',其指定的 'float' 为 'none',其指定的 'clear' 为 'none'...

那么我们有:

对于绝对定位的元素,垂直尺寸的使用值必须满足这个约束:

'top' + 'margin-top' + 'border-top-width' + 'padding-top' + 'height' + 'padding-bottom' + 'border-bottom-width' + 'margin-bottom' + 'bottom' = height of containing block

那么第一种情况会如下:

如果 'top'、'height' 和 'bottom' 这三个都是自动的,请将 'top' 设置为静态位置并应用下面的第三条规则。

第二个将跟随这个:

'bottom' 是 'auto','top' 和 'height' 不是 'auto',然后将 'margin-top' 和 'margin-bottom' 的 'auto' 值设置为 0 并求解 'bottom'

如果在设置top:0静态位置 相同,则两者的行为相同。基本上,当元素是其包含块中的第一个时

.box {
  position: relative;
  border: 2px solid green;
  width: 200px;
  position: relative;
  display: inline-block;
  vertical-align:top;
}

.box>div {
  height: 50px;
  width: 50px;
  background: red;
}
<div class="box">
  <div></div>
  <h1>I am static</h1>
</div>

<div class="box">
  <div style="position:absolute;margin-top:20px;"></div>
  <h1>I am static</h1>
</div>

<div class="box">
  <div style="position:absolute;top:20px;"></div>
  <h1>I am static</h1>
</div>

值得注意的是,您可以将两者结合起来。您只需要应用规范中所述的正确规则。


同样的逻辑适用于margin-left/rightleft/right

【讨论】:

  • 感谢您的解释和如此详细的回答,现在我明白了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多