這篇文章給大家分享的是有關(guān)css中的margin屬性有什么用的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
專注于為中小企業(yè)提供成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設(shè)服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)梁河免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了成百上千企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
第一部分:margin--基礎(chǔ)知識
要介紹margin的基礎(chǔ)知識,我們不可回避地要談到css盒子模型(Box Model),一般而言,css盒子模型是用來設(shè)計和布局的。它本質(zhì)上是一個盒子,包括:外邊距(margin)、邊框(border)、內(nèi)邊距(padding)以及最中間的內(nèi)容(content)。下圖即為盒子模型(這里只談W3C規(guī)范的標(biāo)準(zhǔn)盒模型,而不談IE5和IE6在怪異模式中使用的非標(biāo)準(zhǔn)的盒子模型):
我們要介紹的margin在最外層,因為margin(外邊距)一定是透明的,所以它可以用來使得不同的盒子之間留有一定的間隙從而達(dá)到布局美觀等效果。從上面的盒子模型中我們可以看到,margin在四周均存在,我們可以使用margin-top、margin-right、margin-bottom、margin-left分別設(shè)置這四個方向的margin值。(注:由于這部分知識較為基礎(chǔ),所以我不再在這部分不做更多介紹)
第二部分:margin--在同級元素(非父子關(guān)系)之間應(yīng)用
這一部分主要介紹水平方向和豎直方向的外邊距的合并問題。
(1)水平方向的外邊距合并
兩個水平方向的盒子相遇,那么最終兩者之間的距離為左邊盒子的右外邊距和右邊盒子的做外邊距之和。
例1:
代碼如下:
水平方向的兩個盒子 寬為100px,右邊距為50px寬為100px,左邊距為50px
效果如下:
這時兩者之間的距離剛好為100px。
補充說明:大家可以看到,為了使得兩個div(塊狀元素)脫離正常的文檔流我使用了display:inline-block;屬性,另外,我還把body的font-size設(shè)置為0,這樣可以解決inline-block自身的問題,否則兩個div的舉例會大于100px。當(dāng)然使用float也可以使得兩個div出現(xiàn)在同一行中。
(2)豎直方向的外邊距合并
兩個豎直方向的盒子相遇時,其豎直方向的距離等于上方盒子的下外邊距和下方盒子的上外邊距中較大的一個。
例2:
水平方向的兩個盒子 高為100px,下邊距為100px高為100px,上邊距為50px
效果如下:
這時我們?nèi)庋鄱伎梢杂^察出來,兩者豎直方向的舉例大約為100px(實際就是100px)而非100+50=150px;這正是因為兩個豎直方向的盒子相遇時,其豎直方向的距離等于上方盒子的下外邊距和下方盒子的上外邊距中較大的一個。
另外一個有趣的例子就是:假設(shè)有一個元素同時設(shè)置了margin-top和margin-bottom,但是內(nèi)容為空,那么這兩個margin值也會疊加,值為兩者最大的一個,它類似與豎直方向上兩個盒子margin值的疊加。代碼如下:
水平方向的兩個盒子 上面的div,高100px下面的div,高100px
最終的效果如下:
我們發(fā)現(xiàn)這時在上面的div和在下面的div之間的舉例并不是100+50=150px,而是兩者中的最大者,即100px。
那么W3C為什么會設(shè)定這樣的標(biāo)準(zhǔn)而不設(shè)定和水平方向一樣的標(biāo)準(zhǔn)呢?即margin值的疊加,實際上這也是有一定的道理的。比如我們需要設(shè)計一個由若干個段落構(gòu)成的一個頁面。我們需要設(shè)置margin-top和margin-bottom使得第一段和頁面的最上方有一段距離,使得最后一段和最下方有一段距離。下面是不疊加和疊加的效果圖:
我們可以看到左邊的頁面沒有重疊,那么兩個段落之間的舉例就是最上方的兩倍間距了,而右邊的頁面發(fā)生了重疊,則所有的間距都是相等的?;蛟S這就是這樣設(shè)定標(biāo)準(zhǔn)的目的吧,誰知道呢?
第三部分:margin--在父元素和子元素之間應(yīng)用(重點)
第二部分介紹了同級元素之間使用margin,而這一部分將要介紹最有意思的父元素和子元素之間margin的應(yīng)用。這一部分,我們同樣從兩個方面來討論。一方面是子元素設(shè)置水平方向上的margin值,另一方面是子元素設(shè)置豎直方向的margin值。
(1)在子元素中設(shè)置水平方向的margin值
我們可以設(shè)置margin-left來控制子元素的左邊框和父元素的左邊框之間的舉例。
例3:
margin 寬度為100px,margin-left為100px。
我將子元素的margin-left設(shè)置為了100px;效果如下:
即子元素的左邊框和父元素的左邊框之間的距離為100px。與在同級元素之間設(shè)置margin不同,因為同級元素之間的margin不會考慮到padding,但是在父元素和子元素就不同了,那么如果父元素中如果有padding,效果會是什么樣的呢?請看下面一個例子:
例4:
下面我們在上面例子的基礎(chǔ)上給父元素添加padding值。
margin 寬度為100px,margin-left為100px。
上面的代碼給父元素添加了100px的padding值,效果如下:
我們可以看到子元素舉例上方的距離為100px,因為子元素一定是在父元素的content的部分的,這點毫無疑問。
但是經(jīng)過測量可以發(fā)現(xiàn)子元素的左邊框距離父元素的左邊框之間的距離為200px,因為其中還有100px的左padding值,前面的例子因為我沒有設(shè)置padding值,所以沒有觀察出來,因此這就說明了在子元素中設(shè)置margin-left,其值實際上是子元素的左邊框距離父元素左padding內(nèi)側(cè)的距離。
例5:margin-right的使用和margin-left的使用是相似的,我在這里只舉一個例子。
這個例子在子元素中設(shè)置了margin-right值,如下所示:
margin 寬度為100px,margin-right為100px。
這個例子與例4的區(qū)別僅在與子元素的位置不同。效果如下:
通過這個例子可以說明margin-right的值是子元素的右邊框和父元素的右padding內(nèi)側(cè)的距離。只是前面的幾個例子我沒有使用padding,所以無法觀察出來。
(2)在子元素中設(shè)置豎直方向的margin值
按照前面的經(jīng)驗,理論上來說,我們同樣可以通過設(shè)置margin-top的值使得子元素的上邊框和父元素的上padding的內(nèi)側(cè)留有一定的距離。那么我們就試試吧!
例6:
margin 高度為100px,margin-top為100px。
這個例子我設(shè)置了margin-top為100px,效果如下:
這并不是我們想要的效果啊,我們希望子元素的上部距離父元素的上部為100px,可是我們看到的卻是父元素的上部距離瀏覽器頁面的上部有100px的距離,這是為什么呢?哪里出現(xiàn)問題了呢?
實際上這是因為當(dāng)父元素沒有設(shè)置padding值以及border值時,出現(xiàn)了一個bug--父元素的上方與子元素的上方完全重合在了一起,無法分開。所以才會導(dǎo)致上述這種父元素和子元素同時向下的情況。
對于這種問題解決方法有下面幾種:
方法一:給父元素添加padding-top值
方法二:給父元素添加border值
方法三:給父元素添加屬性overflow:hidden;
方法四:給父元素或者子元素聲明浮動float
方法五:使父元素或子元素聲明為絕對定位:position:absolute;
方法六:給父元素添加屬性 overflow:auto; positon:relative;(注:此方法為后續(xù)添加,感謝博友@小精靈Pawn提供此方法)
方法一:基于例6,在父元素的css代碼中添加padding-top:1px;效果如下:
方法的唯一缺點就是增加了1px的誤差。
方法二:基于例6,在父元素的css代碼中添加border-top:1px solid transparent;效果如下:
同樣達(dá)到了效果, 缺點同方法一。
方法三:基于例6,在父元素的css代碼中添加overflow:hidden;效果如下:
同樣達(dá)到了效果,并且沒有任何誤差的存在??胺Qperfect!!!!
方法四:給父元素或者子元素聲明float;基于例6,在子元素css代碼添加float:left;或者在父元素css代碼添加float:left;均達(dá)到效果,這里不再展示相同的圖片。
優(yōu)點:沒有像素的誤差。 缺點:float有時是不必要的。
方法五:給父元素或者子元素添加position:absolute;屬性。 同樣達(dá)到效果。
優(yōu)點:同方法四。 且只要我們不使用top和left也不會有任何影響,所以這也是一種不錯的方法。
方法六:給父元素添加overflow:auto;和position:relative;同樣達(dá)到效果。
第四部分:margin值的單位為%時的幾種情況
之前我舉例子時使用margin,它的值都是以px為單位的,這個理解起來沒有問題。但是如果margin值是以%為單位呢?實際上這時候百分比(%)是相對于該元素的父元素(容器),對于同級元素和父子元素都是如此。(再次感謝 博友@小精靈Pawn 提供的建議!!基于此建議補充這部分內(nèi)容) 但是在同級元素中使用豎直方向的margin時會出現(xiàn)意想不到的結(jié)果,下面舉例說明。
(1)同級元素在水平方向使用值為%的margin
例7:
margin 寬為200,無margin寬為200,margin-left為20%;