平時不少問題,大可能是知其然不知其因此然形成的。因此,明白了原理,在遇到問題就有了分析的思路。因此,我但願你們在遇到非標準的問題的時候,也就所謂的某些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。