平时不少问题,大可能是知其然不知其因此然形成的。因此,明白了原理,在遇到问题就有了分析的思路。因此,我但愿你们在遇到非标准的问题的时候,也就所谓的某些bug的时候,
多去探查一下,为何会产生这种问题。解决的原理是什么,别解决了就算完了。如今的省事,会给你未来的成长埋下隐患。css
而每每所谓的bug,是对规范,原理的理解不透彻形成的。
因此多问个为何,虽尺有所短,但假以时日,必寸有所长。html
本文主要涉及如下知识点点:浏览器
了解了这些,就能够说margin我是懂点了。距离真正懂还差得远。下面是针对本身状况的一些笔记和总结。ide
具体详细的文档可参考 圆心、海玉的文章和w3c上的规范。 布局
http://www.planabc.net/2007/03/18/css_attribute_margin/ 圆心网站
http://www.hicss.net/do-not-tell-me-you-understand-margin/ 海玉ui
http://www.w3cplus.com/css/the-definitive-guide-to-using-negative-margins.html 大漠老师网站spa
感谢前辈们的心血。.net
再说了白点就是:父元素的第一个子元素的上边距margin-top若是碰不到有效的border或者padding.就会不断一层一层的找本身“领导”(父元素,祖先元素)的麻烦,把本身的margin当领导的margin执行htm
其中有类特殊的元素:如img|input|select|textarea|button|label等,他们被称为可置换元素(Replaced element)
从上咱们能够看到 top 和 left 都是之外元素为参考,而 right 和 bottom 以本元素为参考。上面的位移方向是指 margin 数值为正值时候的情形,若是是负值则位移方向相反。
box 的实际大小 = box 的物理大小 + 正的 margin
这仅对元素自己有效,对于其后面的相关元素,他们则只以 margin 的逻辑大小为准则,进行布局。
结论:
box 最后的显示大小等于 box 的 border 及 border 内的大小加上正的 margin 值。而负的 margin 值不会影响 box 的实际大小,若是是负的 top 或 left 值会引发 box 的向上或向左位置移动,若是是 负的bottom 或 right 只会影响下面 box 的显示的参考线。
实际的逻辑大小,是按照边边来算的。
IE6/7/8下auto margin居中bug:
发生场合:给block元素设置margin auto没法居中 解决方法:出现这种bug的缘由一般是没有Doctype,而后触发了ie的quirks mode,加上Doctype声明就能够了。在《战胜IE的葵花宝典》里给出的方法是给block元素添加一个width可以解决,但根据本人亲测,加with此种方法是无效的,若是没有Doctype即便给元素添加width也没法让block元素居中。
原理分析:缺乏Doctype声明。
IE8下input[button | submit] 设置margin:auto没法居中
发生场合:ie8下,若是给像button这样的标签(如button input[type="button"] input[type="submit"])设置{ display: block; margin:0 auto; }若是不设置宽度的话没法居中。
解决方法:能够给为input加上宽度
原理分析:IE8浏览器Bug。IE8百分比padding垂直margin bug:
发生场合:当父元素设置了百分比的padding,子元素有垂直的margin的时候,就好像父元素被设置了margin同样。
解决方法:给父元素加一个overflow:hidden/auto。
原理分析:IE8浏览器Bug。