我知道这应该很简单,但是任何人都可以告诉我,为什么在将a margin-top: 50%应用于子项时,以下子项框为什么会超出其父项的容器。如何计算保证金最高百分比?
margin-top: 50%
.container { background: lightblue; padding: 10px; height: 200px; } p { display: block; border:1px solid red; margin-top:50%; } <div class="container"> <p> Some Cool content</p> </div>
子元素不应放置在200像素(父元素的高度)的50%处,即距顶部100像素的位置吗?
从 W3C规范:
相对于生成的框的包含块的宽度计算百分比。请注意,“ margin-top”和“ margin- bottom”也是如此。如果包含块的宽度取决于此元素,则结果布局在CSS 2.1中未定义。
有两个很好的理由使垂直边距基于包含块的宽度:
水平和垂直一致性
当然,有一个速记属性,可让您为块的所有四个边指定边距:
margin: 10%;
扩展为:
margin-top: 10%; margin-right: 10%; margin-bottom: 10%; margin-left: 10%;
现在,如果您编写了上面的任何一篇,您可能希望该块的所有四个边的边距都相等,不是吗?但是,如果左边距的边距和右边距的边距是基于容器的宽度,而margin- top和margin-bottom是基于容器的高度,则它们通常是不同的!
避免循环依赖
CSS将内容布置在垂直于页面向下堆叠的块中,因此,块的宽度通常完全由其父代的宽度决定。换句话说,您可以计算一个块的宽度,而不必担心该块内部的内容。
块的高度是另一回事。通常,高度取决于其内容的总高度。更改内容的高度,然后更改块的高度。看到问题了吗?
要获取内容的高度,您需要知道应用于内容的顶部和底部边距。如果这些边距取决于父块的高度,那么您就麻烦了,因为您无法在不知道另一个的情况下计算一个!
在容器的宽度上放置垂直边距可以打破这种圆形依赖性,并可以对页面进行布局。
例:
这是小提琴。和代码:
的HTML
<div class="container"> <p id="element"> Some Cool content</p> </div> <p> MORE TEXT </p>
的CSS
.container { background: lightblue; padding: 10px; height: 100px; width: 500px; } p { display: block; border: 1px solid red; margin-top: 50%; }
JS
window.onload = function(evt) { var element = document.getElementById("element"), style = element.currentStyle || window.getComputedStyle(element); element.textContent = "the margin-top is : " + style.marginTop; };