[转]如何解决外边距margin叠加的问题探讨

两个或多个毗邻的普通流中的块元素垂直方向上的 margin 会折叠,那么如何使元素上下margin不折叠呢?下面的方法或许对大家有所帮助

一、首先你要知道什么情况下会触发:两个或多个毗邻的普通流中的块元素垂直方向上的 margin 会折叠

1.两个或多个 
说明其数量必须是大于一个,又说明,折叠是元素与元素间相互的行为,不存在 A 和 B 折叠,B 没有和 A 折叠的现象。

2.毗邻 
是指没有被非空内容、padding、border 或 clear 分隔开,说明其位置关系。 
注意一点,在没有被分隔开的情况下,一个元素的 margin-top 会和它普通流中的第一个子元素(非浮动元素等)的 margin-top 相邻; 只有在一个元素的 height 是 "auto" 的情况下,它的 margin-bottom 才会和它普通流中的最后一个子元素(非浮动元素等)的 margin-bottom 相邻。

3.垂直方向 
是指具体的方位,只有垂直方向的 margin 才会折叠,也就是说,水平方向的 margin 不会发生折叠的现象。

二、那么如何使元素上下margin不折叠呢?

1.浮动元素、inline-block 元素、绝对定位元素的 margin 不会和垂直方向上其他元素的 margin 折叠(注意这里指的是上下相邻的元素)

2.创建了块级格式化上下文的元素,不和它的子元素发生 margin 折叠(注意这里指的是创建了BFC的元素和它的子元素不会发生折叠)

我们都知道触发BFC的因素是float(除了none)、overflow(除了visible)、display(table-cell/table-caption/inline-block)、position(除了static/relative)

很明显大家可以看出来相邻元素不发生折叠的因素是触发BFC因素的子集,也就是说如果我为上下相邻的元素设置了overflow:hidden,虽然触发了BFC,但是上下元素的上下margin还是会发生折叠

这个问题其实和BFC并没有太大的关系,希望大家不要滥用BFC,要知道BFC不是全能,创建BFC的初衷只是为了让元素本身(包括它的子元素)能够正确的计算自己的宽高。http://www.yuiblog.com/blog/2010/05/19/css-101-block-formatting-contexts

不发生折叠的触发因素是浮动元素、inline-block 元素、绝对定位元素,这个只是创建BFC因素的子集,但并不能说明创建了BFC的元素就不会发生折叠,因为BFC还可以用overflow:hidden来创建。相反如果父元素触发了BFC,那么他的块级子元素反而会发生折叠。

这里我写了一个DEMO来说明这个问题:http://whycss.com/demo/collspan_demo.html 创建BFC的三种情况都提到了,结果是子元素的上下margin都会发生折叠 。

克军提到的最后一个zoom,这是IE浏览器最初支持的缩放属性,到现在只有最新的webkit核心的浏览器也支持。但只是在IE8以下的浏览器下才可成功触发hasLayout,对于非IE浏览器也是没有效果的,所以还是需要同样的去创建BFC。关于hasLayout与BFC的介绍可参见本人博客的文章http://www.smallni.com/?p=174

关于最终如何解决这样的问题,我的建议是在写的时候尽量用同一方向的margin,比如都设置为top或者bottom,因为你在实践的时候有时不需要为每个元素设置浮动、inline-block或者absolute 。

时间: 2024-12-19 23:04:33

[转]如何解决外边距margin叠加的问题探讨的相关文章

3.4 外边距(margin)

margin指的是元素与元素之间的距离,观察上节的图1,可以看到边框在默认情况下会定位于浏览器窗口的左上角,但是并投有紧贴着浏览器窗口的边框.这是因为body本身也是一个盒子,在默认情况下.body会有一个若干像素的margin,具体数值各个浏览器不尽相同.因此在body中的其他盒子,就不会紧贴着浏览器窗口的边框了.为了验证这一点,可以给body这个盒子也加一个边框,代码如下. body{ border:1px black solid; background:#cc0; } 在body设置了边框

CSS 外边距(margin)重叠及防止方法

CSS 外边距(margin)重叠及防止方法 胡俊涛 | 2011-11-17 边界重叠是指两个或多个盒子(可能相邻也可能嵌套)的相邻边界(其间没有任何非空内容.补白.边框)重合在一起而形成一个单一边界. 两个或多个块级盒子的垂直相邻边界会重合.结果的边界宽度是相邻边界宽度中最大的值.如果出现负边界,则在最大的正边界中减去绝对值最大的负边界.如果没有正边界,则从零中减去绝对值最大的负边界.注意:相邻的盒子可能并非是由父子关系或同胞关系的元素生成. 但是边界的重叠也有例外情况: 1.水平边距永远不

理解CSS外边距margin

前面的话   margin是盒模型几个属性中一个非常特殊的属性.简单举几个例子:只有margin不显示当前元素背景,只有margin可以设置为负值,margin和宽高支持auto,以及margin具有非常奇怪的重叠特性.之前的博文中已经分别详细地介绍了margin的基础知识和负margin的详细用法.本文将详细介绍外边距margin的几个重点部分,包括重叠.auto和无效情况 重叠 [前提]   margin重叠又叫margin合并,发生这种情况有两个前提   1.只发生在block元素上(不包

CSS 外边距(MARGIN)重叠及防止方法(转载)

边界重叠是指两个或多个盒子(可能相邻也可能嵌套)的相邻边界(其间没有任何非空内容.补白.边框)重合在一起而形成一个单一边界. 两个或多个块级盒子的垂直相邻边界会重合.结果的边界宽度是相邻边界宽度中最大的值.如果出现负边界,则在最大的正边界中减去绝对值最大的负边界.如果没有正边界,则从零中减去绝对值最大的负边界.注意:相邻的盒子可能并非是由父子关系或同胞关系的元素生成.但是边界的重叠也有例外情况: 1.水平边距永远不会重合.2.在规范文档中,2个或以上的块级盒模型相邻的垂直margin会重叠.最终

CSS外边距margin上下元素重叠

两个或多个块级盒子的垂直相邻边界会重合.结果的边界宽度是相邻边界宽度中最大的值.如果出现负边界,则在最大的正边界中减去绝对值最大的负边界.如果没有正边界,则从零中减去绝对值最大的负边界.注意:相邻的盒子可能并非是由父子关系或同胞关系的元素生成.但是边界的重叠也有例外情况: 1.水平边距永远不会重合.2.在规范文档中,2个或以上的块级盒模型相邻的垂直margin会重叠.最终的margin值计算方法如下:a.全部都为正值,取最大者:b.不全是正值,则都取绝对值,然后用正值减去最大值:c.没有正值,则

解决外边距溢出---内容生成

<!DOCTYPE html> <html> <head> <meta charest="utf-8"> <title>解决外边距溢出</title> <style> #d1,d2{ width:200px; height:200px; background:red; } #d2{ background:green; } #d3{ width:100px; height:100px; backgroun

css盒子模型、边框border、外边距margin、填充padding、轮廓outline

盒子模型 一个盒子包括外边距.边框.内边距和实际内容 Margin(外边距):清除边框外的区域,外边距是透明的. Border(边框):围绕在内边距和外边距的边框. Padding(内边距):清除内容周围的区域,内边距是透明的. Content(内容):盒子的内容,显示文本和图像. 例如下面一个例子 <!DOCTYPE html> <html> ······ <style> div { background-color: lightgrey; width: 300px;

[ css 外边距 margin ] css中margin外边距合并问题讲解及实例演示

外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距;合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者 外边距合并外边距合并(叠加)是一个相当简单的概念.但是,在实践中对网页进行布局时,它会造成许多混淆.简单地说,外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距.合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者.当一个元素出现在另一个元素上面时,第一个元素的下外边距与第二个元素的上外边距会发生合并.请看下图: CSS 外边距合并实例 1 亲自试一试

css之去除html标签默认的外边距margin和内边距padding,通用工具类 base.css

@charset "utf-8"; /*! * @名称:base.css * @功能:1.重设浏览器默认样式 * 2.设置通用原子类 */ /* 防止用户自定义背景颜色对网页的影响,添加让用户可以自定义字体 */ html { background:white; color:black; } /* 内外边距通常让各个浏览器样式的表现位置不同 */ body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,le