溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

css中的margin屬性有什么用

發(fā)布時(shí)間:2021-09-14 11:13:37 來源:億速云 閱讀:151 作者:小新 欄目:web開發(fā)

這篇文章給大家分享的是有關(guān)css中的margin屬性有什么用的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

第一部分:margin--基礎(chǔ)知識

要介紹margin的基礎(chǔ)知識,我們不可回避地要談到css盒子模型(Box Model),一般而言,css盒子模型是用來設(shè)計(jì)和布局的。它本質(zhì)上是一個(gè)盒子,包括:外邊距(margin)、邊框(border)、內(nèi)邊距(padding)以及最中間的內(nèi)容(content)。下圖即為盒子模型(這里只談W3C規(guī)范的標(biāo)準(zhǔn)盒模型,而不談IE5和IE6在怪異模式中使用的非標(biāo)準(zhǔn)的盒子模型):

css中的margin屬性有什么用

 我們要介紹的margin在最外層,因?yàn)閙argin(外邊距)一定是透明的,所以它可以用來使得不同的盒子之間留有一定的間隙從而達(dá)到布局美觀等效果。從上面的盒子模型中我們可以看到,margin在四周均存在,我們可以使用margin-top、margin-right、margin-bottom、margin-left分別設(shè)置這四個(gè)方向的margin值。(注:由于這部分知識較為基礎(chǔ),所以我不再在這部分不做更多介紹)

 第二部分:margin--在同級元素(非父子關(guān)系)之間應(yīng)用

這一部分主要介紹水平方向和豎直方向的外邊距的合并問題。

(1)水平方向的外邊距合并

兩個(gè)水平方向的盒子相遇,那么最終兩者之間的距離為左邊盒子的右外邊距和右邊盒子的做外邊距之和。

 例1:

代碼如下:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>水平方向的兩個(gè)盒子</title>

    <style>

        *{

            margin:0;

            padding:0;

            border:0;

        }

        body{

            font-size: 0;

        }

        .left{

            width: 100px;

            height: 100px;

            background: red;

            display: inline-block;

            margin-right: 50px;

            font-size: 20px;

        }

        .right{

            width: 100px;

            height: 100px;

            background: yellow;

            display: inline-block;

            margin-left: 50px;

            font-size: 20px;

        }

    </style>

</head>

<body>

    <div class="left">寬為100px,右邊距為50px</div>

    <div class="right">寬為100px,左邊距為50px</div>

</body>

</html>

效果如下:

css中的margin屬性有什么用

這時(shí)兩者之間的距離剛好為100px。

補(bǔ)充說明:大家可以看到,為了使得兩個(gè)div(塊狀元素)脫離正常的文檔流我使用了display:inline-block;屬性,另外,我還把body的font-size設(shè)置為0,這樣可以解決inline-block自身的問題,否則兩個(gè)div的舉例會大于100px。當(dāng)然使用float也可以使得兩個(gè)div出現(xiàn)在同一行中。

(2)豎直方向的外邊距合并

兩個(gè)豎直方向的盒子相遇時(shí),其豎直方向的距離等于上方盒子的下外邊距和下方盒子的上外邊距中較大的一個(gè)。

例2:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>水平方向的兩個(gè)盒子</title>

    <style>

        *{

            margin:0;

            padding:0;

            border:0;

        }

        .top{

            width: 100px;

            height: 100px;

            margin-bottom: 100px;

            background: red;

        }

        .bottom{

            width: 100px;

            height: 100px;

            margin-top: 50px;

            background: green;

        }

    </style>

</head>

<body>

    <div class="top">高為100px,下邊距為100px</div>

    <div class="bottom">高為100px,上邊距為50px</div>

</body>

</html>

效果如下:

css中的margin屬性有什么用

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

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

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>水平方向的兩個(gè)盒子</title>

    <style>

        *{

            margin:0;

            padding:0;

        }

 

        .top{

            width: 500px;

            height: 100px;

            background: red;

        }

        .middle{

            margin-top: 100px;

            margin-bottom:50px;

        }

        .footer{

            width: 500px;

            height: 100px;

            background: green;

        }

 

    </style>

</head>

<body>

    <div class="top">上面的div,高100px</div>

    <div class="middle"></div>

    <div class="footer">下面的div,高100px</div>

</body>

</html>

最終的效果如下:

css中的margin屬性有什么用

我們發(fā)現(xiàn)這時(shí)在上面的div和在下面的div之間的舉例并不是100+50=150px,而是兩者中的最大者,即100px。

那么W3C為什么會設(shè)定這樣的標(biāo)準(zhǔn)而不設(shè)定和水平方向一樣的標(biāo)準(zhǔn)呢?即margin值的疊加,實(shí)際上這也是有一定的道理的。比如我們需要設(shè)計(jì)一個(gè)由若干個(gè)段落構(gòu)成的一個(gè)頁面。我們需要設(shè)置margin-top和margin-bottom使得第一段和頁面的最上方有一段距離,使得最后一段和最下方有一段距離。下面是不疊加和疊加的效果圖:

css中的margin屬性有什么用

我們可以看到左邊的頁面沒有重疊,那么兩個(gè)段落之間的舉例就是最上方的兩倍間距了,而右邊的頁面發(fā)生了重疊,則所有的間距都是相等的。或許這就是這樣設(shè)定標(biāo)準(zhǔn)的目的吧,誰知道呢?

第三部分:margin--在父元素和子元素之間應(yīng)用(重點(diǎn))

第二部分介紹了同級元素之間使用margin,而這一部分將要介紹最有意思的父元素和子元素之間margin的應(yīng)用。這一部分,我們同樣從兩個(gè)方面來討論。一方面是子元素設(shè)置水平方向上的margin值,另一方面是子元素設(shè)置豎直方向的margin值。

(1)在子元素中設(shè)置水平方向的margin值

我們可以設(shè)置margin-left來控制子元素的左邊框和父元素的左邊框之間的舉例。

例3:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>margin</title>

    <style>

        *{padding:0; margin:0; border:0;}

        .father{

            width: 500px;

            height: 500px;

            background: red;

        }

        .son{

            width: 100px;

            height: 100px;

            background: green;

            margin-left: 100px;

        }

    </style>

</head>

<body>

    <div class="father">

        <div class="son">寬度為100px,margin-left為100px。</div>

    </div>

</body>

</html>

我將子元素的margin-left設(shè)置為了100px;效果如下:

css中的margin屬性有什么用

即子元素的左邊框和父元素的左邊框之間的距離為100px。與在同級元素之間設(shè)置margin不同,因?yàn)橥壴刂g的margin不會考慮到padding,但是在父元素和子元素就不同了,那么如果父元素中如果有padding,效果會是什么樣的呢?請看下面一個(gè)例子:

例4:

下面我們在上面例子的基礎(chǔ)上給父元素添加padding值。

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>margin</title>

    <style>

        *{padding:0; margin:0; border:0;}

        .father{

            width: 500px;

            height: 500px;

            padding:100px;

            background: red;

        }

        .son{

            width: 100px;

            height: 100px;

            background: green;

            margin-left: 100px;

        }

    </style>

</head>

<body>

    <div class="father">

        <div class="son">寬度為100px,margin-left為100px。</div>

    </div>

</body>

</html>

上面的代碼給父元素添加了100px的padding值,效果如下:

css中的margin屬性有什么用

我們可以看到子元素舉例上方的距離為100px,因?yàn)樽釉匾欢ㄊ窃诟冈氐腸ontent的部分的,這點(diǎn)毫無疑問。

但是經(jīng)過測量可以發(fā)現(xiàn)子元素的左邊框距離父元素的左邊框之間的距離為200px,因?yàn)槠渲羞€有100px的左padding值,前面的例子因?yàn)槲覜]有設(shè)置padding值,所以沒有觀察出來,因此這就說明了在子元素中設(shè)置margin-left,其值實(shí)際上是子元素的左邊框距離父元素左padding內(nèi)側(cè)的距離。

例5:margin-right的使用和margin-left的使用是相似的,我在這里只舉一個(gè)例子。

這個(gè)例子在子元素中設(shè)置了margin-right值,如下所示:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>margin</title>

    <style>

        *{padding:0; margin:0; border:0;}

        .father{

            width: 500px;

            height: 500px;

            padding:100px;

            background: red;

        }

        .son{

            float: right;

            width: 100px;

            height: 100px;

            background: green;

            margin-right: 100px;

        }

    </style>

</head>

<body>

    <div class="father">

        <div class="son">寬度為100px,margin-right為100px。</div>

    </div>

</body>

</html>

這個(gè)例子與例4的區(qū)別僅在與子元素的位置不同。效果如下:

css中的margin屬性有什么用

通過這個(gè)例子可以說明margin-right的值是子元素的右邊框和父元素的右padding內(nèi)側(cè)的距離。只是前面的幾個(gè)例子我沒有使用padding,所以無法觀察出來。

(2)在子元素中設(shè)置豎直方向的margin值

按照前面的經(jīng)驗(yàn),理論上來說,我們同樣可以通過設(shè)置margin-top的值使得子元素的上邊框和父元素的上padding的內(nèi)側(cè)留有一定的距離。那么我們就試試吧!

例6:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>margin</title>

    <style>

        *{padding:0; margin:0; border:0;}

        .father{

            width: 500px;

            height: 500px;

            background: red;

        }

        .son{

            width: 100px;

            height: 100px;

            background: green;

            margin-top: 100px;

        }

    </style>

</head>

<body>

    <div class="father">

        <div class="son">高度為100px,margin-top為100px。</div>

    </div>

</body>

</html>

這個(gè)例子我設(shè)置了margin-top為100px,效果如下:

css中的margin屬性有什么用

這并不是我們想要的效果啊,我們希望子元素的上部距離父元素的上部為100px,可是我們看到的卻是父元素的上部距離瀏覽器頁面的上部有100px的距離,這是為什么呢?哪里出現(xiàn)問題了呢?

實(shí)際上這是因?yàn)楫?dāng)父元素沒有設(shè)置padding值以及border值時(shí),出現(xiàn)了一個(gè)bug--父元素的上方與子元素的上方完全重合在了一起,無法分開。所以才會導(dǎo)致上述這種父元素和子元素同時(shí)向下的情況。

對于這種問題解決方法有下面幾種:

  • 方法一:給父元素添加padding-top值

  • 方法二:給父元素添加border值

  • 方法三:給父元素添加屬性overflow:hidden;

  • 方法四:給父元素或者子元素聲明浮動float

  • 方法五:使父元素或子元素聲明為絕對定位:position:absolute;

  • 方法六:給父元素添加屬性 overflow:auto; positon:relative;(注:此方法為后續(xù)添加,感謝博友@小精靈Pawn提供此方法)

方法一:基于例6,在父元素的css代碼中添加padding-top:1px;效果如下:

css中的margin屬性有什么用

 方法的唯一缺點(diǎn)就是增加了1px的誤差。

方法二:基于例6,在父元素的css代碼中添加border-top:1px solid transparent;效果如下:

css中的margin屬性有什么用

同樣達(dá)到了效果, 缺點(diǎn)同方法一。

方法三:基于例6,在父元素的css代碼中添加overflow:hidden;效果如下:

css中的margin屬性有什么用

同樣達(dá)到了效果,并且沒有任何誤差的存在??胺Qperfect!!!!

方法四:給父元素或者子元素聲明float;基于例6,在子元素css代碼添加float:left;或者在父元素css代碼添加float:left;均達(dá)到效果,這里不再展示相同的圖片。

優(yōu)點(diǎn):沒有像素的誤差。   缺點(diǎn):float有時(shí)是不必要的。

方法五:給父元素或者子元素添加position:absolute;屬性。 同樣達(dá)到效果。

優(yōu)點(diǎn):同方法四。  且只要我們不使用top和left也不會有任何影響,所以這也是一種不錯(cuò)的方法。

方法六:給父元素添加overflow:auto;和position:relative;同樣達(dá)到效果。

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

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

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

例7:

<head>

    <meta charset="UTF-8">

    <title>margin</title>

    <style>

        *{

            margin:0;

            padding:0;

        }

        .first{

            float: left;

            width: 200px;

            height: 200px;

            background: green;

        }

        .second{

            float: left;

            width: 200px;

            height: 200px;

            background: red;

            margin-left: 20%;

        }

    </style>

</head>

<body>

    <div class="first">寬為200,無margin</div>

    <div class="second">寬為200,margin-left為20%;</div>

</body>

</html>

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

css中的margin屬性有什么用

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

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

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

例8

<head>

    <meta charset="UTF-8">

    <title>margin</title>

    <style>

        *{

            margin:0;

            padding:0;

        }

        .first{

            width: 200px;

            height: 200px;

            background: green;

        }

        .second{

            width: 200px;

            height: 200px;

            background: red;

            margin-top: 10%;

        }

    </style>

</head>

<body>

    <div class="first">高為200,無margin</div>

    <div class="second">高為200,margin-top為20%;</div>

</body>

</html>

這里設(shè)置上面的div無margin,下面的div的margin-top為10。效果如下:

css中的margin屬性有什么用

我們發(fā)現(xiàn),當(dāng)我在縮小瀏覽器的高度時(shí),豎直方向上的間距并沒有縮?。。?! 而當(dāng)我縮小瀏覽器的寬度時(shí),豎直方向上的距離縮小了?。?!

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

那么這里為什么不是如我們所希望的那樣相對于瀏覽器的高度呢?知乎上有大神是這樣解釋的:

css中的margin屬性有什么用

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

對于父子元素,如果在子元素中使用單位為%margin,那么這個(gè)margin值是相對于父元素的寬度和高度(注意:這時(shí)的確是相對于父元素的高度?。┑?。

例9 

代碼如下:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Document</title>

    <style>

        *{

            margin:0;

            padding:0;

        }

        .father{

            width: 500px;

            height: 300px;

            background: red;

            overflow: hidden;

        }

        .son{

            width: 100px;

            height: 100px;

            background: green;

            margin-top: 20%;

            margin-left: 20%;

        }

    </style>
</head>

<body>

    <div class="father">

        <div class="son"></div>

    </div>

</body>

</html>

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

css中的margin屬性有什么用

從上圖可以看出子元素的margin-top值最終同樣是相對與父元素的寬度而非高度。

感謝各位的閱讀!關(guān)于“css中的margin屬性有什么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

css
AI