如果你看CSS box model spec,你会发现:

[margin]百分比是根据生成的框的width个包含块计算的.Note that this is true for 'margin-top' and 'margin-bottom' as well.如果包含块的宽度取决于这个元素,那么结果布局在CSS 2.1中是未定义的.(emphasis mine)

的确如此.但是why?到底是什么迫使人们这样设计呢?很容易想到你想要的场景,例如某个东西总是比页面顶部低25%,但很难找到任何理由来解释为什么你想要垂直填充相对于父对象的水平大小.

下面是我提到的现象的一个例子:

<div style="border: 1px solid red; margin: 0; padding: 0; width: 200px; height: 800px;">
  This div is 200x800.
  <div style="border: 1px solid blue; margin: 10% 0 0 10%;">
    This div has top-margin of 10% and left-margin of 10% with respect to its parent.
  </div>
</div>

http://jsfiddle.net/8JDYD/

推荐答案

将我的 comments 转换为回答,因为这符合逻辑.然而,请注意,这是毫无根据的猜测.从技术上讲,该规范为何以这种方式编写的实际原因仍然未知.

元素高度由元素的高度定义

更新:最后几句话可能不完全准确.叶元素(没有子元素的子元素)的高度会影响其上方所有元素的高度,因此这会影响许多不同的情况.

Css相关问答推荐

CSS动画与不正确的时间比率

将CSS更改为Mat-Form-Field,其中包含搜索框

在NextJS/Reaction应用程序中显示更新问题

如何在react 路由中设置活动类?

如何将 div 和 img 包装在 display:flex 容器中

解释 "document.styleSheets[0].cssRules[0].style;"

如何在一个父类里面 Select 两个不同的类?

使用 flexbox 使图像与内容高度相同

在不使用 position: fixed 的情况下从 CSS 网格中的自动布局中免除子元素?

我无法在 next.js 应用程序中传播 daisyui 的主题

在活动状态下更改按钮的外观

如何将转换应用于相同的元素但处于不同的状态:悬停

使用 CSS 无限期地闪烁两个不同持续时间的文本

在整个 DIV 周围添加 CSS 框阴影

bootstrap 模式对话框中的谷歌 map 自动完成结果

找到第一个可滚动的父级

如何设置表格单元格的最大高度?

如何在 CSS 中控制列表样式类型光盘的大小?

使用@font-face 使用多种自定义字体?

如何在 React 应用程序中使用 CSS 模块应用全局样式?