亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > CSS > 正文

細說CSS中margin屬性的使用

2024-07-11 09:06:58
字體:
來源:轉載
供稿:網友
這篇文章和大家詳細說一說CSS中margin屬性的使用,重點描述了關于margin,我們日常不太容易發現的“坑,感興趣的小伙伴們可以參考一下
 
 

本文著重描述關于 margin,我們日常不太容易發現的“坑”。

盒模型

接觸過 CSS 的人應該都知道 CSS 的盒模型:

細說CSS中margin屬性的使用

由內容邊緣(Content edge)包圍形成的是內容盒(Content Box),類推還有內邊距盒(Padding Box)、邊框盒(Border Box)、外邊距盒(Margin Box)。
其中內容盒、內邊距盒、邊框盒的背景由background屬性決定,而外邊距盒的背景是透明的。

CSS margin 屬性

關于 margin 屬性,有幾點可能跟我們的直覺不相符:

1、如果 margin 的值是百分比,則是相對于父元素的內容盒寬度來計算的,即使 margin-top 和 margin-bottom 也是如此。因此即使父元素的高寬不相等,子元素的 margin 元素指定了相同的百分比值,則子元素各個方向的 margin 計算值都是相等的。
2、margin-top 和 margin-bottom 值對行內非替換元素(non-replaced inline element)是無效的。因此我們可以指定 img 元素的 margin-top 和 margin-bottom,而非替換行內元素(如 i,span 等)設置 margin-top 和 margin-bottom 卻不會產生效果。

相鄰的 margin(Adjoining margin)

如果兩個垂直方向上的 margin,它們中間沒有其他垂直 margin,但它們之間不一定相接觸,我們就說這兩個 margin 是垂直毗連(vertical-adjacent)的,包括以下四種情況,滿足其中之一即可:

  • 父元素的 top margin 和第一個子元素的 top margin
    父元素的bottom margin 和最后一個子元素的 bottom margin
    元素的 bottom margin 和與這個元素相鄰的兄弟元素的 top margin
    如果一個元素,它沒有生成 BFC、沒有包含正常流的子元素、min-height是0、height是0或者 auto,則它的 top margin 和 bottom margin 也是垂直毗連的

如果兩個 margin 滿足以下三個條件,我們就說這兩個 margin 是相鄰(adjoining)的:

1、這兩個 margin 是垂直毗連的,即滿足上面四種情況之一
2、margin 的兩個元素都是正常流的塊級元素,并且在同一個 BFC 中
3、兩個 margin 之間沒有行盒(line box)、清除浮動后的空隙(clearance)、padding和 border

margin 折疊(Collapsing margins)

margin 折疊,即相鄰的 margin 有可能會被折疊成一個。

比如元素 #a 指定了 margin-bottom 為 10px,而它下方的元素 #b 指定了 margin-top 為 20px,如這樣:

細說CSS中margin屬性的使用

元素 #a 的 margin-bottom 和元素 #b 的margin-top 在位置上重疊了,它們之間的距離是 20px,即元素 #b 的 bottom margin 長度,這就是 margin 折疊現象。關于這個現象,可以這么理解:

margin 定義的是它與其他盒子之間的最小間距。其中元素 #a 指定了 margin-bottom 為 10px,就表明它下方的元素 #b 與它至少要有 10px 的距離,它指定的是一個最小值,因此實際的距離可以比這個大。

元素 #a 下方的元素 #b 也設置了 margin-top 為 20px,如果不折疊,則他們之間就有 30px 的距離。如果折疊成了一個 20px 的距離,則對元素 #a 來說,它的 margin-bottom 要求至少要有 10px 的距離,是滿足的,而對于元素 #b 來說,它的 margin-top 要求至少要有 20px 的距離,也是滿足的。

而 margin 折疊的存在,其實是為了可以在視覺上顯得更美觀,也更貼近設計師的預期。

margin 折疊規則

并不是所有的 margin 都可以折疊,需要滿足以下條件:

  • 垂直相鄰的 margin 才有可能折疊,水平 margin 永遠不折疊
    根元素(即 html 元素)的 margin 永遠不折疊
    如果一個元素,它的 top margin 和 bottom margin 是相鄰的,并且有清除浮動后的空隙(clearance),這個元素的 margin 可以跟兄弟元素的 margin 折疊,但是折疊后的 margin 不能跟父元素的 bottom margin 折疊。

需要注意的是,margin 并不是只能折疊一次,多個滿足要求的 margin 都可以進行折疊形成一個折疊后的 margin(collapsed margin)。
并且假如這個折疊后的 margin 是由 margin A 等折疊而來的,如果有 margin X 跟 margin A 是相鄰的,則我們也認為 margin X 跟這個折疊后的 margin 相鄰。

折疊后的 margin 大小

當兩個或者兩個以上的 margin 折疊后,margin 的值計算如下:

  • 如果 margin 都是正數,則取他們當中的最大值
    如果 margin 中有正有負,則取最大的正數加上最小的負數(如最大的 margin 是 20px,最小的 margin 是 -20px,則他們計算后的值是 0)
    如果 margin 中都是負數,則取他們當中的最小值

幾道思考題

浮動、定位元素的 margin 不會和其他任何元素的 margin 發生重疊,包括它的子元素。

這是因為浮動元素脫離了正常流,所以它和其他相鄰元素就不處與同一個流中,自然不相鄰;又因為浮動元素的內容盒會形成一個新的 BFC,所以浮動元素跟子元素不處與同一個 BFC 中,因此它們的 margin 也不能折疊。定位元素同理可得。

inline-block 的元素不會和其他元素的 margin 發生折疊,包括它的子元素。

因為 margin 折疊只會發生在塊級元素上,因此 inline-block 元素的 margin 不會和兄弟元素折疊,又因為 inline-block 的內容盒會形成一個新的 BFC,所以 inline-block 元素本身也不會和子元素的 margin 發生折疊

margin 折疊的幾個栗子

栗子1

如果兩個 margin 滿足以下三個條件,我們就說這兩個 margin 是相鄰(adjoining)的:

兩個 margin 之間沒有行盒(line box)、清除浮動后的空隙(clearance)、padding和邊框

針對這個條件,我們通過增加 padding 的方式來阻止 margin 的折疊:

細說CSS中margin屬性的使用

如果 #container 沒有下邊框,則 #container 的 bottom margin 和 #inner 的 bottom margin 是相鄰的,因此它們折疊了,并且 #inner 撐開了 #container 元素,所以可以看到 #container 元素的高度變成了 10px,且顯示的是 #inner 的紅色背景

細說CSS中margin屬性的使用

當給 #container 添加一個下邊框,兩個 margin 之間就邊框的阻隔,他們就不相鄰了,因此不能折疊。所以可以看到 #container 被撐開成了 20px,其中 10px 是 #inner 的高度,還有 10px 是 #inner 的 bottom margin,并且由于 margin 是透明的,因此 #container 露出了部分藍色的背景。

栗子2:

如果兩個 margin 滿足以下三個條件,我們就說這兩個 margin 是相鄰(adjoining)的:

margin 的兩個元素都是正常流的塊級元素,并且在同一個 BFC 中

我們通過創建新的 BFC來阻止 margin 的折疊:

細說CSS中margin屬性的使用

如上圖 #container 元素和 #inner 元素同屬于一個 BFC 中,#container 的 top margin 和 #inner 的 top margin 折疊,bottom margin 同理。
但如果讓 #container 跟 #innter 處在不同的 BFC 中,則 top margin 和 bottom margin 都不會折疊,如:

細說CSS中margin屬性的使用

給 #container 元素增加一個 overflow: hidden 屬性,讓它的內容盒生成一個獨立的 BFC,而 #inner 處于這個獨立的 BFC 中,因此 #container 和 #inner 就處于兩個不同的 BFC 中了,所以他們的 margin 不能折疊。

栗子3:

如果一個元素,它本身的 top margin 和 bottom margin 是相鄰的,并且有清除浮動后的空隙(clearance),這個元素的 margin 可以跟兄弟元素的 margin 折疊,但是折疊后的 margin 不能跟父元素的 bottom margin 折疊。

細說CSS中margin屬性的使用

給父元素 #container 設置了一個灰色背景,并且沒有設置高度,因此高度會隨著內容而擴展,margin 設置為 50px。
其中有一個紅色的浮動元素 #floated,高寬都設置為 40px。
給 #cleared 設置了 15px 的 margin,并且元素的高度、padding、margin 都為0,因此 #cleared 元素的 top margin 和 bottom margin 是相鄰的。這個元素的位置如下圖所示:

細說CSS中margin屬性的使用

因為 #cleared 元素清除了左浮動,所以 #cleared 元素下移。
而 #cleared 元素和 #slibling 元素的 margin 折疊了,因此可以看到他們的位置是重疊的。

細說CSS中margin屬性的使用

由于這條規則的存在,導致他們折疊后的 margin 不能跟 #container 的 bottom margin 進行折疊,因此 #container 的高度被撐開。

如果沒有這條規則,他們還應該跟 #container 的 bottom margin 進行折疊,如:

細說CSS中margin屬性的使用

以上這張圖,在去掉了 #cleared 元素的 clear 屬性之后,就不滿足這條規則了,所以可以看到 #container 的高度就只有 40px,即紅色的浮動元素的高度,而 #cleared 元素、#sibling 元素、#container 元素的 margin 都折疊成了一個。

以上就是關于CSS中margin屬性的使用方法介紹,希望對大家學習理解CSS中margin屬性有所幫助。



注:相關教程知識閱讀請移步到CSS教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久久91| 裸体女人亚洲精品一区| 国产精品久久久久福利| 亚洲国产精品热久久| 国产精品爱啪在线线免费观看| 欧美日韩福利电影| 欧美成人激情视频免费观看| 久久久久久久激情视频| 精品国模在线视频| 66m—66摸成人免费视频| 日韩国产精品亚洲а∨天堂免| 久久精品久久精品亚洲人| 久久噜噜噜精品国产亚洲综合| 精品自拍视频在线观看| 久久久国产一区| 日韩欧美国产黄色| 国产精品伦子伦免费视频| 国产丝袜精品视频| 亚洲国产精品久久久久秋霞蜜臀| 日韩有码在线观看| 97超视频免费观看| 欧美精品中文字幕一区| 久久免费视频在线| 欧美激情综合色| 亚洲精品www久久久| 中文字幕综合一区| 亚洲三级黄色在线观看| 国产一区二区三区高清在线观看| 久久久久久噜噜噜久久久精品| 色狠狠久久aa北条麻妃| 亚洲综合在线中文字幕| 色综合色综合久久综合频道88| 伊人男人综合视频网| 亚洲一区二区免费| 奇米影视亚洲狠狠色| 国产午夜精品久久久| 91久久久亚洲精品| 亚洲美女动态图120秒| 国产精品久久不能| 日韩av在线免播放器| 永久555www成人免费| 精品视频久久久久久| 欧美日韩中文字幕综合视频| 久久亚洲精品中文字幕冲田杏梨| 欧美巨乳在线观看| 国内精品小视频在线观看| 久久香蕉频线观| 成人激情电影一区二区| 国产精品视频播放| 久久在线免费观看视频| 久久福利网址导航| 亚洲欧美在线x视频| 久久福利网址导航| 亚洲高清一区二| 91成人精品网站| 日韩欧美福利视频| 九九视频直播综合网| 中文字幕日韩av| 欧美肥老太性生活视频| 欧美激情中文字幕在线| 久久夜色精品亚洲噜噜国产mv| 日av在线播放中文不卡| 最新91在线视频| 亚洲直播在线一区| 午夜精品一区二区三区视频免费看| 欧美最近摘花xxxx摘花| 国产精品成人观看视频国产奇米| 久久亚洲电影天堂| 成人在线视频网| 欧美成人精品在线| 久久国产加勒比精品无码| 国自产精品手机在线观看视频| 久久色免费在线视频| 亚洲一区二区三区香蕉| 国产精品视频色| www.久久草.com| 欧美亚洲另类视频| 欧美专区国产专区| 亚洲性生活视频在线观看| 日韩在线视频免费观看| 精品中文字幕在线2019| 伊人伊成久久人综合网站| 国产精品视频大全| 91精品国产高清久久久久久| 久久人人爽人人爽人人片亚洲| 亚洲香蕉av在线一区二区三区| 亚洲精品美女在线观看| 亚洲天堂免费在线| 欧美性猛交xxxx黑人| 欧洲s码亚洲m码精品一区| 久久综合色影院| 91久久久国产精品| 亚洲国产精品推荐| 日本成人在线视频网址| 亚洲国产中文字幕在线观看| 成人免费看黄网站| 永久555www成人免费| 91精品久久久久久久久久久| 97免费中文视频在线观看| 精品国内产的精品视频在线观看| 日产精品99久久久久久| 色综久久综合桃花网| 国产精品www| 精品二区三区线观看| 亚洲精品综合久久中文字幕| 日本午夜在线亚洲.国产| 国产精品视频最多的网站| 国产精品99久久久久久www| 亚洲精品国产成人| 欧美日韩国产一区二区| 欧美综合一区第一页| 亚洲精品少妇网址| 欧美高清videos高潮hd| 久久久久久久久久婷婷| 色婷婷av一区二区三区在线观看| 2021久久精品国产99国产精品| 九九热这里只有精品6| 这里只有精品在线观看| 久久久免费在线观看| 在线观看亚洲视频| 欧美日韩精品国产| 久久激情视频久久| 国产91热爆ts人妖在线| 欧美日韩国产二区| 欧美成人一二三| 黑丝美女久久久| 2020久久国产精品| 国产日产欧美a一级在线| 日韩中文字幕国产| 亚洲v日韩v综合v精品v| 红桃视频成人在线观看| 日韩av不卡电影| 麻豆国产va免费精品高清在线| 精品国产91久久久| 亚洲影影院av| 97国产在线观看| 国产精品一区专区欧美日韩| 亚洲日本中文字幕免费在线不卡| 91麻豆国产语对白在线观看| 日韩精品中文字幕在线| 国产精品免费电影| 国产成人97精品免费看片| 一本色道久久综合狠狠躁篇怎么玩| 亚洲最大成人在线| 欧美性猛交xxxxx水多| 欧洲亚洲在线视频| 亚洲精品久久久久中文字幕二区| 97精品一区二区视频在线观看| 国产欧美最新羞羞视频在线观看| 欧美巨猛xxxx猛交黑人97人| 国产欧美日韩免费| 亚洲在线视频福利| 成人激情视频免费在线| 久久久伊人欧美| 色婷婷久久一区二区| 浅井舞香一区二区| 国模精品一区二区三区色天香| 国产精品爽爽ⅴa在线观看| 国产精品18久久久久久首页狼| 精品亚洲国产成av人片传媒| 国产精品a久久久久久| 色诱女教师一区二区三区| 亚洲成人aaa| 国产成人精品视|