本文總結於 張鑫旭老師的 CSS深刻理解之margin課程,感謝張老師的辛苦付出!html
做爲前端狗的咱們,天天都要和網頁打交道。當 UI 將設計稿發給你時,CSS 的知識便顯得尤其重要。而 CSS 這一標記性的語言,卻時常讓我很頭疼:毫無邏輯性,並充滿了各類坑爹的潛規則 ,以致於每次作項目時,大部分時間精力都浪費在了調整佈局與樣式上,詳情可點擊知乎上的爲何 CSS 這麼難學?問題,道出了個人心聲 :(前端
但誰叫咱們是吃這碗飯的呢,無論怎樣,有困難必須迎面解決,學好 CSS ,向張老師看齊!chrome
margin 算是性格剛烈的屬性了,下面,我將從各個方面講解 margin 的可怕之處。瀏覽器
一般一個元素的尺寸可分爲:可視尺寸 與 佔據尺寸佈局
margin 又是怎樣影響這兩個尺寸的呢?設計
首先,兩個尺寸都需知足必定的條件。3d
margin 影響元素的可視水平尺寸 margin的可視尺寸示例code
margin 影響佔據尺寸 ,這個能夠說是 margin 的本命技能了,就不舉例了。htm
一般而言,margin 的單位中,百分比單位最容易讓人頭暈。blog
<style> #parent { margin: 20px 400px; width: 100px; height: 200px; } #child { /* 等價於 margin: 5% * 父元素的寬度 10% * 父元素的寬度; */ margin: 5% 10%; /* 父元素的寬度 * 50% */ width: 50%; /* 父元素的高度 * 50% */ height: 50%; } </style> <div id="parent"> <div id="child"></div> </div>
<style> #parent { width: 100px; } #child { /* 注意子元素已增長絕對定位,則百分比按照定位屬性的祖先元素的寬度計算, 本例中是瀏覽器視口 */ position:absolute; /* 等價於 margin: 5% * 父元素的寬度 10% * 父元素的寬度; */ margin: 5% 10%; } </style> <div id="parent"> <div id="child"></div> </div>
重疊可謂是 margin 中的最重要的潛規則了。
margin-top 重疊
margin-bottom 重疊
<style> #top{ margin-top:30px; } #bottom{ margin-bottom:20px; } </style> <div id="bottom"></div> <div id="top"></div> 兩個元素垂直距離爲 : #top元素的 margin-top值
<style> #top{ margin-top:-30px; } #bottom{ margin-bottom:20px; } </style> <div id="bottom"></div> <div id="top"></div> 兩個元素垂直距離爲: #top元素的margin-top值 加上 #bottom元素的margin-bottom值
<style> #top{ margin-top:-30px; } #bottom{ margin-bottom:-20px; } </style> <div id="bottom"></div> <div id="top"></div> 兩個元素垂直距離爲 : #top元素的 margin-top值
當你使用 margin auto
時,就應該聯想到一個詞 :填充
一個沒有設置寬高的塊級元素,會自動填充寬度
若是 一側是定值,一側是 auto,則 auto 爲剩餘空間的大小
若是兩側均是 auto,則平分 剩餘空間
示例以下:
<style> #demo{ width: 500px; margin-right:100px; /* margin-left: 100vw - margin-right - width*/ margin-left:auto; } </style> <div id="demo"></div>
以上,咱們可得當一個塊級元素設置了 margin: 0 auto
能夠實現水平居中,
而爲何 margin:auto 0 不會垂直居中?
答:一個塊級元素會自動填充可用的水平尺寸,但不會填充垂直尺寸,是由於其根本沒有任何可用的垂直空間。也就是說 margin: 0 auto , 老是有尺寸能夠來填充的! 而 margin: auto 0 是沒有任何尺寸的能夠來填充的。
當子元素的寬度大於父元素的寬度 ,是沒法經過 margin: 0 auto 實現居中的 由於,這個時候已經沒有任何空間能夠填充了,當寬度超出父元素時,margin 已經爲負值了。
<style> .father{ writing-mode: vertical-lr;/* 更改流的方向爲 垂直方向 */ } .son{ margin: auto; } </style> <div class="father"> <div class="son"></div> </div>
<style> .parent{ position: relative; } .child{ position: absolute; top: 0; bottom: 0; left: 0; right: 0; margin:auto; } </style> <div class="parent"> <div class="child"></div> </div>
margin-end 與 margin-start 相對
margin-before 默認狀況等同於 margin-top
margin-after 默認狀況等同於 margin-bottom
margin-collapse
(默認值) 發生重疊
取消重疊,margin 重疊部分爲 0 ,沒有margin
不發生重疊,margin 重疊部分爲 margin-top + margin-bottom
margin 課程就到此結束了,再次感謝張鑫旭老師的辛苦付出!
深刻Web全棧各項技術,堅持原創,文章更新雖不定,但只爲質量而生,若是您喜歡此篇文章,歡迎支持關注。