css - margin 取值 auto 百分比,外边距折叠。

自 http://blog.doyoe.com/archives/ css

 

Margin 的auto取值wordpress

margin 是复合属性也就是说 margin: auto; 其实至关于 margin: auto auto auto auto; margin: 0 auto;至关于 margin: 0 auto 0 auto;,四个值分别对应上右下左。spa

margin 的 上下左右方向还与 writing-mode 和文档流方向direction 有关设计

http://www.zhangxinxu.com/wordpress/2016/04/css-writing-mode/(讲的很清楚还有实际用的例子。)code

默认 writing-mode: horizontal-tb;  direction: ltr;blog

为何auto能实现水平居中文档

水平方向的auto,其计算值取值于可用空间(剩余空间)get

例如:一个宽100px的p被包含在一个宽500px的div内,此时设置 p 的 margin-left 值为 auto,结果获得了,p相对于包含块右对齐了,这与规范描述一致。margin-left:auto; 自动占据了包含块的可用空间,即 500 - 100px = 400px。也就是说auto最后的计算值为400px,即 margin-left:400px;。因此 margin-right:auto; 的结果会至关于左对齐。it

由于左右方向的auto值均分了可用空间,使得块元素得以在包含块内居中显示。io

 

margin 取值百分比

场景:假设一个块级包含容器,宽1000px,高600px,块级子元素定义 margin:10% 5%; 你们说说 margin 的 top, right, bottom, left 计算值最终是多少?

事实告诉咱们结果是 100px 50px 100px 50px

规范中注明 margin 的百分比值参照其包含块的宽度进行计算。

和上篇文章 keyword auto 同样,这只发生在默认的 writing-mode: horizontal-tb; 和 direction: ltr;

当书写模式变成纵向的时候,其参照将会变成包含块的高度。

CSS这样设置的目的:

其实这是为了要横向和纵向2个方向都建立相同的margin,若是它们的参照物不一致,那就没法获得两个方向相同的留白。

(margin折叠也受书写模式影响)

 

margin 与相对偏移(position:relative) 的异同

margin-top 仍是 relative top 都是以自身做为参照物进行偏移的。

margin-top 影响文档流排版, relative改变的只有自身。

absolute 偏移相对的是包含块,而且其偏移值是从包含块的 padding 区域开始计算。以前一直觉得是内容区域开始的!!!百分比也是按照padding加内容区的值为百分之百。

绝对定位让不设置宽度的块元素表现的像行内块元素。除非你设置了定位的四个方向。

可能不设置,会给他们赋值为尽量的大。

当position为relative时,若是top和bottom都是auto,则它们的计算值是0,right和left亦然;若是top和bottom其中一个为auto,则auto至关于另外一个的负值,即top = -bottom,right和left亦然;若是top和bottom的值都不为auto,则忽略bottom,若是right和left的值都不为auto,则忽略right。

若是同时设置top bottom left right, 取top,left的值。

 

margin 外边距折叠

外边距用来指定非浮动元素与其周围盒子边缘的最小距离。两个或两个以上的相邻的垂直外边距会被折叠并使用它们之间最大的那个外边距值。多数状况下,折叠垂直外边距能够在视觉上显得更美观,也更贴近设计师的预期。

发生折叠须要是相邻的费浮动元素

折叠发生在垂直外边距上,即margin-top/margin-bottom;(受writing-mode影响)

折叠后取其中最大的那个margin值做为最终值

为何有margin折叠这样的设计

 margin 折叠是为实现文本排版的段落间距而提供的特性。

浮动元素不会发生margin折叠

发生 margin 折叠的元素不必定是兄弟关系,也能是父子或祖先的关系。