CSS理解之margin

1.margin與百分比單位

Paste_Image.png
Paste_Image.png

2.margin重疊

margin重疊通常特性:

  • 只發(fā)生在block水平元素(例如:p揽思、div、list验残、item標(biāo)簽.....)
  • 只發(fā)生在垂直方向(margin-top/margin-bottom)

margin重疊三種情況:

  • 相鄰的兄弟元素
  • 父級(jí)和第一個(gè)/最后一個(gè)子元素
  • 空的block元素(自己和自己重疊)

demo 1:
1.相鄰兄弟元素margin重疊

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <style>
    p{
  line-height:2em;
  margin:1em 0;
  background:#f0f1f3;
}
  </style>
</head>
<body>
  <p>第一行</p>
  <p>第二行</p>
  </div>
</body>
</html>  

兄弟元素的上下margin發(fā)生了重疊

2.父級(jí)和第一個(gè)/最后一個(gè)子元素

demo 1:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <style>
    .father{
      height:200px;
      background:red;
    }
  </style>
</head>
<body>
  <div class="father">
    <div class="son">
      我是子元素
    </div>
  </div>
</body>
</html>
Paste_Image.png
當(dāng)我們?yōu)樽釉卦O(shè)置margin后:
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <style>
    .father{
      height:200px;
      background:red;
    }
    .son{
      margin-top:80px;
    }
  </style>
</head>
<body>
  <div class="father">
    <div class="son">
      我是子元素
    </div>
  </div>
</body>
</html>

Paste_Image.png

對(duì)最后的子元素設(shè)置的margin-top:80px五慈;等同于為父元素設(shè)置了margin-top:80px铺遂;(父元素的margin-top=0己肮,最后的子元素的margin-top=80px士袄,發(fā)生了外邊距重疊),也等同于他們兩個(gè)同時(shí)設(shè)置margin-top:80px谎僻;
Paste_Image.png

Paste_Image.png

inline元素(內(nèi)聯(lián)元素娄柳,像圖片、文字這樣的東西)
塊狀格式化上下文元素(BFC元素)

同樣可以利用父子margin重疊條件來(lái)去除margin重疊:

demo 2:

為父元素添加`overflow:hidden;`艘绍,使其變?yōu)闋罡袷交舷挛脑兀˙FC元素)

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <style>
    .father{
      height:200px;
      background:red;
     overflow:hidden;
    }
    .son{
      margin-top:80px;
    }
  </style>
</head>
<body>
  <div class="father">
    <div class="son">
      我是子元素
    </div>
  </div>
</body>
</html>
Paste_Image.png

demo 2 :

為父元素設(shè)置border-top:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <style>
    .father{
      height:200px;
      background:red;
      border:1px solid;
    }
    .son{
      margin-top:80px;
    }
  </style>
</head>
<body>
  <div class="father">
    <div class="son">
      我是子元素
    </div>
  </div>
</body>
</html>
Paste_Image.png

demo 2:

為父元素和第一個(gè)子元素之間添加一個(gè) (空格或文字赤拒、圖片等內(nèi)聯(lián)元素)inline元素

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <style>
    .father{
      height:200px;
      background:red;
    }
    .son{
      margin-top:80px;
    }
  </style>
</head>
<body>
  <div class="father">
     
    <div class="son">
      我是子元素
    </div>
  </div>
</body>
</html>
Paste_Image.png

去掉margin-bottom重疊與上面類似。

3.空的block元素margin重疊:

Paste_Image.png

空的block元素發(fā)生margin重疊,也需要一些條件限制:

Paste_Image.png

去掉空的block元素的margin重疊也是利用上面的條件:

Paste_Image.png

3.margin重疊的計(jì)算規(guī)則:

1挎挖、正正取大值:

Paste_Image.png

2这敬、正負(fù)值相加:

Paste_Image.png

3、負(fù)負(fù)最負(fù)值(取絕對(duì)值大的):

Paste_Image.png

3肋乍、理解CSS中的margin auto

首先理解margin atuo的作用機(jī)制 鹅颊,先看一些事實(shí)例子:

1.元素有時(shí)候,就算沒(méi)有設(shè)置width或height墓造,也會(huì)自動(dòng)填充外部容器

例1:

image.png

圖中是一個(gè)div元素,可以看到設(shè)置了背景色之后锚烦,它的寬度自動(dòng)填滿了它所在的容器觅闽。

例2:

image.png

我們?cè)O(shè)置左右定位值left:0; right:0;,它的寬度同樣自動(dòng)填充填滿了它所在的容器涮俄,只不過(guò)它的容器是它的第一個(gè)父級(jí)相對(duì)定位元素蛉拙。

以上兩個(gè)例子是比較常見(jiàn)的,沒(méi)有設(shè)置寬高也會(huì)自動(dòng)填充所在容器彻亲。

若剛才的兩個(gè)例子孕锄,如果設(shè)置了width或heigth,自動(dòng)填充特性就會(huì)被覆蓋苞尝。


上圖寬度從填滿整個(gè)所在的容器到寬度500px畸肆,這就產(chǎn)生了剩余空間,圖中的剩余空白部分空間width=整個(gè)容器寬度-500px宙址,而margin auto 就是 為了填充這個(gè)空白的尺寸設(shè)計(jì)的轴脐,這就是margin auto的作用。

image.png
image.png

總之一句話抡砂,auto就是用來(lái)分配大咱。

通過(guò)以上的例子,很多事情就很好理解了注益,比方說(shuō):

1.為什么圖片設(shè)置了margin:0 auto不水平居中碴巾?

image.png

如上圖,設(shè)置了margin auto丑搔,圖片為什么還是不居中呢厦瓢?
因?yàn)閳D片是inline水平的,它占據(jù)的空間并沒(méi)有撐滿整個(gè)容器低匙,如果沒(méi)有設(shè)置寬度值旷痕。所以它就不滿足margin auto 用來(lái)填充剩余空間的條件,因?yàn)樗揪蜎](méi)有剩余空間顽冶。要想讓它居中也很簡(jiǎn)單:

image.png

為圖片設(shè)置display:block屬性欺抗,這時(shí)就算沒(méi)有為圖片設(shè)置寬度,它也會(huì)占滿整個(gè)容器强重,這時(shí)候在設(shè)置margin auto 它就會(huì)自動(dòng)分配剩余空間绞呈。

2.為什么明明容器定高贸人,子元素也定高了,margin auto 0 無(wú)法垂直居中?

image.png

上圖水平方向劇中了佃声,但是垂直方向不劇中艺智,父級(jí)元素高度有了,子元素高度也有了圾亏,為什么還是不垂直居中呢十拣?

因?yàn)樗粷M足占滿整個(gè)容器這個(gè)條件,想一下志鹃,如果夭问,沒(méi)有為.son設(shè)置高度值,它之前滿足占滿整個(gè)容器這個(gè)條件嗎曹铃?很顯然不滿足缰趋,也就沒(méi)有剩余空間,所以設(shè)置height:100px margin auto不會(huì)垂直居中陕见。

還需要注意一點(diǎn):用margin:auto來(lái)實(shí)現(xiàn)居中秘血,它計(jì)算后的值必須是正直,比如說(shuō)你的父容器寬度1000px评甜,子元素寬度2000px灰粮,這時(shí)設(shè)置margin:auto它是不居中的。

那么如何實(shí)現(xiàn)垂直方向上的劇中呢蜕着,方法很多不止一種:

1.writing-mode與垂直居中:

image.png

更改流為垂直居中之后谋竖,內(nèi)容會(huì)自動(dòng)撐滿垂直方向的高度。這時(shí)寬度不會(huì)自動(dòng)撐滿容器承匣,所以寬度的水平居中就失效了蓖乘。

2.絕對(duì)定位元素實(shí)現(xiàn)垂直居中:

image.png

子元素設(shè)置了top:0;right:0;bottom:0;left:0;之后,沒(méi)有設(shè)置寬高韧骗,absolute元素也自動(dòng)填滿了容器嘉抒。

image.png

這時(shí)再設(shè)置寬高,自動(dòng)填充就會(huì)被覆蓋袍暴,如上圖所示些侍。這時(shí)上圖藍(lán)色旁邊的空間尺寸就是被強(qiáng)制更改的尺寸,也就是margin:auto可以用來(lái)分配的尺寸空間政模,此時(shí)在設(shè)置margin:auto空間就被重新分配了岗宣,從而就實(shí)現(xiàn)了絕對(duì)定位元素的水平和垂直居中效果。但是這個(gè)特性只有IE8+以上的瀏覽器才支持淋样。

image.png

4.CSS margin負(fù)值定位

1.margin負(fù)值下的兩端對(duì)齊(主要利用了margin可以改變?cè)爻叽邕@一特性:正直變小耗式,負(fù)值變大)

image.png

一個(gè)block水平元素,如果沒(méi)有設(shè)置寬度值,我們通過(guò)設(shè)置margin可以改變它的尺寸:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
  <style>
  .box{
    width:1200px;
    margin:auto;
    background:orange;
  }
  .ul{
    overflow:hidden;
    margin-right:-20px;
  }
  .li{
    width:386.66666px;height:300px;background:green;float:left;margin-right:20px;
  }
  </style>
</head>
<body>
  <div class="box">
    <div class="ul">
      <div class="li">列表1</div>
      <div class="li">列表2</div>
      <div class="li">列表3</div>
    </div>
  </div>
</body>
</html>

由于<div class="ul"></div>沒(méi)有設(shè)置寬度刊咳,所以設(shè)置了margin-right:-20px;后彪见,改變了它的寬度,增大了20px娱挨,變?yōu)?220px余指。這時(shí)我們?cè)侔?code>li的寬度設(shè)置為計(jì)算好的386.66666px,就可以實(shí)現(xiàn)沒(méi)有間隙的兩端對(duì)齊跷坝。主要利用了margin負(fù)值增加它的空間酵镜。

image.png
image.png

5.CSS margin失效情形解析

  1. inline水平元素的垂直margin無(wú)效,前提:
  • inline水平元素是非替換元素柴钻,例如笋婿,不是<img>元素;
  • 正常書寫模式顿颅,是正常的流(不是writing-mode這種重置它的書寫模式)

demo:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        
    </style>
</head>
<body>
    <span style="margin:233px;">margin: 0px;</span>
</body>
</html>

可以看出它的垂直方向是沒(méi)有margin的,是無(wú)效的足丢。

2.第二種常見(jiàn)的無(wú)效是margin重疊粱腻,比如你設(shè)置了margin-top當(dāng)發(fā)現(xiàn)沒(méi)有效果,這就是margin重疊帶來(lái)的影響斩跌。

3.display:table-cell與margin

MDN:margin可以應(yīng)用于任何元素绍些,除了display為table的相關(guān)類型(不包括table-caption,table以及inline-table)耀鸦。
換句話說(shuō)柬批,如果這個(gè)元素的display屬性是table-cell/table-row等類似這樣的表格相關(guān)的聲明,它的margin是無(wú)效的袖订。

demo:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .table-cell{
            display: table-cell;
            margin: 100px;
        }
    </style>
</head>
<body>
    <span class="table-cell">span.table-cell</span>
    <div>
       <div class="table-cell">div.table-cell</div> 
    </div>
    
</body>
</html>
Paste_Image.png

可以看出設(shè)置的margin是無(wú)效的氮帐。

但是對(duì)替換元素設(shè)置table-cell是可以發(fā)生作用的,但平時(shí)我們不會(huì)給替換元素設(shè)置table-cell洛姑,這是沒(méi)有任何意義的上沐,所以記住這點(diǎn)就行。

4.position:absolute與margin楞艾,絕對(duì)定位元素非定位方向的margin值“無(wú)效”参咙,定位方向的margin值是有效的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末硫眯,一起剝皮案震驚了整個(gè)濱河市蕴侧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌两入,老刑警劉巖净宵,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡塘娶,警方通過(guò)查閱死者的電腦和手機(jī)归斤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)刁岸,“玉大人脏里,你說(shuō)我怎么就攤上這事『缡铮” “怎么了迫横?”我有些...
    開(kāi)封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)酝碳。 經(jīng)常有香客問(wèn)我矾踱,道長(zhǎng),這世上最難降的妖魔是什么疏哗? 我笑而不...
    開(kāi)封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任呛讲,我火速辦了婚禮犯犁,結(jié)果婚禮上须尚,老公的妹妹穿的比我還像新娘。我一直安慰自己怠堪,他們只是感情好芽偏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布雷逆。 她就那樣靜靜地躺著,像睡著了一般污尉。 火紅的嫁衣襯著肌膚如雪膀哲。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天被碗,我揣著相機(jī)與錄音某宪,去河邊找鬼。 笑死蛮放,一個(gè)胖子當(dāng)著我的面吹牛缩抡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播包颁,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瞻想,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了娩嚼?” 一聲冷哼從身側(cè)響起蘑险,我...
    開(kāi)封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岳悟,沒(méi)想到半個(gè)月后佃迄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體泼差,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年呵俏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堆缘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡普碎,死狀恐怖吼肥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情麻车,我是刑警寧澤缀皱,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站动猬,受9級(jí)特大地震影響啤斗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赁咙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一钮莲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧彼水,春花似錦臂痕、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)姆怪。三九已至叛赚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稽揭,已是汗流浹背俺附。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留溪掀,地道東北人事镣。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像揪胃,于是被迫代替她去往敵國(guó)和親璃哟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 問(wèn)答題47 /72 常見(jiàn)瀏覽器兼容性問(wèn)題與解決方案喊递? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,753評(píng)論 1 92
  • 收聽(tīng)音頻,戳鏈接,舊號(hào)itclan已暫停使用,歡迎關(guān)注微信itclanCoder公眾號(hào)可收聽(tīng)更多音頻 前言 關(guān)于網(wǎng)...
    itclanCoder閱讀 8,179評(píng)論 3 30
  • 前言 溫馨提示:本文較長(zhǎng)随闪,圖片較多,本來(lái)是想寫一篇 CSS 布局方式的骚勘,但是奈何 CSS 布局方式種類太多并且實(shí)現(xiàn)...
    sunshine小小倩閱讀 3,139評(píng)論 0 59
  • relative:生成相對(duì)定位的元素铐伴,通過(guò)top,bottom,left,right的位置相對(duì)于其正常位置進(jìn)行定位...
    zx9426閱讀 943評(píng)論 0 2
  • 讓我追悔少年時(shí)代撮奏,我心靈的愚鈍和無(wú)知。 它輕易的錯(cuò)過(guò)了当宴,我一生中本可以擁有的快樂(lè)和幸福畜吊。 ...
    栗子_栗子閱讀 897評(píng)論 4 9