成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

深入理解css中的margin屬性(最新瀏覽器支持)

bingo / 2347人閱讀

摘要:豎直方向的外邊距合并兩個豎直方向的盒子相遇時,其豎直方向的距離等于上方盒子的下外邊距和下方盒子的上外邊距中較大的一個。

本文啟發(fā)于博客園一篇2016年的“深入理解css中的margin屬性”文章,根據(jù)當(dāng)前瀏覽器(
chrome 71.0.3578.98(正式版本) (64 位)),加上自己的理解,每個例子都是親測過

這篇博文主要分為以下幾個部分:

margin--基礎(chǔ)知識
margin--在同級元素(非父子關(guān)系)之間應(yīng)用
margin--在父元素和子元素之間應(yīng)用(重點)
margin--margin值的單位為%時的幾種情況

第一部分: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。

補(bǔ)充說明:大家可以看到,為了使得兩個div(塊狀元素)脫離正常的文檔流我使用了display:inline-block;屬性,另外,我還把body的font-size設(shè)置為0,這樣可以解決inline-block自身的問題(如果不清楚這里的描述可以看我的博文《理解與應(yīng)用css中的display屬性》,這篇文章介紹了inline-block存在的問題),否則兩個div的舉例會大于100px。當(dāng)然使用float也可以使得兩個div出現(xiàn)在同一行中。

####(2)豎直方向的外邊距合并
  兩個豎直方向的盒子相遇時,其豎直方向的距離等于上方盒子的下外邊距和下方盒子的上外邊距中較大的一個。

  例2:代碼如下:

 `


水平方向的兩個盒子


高為100px,下邊距為100px
高為100px,上邊距為50px


  效果如下:


![clipboard.png](/img/bVbnQFi)


**這時我們?nèi)庋鄱伎梢杂^察出來,兩者豎直方向的舉例大約為100px(實際就是100px)而非100+50=150px;這正是因為兩個豎直方向的盒子相遇時,其豎直方向的距離等于上方盒子的下外邊距和下方盒子的上外邊距中較大的一個。**

  另外一個有趣的例子就是:假設(shè)有一個元素同時設(shè)置了margin-top和margin-bottom,但是內(nèi)容為空,那么這兩個margin值也會疊加,值為兩者最大的一個,它類似與豎直方向上兩個盒子margin值的疊加。代碼如下:




水平方向的兩個盒子


上面的div,高100px


  最終的效果如下:


![clipboard.png](/img/bVbnQFs)


  **我們發(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使得第一段和頁面的最上方有一段距離,使得最后一段和最下方有一段距離。下面是不疊加和疊加的效果圖:

![clipboard.png](/img/bVbnQFM)

我們可以看到左邊的頁面沒有重疊,那么兩個段落之間的舉例就是最上方的兩倍間距了,而右邊的頁面發(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;效果如下:

![clipboard.png](/img/bVbnQFU)


即子元素的左邊框和父元素的左邊框之間的距離為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,或者overflow:auto;
方法四:給父元素或者子元素聲明浮動float
方法五:使父元素或子元素聲明為絕對定位:position:absolute;

方法一:基于例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也不會有任何影響,所以這也是一種不錯的方法。

上述方法三、四、五實際上都是去除子元素margin穿透父容器的方法,可以歸類為bfc法,本質(zhì)相同。

第四部分:margin值的單位為%時的幾種情況

 之前我舉例子時使用margin,它的值都是以px為單位的,這個理解起來沒有問題。但是如果margin值是以%為單位呢?實際上這時候百分比(%)是相對于該元素的父元素(容器),對于同級元素和父子元素都是如此。(再次感謝 博友@小精靈Pawn 提供的建議?。』诖私ㄗh補(bǔ)充這部分內(nèi)容) 但是在同級元素中使用豎直方向的margin時會出現(xiàn)意想不到的結(jié)果,下面舉例說明。

(1)同級元素在水平方向使用值為%的margin

  例7:



    
    margin
    


    
寬為200,無margin
寬為200,margin-left為20%;

這個例子中,設(shè)置兩個元素向左浮動,以便于觀察兩者水平方向的margin。其中左邊div無margin,右邊div的margin-left為20%,效果如下:

從效果圖可以看出兩個div之間的間距始終為父元素(這里右邊div的父元素即為body,其寬度為瀏覽器寬度)的20%。

(2)同級元素在豎直方向使用值為%的margin

   根據(jù)例7的啟發(fā),我們可以猜想,如果在豎直方向上使用margin,且值的單位為%,那么最終兩者之間的距離將是父元素(上例中為body)的百分?jǐn)?shù)。那么究竟是不是這樣呢?看下面的例子。

例8



    
    margin
    


    
高為200,無margin
高為200,margin-top為20%;

這里設(shè)置上面的div無margin,下面的div的margin-top為10。
我們發(fā)現(xiàn),當(dāng)我在縮小瀏覽器的高度時,豎直方向上的間距并沒有縮小?。。?而當(dāng)我縮小瀏覽器的寬度時,豎直方向上的距離縮小了?。?!

這就說明:統(tǒng)計元素之間在豎直方向上使用margin,當(dāng)值的單位為%時,它是相對于父元素的寬度。

  那么這里為什么不是如我們所希望的那樣相對于瀏覽器的高度呢?知乎上有大神是這樣解釋的(原文地址:https://www.zhihu.com/questio...):

(3)父子元素使用值為%的margin

  對于父子元素,如果在子元素中使用單位為%margin,那么這個margin值是相對于父元素的寬度和高度的。

例9 代碼如下:




    
    Document
    


    

在這個例子中,我設(shè)置了margin-left的值為20%,margin-top的值為20%,父元素的width為500px,父元素的height為300px。下面看看效果吧。

從上圖可以看出子元素的margin-top值最終同樣是

  

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/117303.html

相關(guān)文章

  • 深入理解css中的margin屬性最新覽器支持

    摘要:豎直方向的外邊距合并兩個豎直方向的盒子相遇時,其豎直方向的距離等于上方盒子的下外邊距和下方盒子的上外邊距中較大的一個。 本文啟發(fā)于博客園一篇2016年的深入理解css中的margin屬性文章,根據(jù)當(dāng)前瀏覽器(chrome 71.0.3578.98(正式版本) (64 位)),加上自己的理解,每個例子都是親測過 這篇博文主要分為以下幾個部分: margin--基礎(chǔ)知識margin--在同...

    pingan8787 評論0 收藏0
  • CSS世界(文檔)

    摘要:整理完了高性能這本書,往下就需要快速處理世界,這本講解特性的書非常值得一讀,內(nèi)容完整,重點突出,實戰(zhàn)性強(qiáng),就是語言啰嗦。由于全書內(nèi)容太多,而且需要一點一點的整理,所以放到了站點上,方便大家查看。 整理完了《高性能JavaScript》這本書,往下就需要快速處理《CSS世界》,這本講解CSS特性的書非常值得一讀,內(nèi)容完整,重點突出,實戰(zhàn)性強(qiáng),就是語言啰嗦。由于全書內(nèi)容太多,而且需要一點一...

    CNZPH 評論0 收藏0
  • css世界》- 詳細(xì)重點筆記與技巧

    摘要:概述在世界這本書中有一些黑魔法給列舉出來,在結(jié)合自己的理解。篇幅有點長,希望大家能夠堅持看完,一定會有收獲以下是摘自每章內(nèi)一些重要的概念與技巧。 概述 在《css世界》這本書中有一些黑魔法給列舉出來,在結(jié)合自己的理解。篇幅有點長,希望大家能夠堅持看完,一定會有收獲!?。∫韵率钦悦空聝?nèi)一些重要的概念與技巧。其中有解決圖片間隙的問題、小圖標(biāo)與文字居中問題等; ps: 特別是 line-h...

    MasonEast 評論0 收藏0
  • css世界》- 詳細(xì)重點筆記與技巧

    摘要:概述在世界這本書中有一些黑魔法給列舉出來,在結(jié)合自己的理解。篇幅有點長,希望大家能夠堅持看完,一定會有收獲以下是摘自每章內(nèi)一些重要的概念與技巧。 概述 在《css世界》這本書中有一些黑魔法給列舉出來,在結(jié)合自己的理解。篇幅有點長,希望大家能夠堅持看完,一定會有收獲!??!以下是摘自每章內(nèi)一些重要的概念與技巧。其中有解決圖片間隙的問題、小圖標(biāo)與文字居中問題等; ps: 特別是 line-h...

    趙連江 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<