摘要:當(dāng)兩個(gè)及以上外邊距折疊,合并后的外邊距寬度是發(fā)生折疊的外邊距中的最大寬度。如果該元素的外邊距同其父元素的上外邊距折疊,則該盒的上邊框邊緣同其父元盒的上邊框邊緣相同。
2017-07-20: 關(guān)于外邊距折疊, 推薦問題: https://segmentfault.com/q/10...
8 盒模型 Box ModelURL: http://www.w3.org/TR/CSS2/box...
Translator : HaoyCn
Date: 15th of Aug, 2015
譯者注:本譯文僅擇精要部分翻譯了規(guī)范,主要描述了盒模型結(jié)構(gòu),以及重點(diǎn)分析外邊距折疊。個(gè)人水平有限,歡迎指正!
CSS盒模型所描述的矩形盒由文檔樹內(nèi)的元素生成,根據(jù)視覺格式化模型布局。
8.1 盒尺寸 Box Dimensions每個(gè)盒都有一個(gè)內(nèi)容區(qū)域 Content (如,文本,圖片等)以及可選的圍繞在周圍的內(nèi)邊距、邊框和外邊距區(qū)域;每個(gè)區(qū)域的大小由本文后述的屬性指定。下圖展示了這些區(qū)域的關(guān)聯(lián)以及用于描述外邊距、邊框和內(nèi)邊距的各部分的術(shù)語。
外邊距、邊框和內(nèi)邊距可以被分解到上、右、下、左各部分(如,在上圖中, LM 表示左外邊距, RP 表示右內(nèi)邊距, TB 表示上邊框等)。
四種區(qū)域(內(nèi)容、內(nèi)邊距、邊框、外邊距)的邊界被稱作一個(gè)“邊緣 Edge ”,因此每個(gè)盒有四種邊緣:
內(nèi)容邊緣 Content Edge 或內(nèi)邊緣 Inner Edge
內(nèi)容邊緣圍繞著由盒的寬和高所指定的矩形,該矩形通常由元素的已渲染內(nèi)容 Rendered Content 所決定。四個(gè)內(nèi)容邊緣規(guī)定了盒的內(nèi)容盒 Content Box 。
內(nèi)邊距邊緣
內(nèi)邊距邊緣圍繞著盒的內(nèi)邊距。如果內(nèi)邊距寬度為0,則內(nèi)邊距邊緣即是內(nèi)容邊緣。四個(gè)內(nèi)邊距邊緣規(guī)定了盒的內(nèi)邊距盒 Padding Box 。
邊框邊緣
邊框邊緣圍繞著盒的邊框。如果邊框?qū)挾葹?,則邊框邊緣即是內(nèi)邊距邊緣。四個(gè)邊框邊緣規(guī)定了盒的邊框盒 Border Box 。
外邊距邊緣或外邊緣
外邊距邊緣圍繞著盒的外邊距。如果外邊距寬度為0,則外邊距邊緣即邊框邊緣。四個(gè)外邊距邊緣規(guī)定了盒的外邊距盒 Margin Box 。
每個(gè)邊緣都可以被分解成上、右、下、左邊緣。
盒內(nèi)容區(qū)域的尺寸——即內(nèi)容寬度 Content Width 和內(nèi)容高度 Content Width ——由這些因素所決定:生成盒的元素是否設(shè)置了 width 和 height 屬性;盒是否包含了文本或其他盒;盒是否為表格;等等。盒的寬度和高度將在視覺格式化模型詳述一章中討論。
盒的內(nèi)容、內(nèi)邊距以及邊框區(qū)域的背景樣式由生成盒的元素的 background 屬性所規(guī)定。外邊距的背景始終為透明。
8.2 外邊距、內(nèi)邊距和邊框的例子下例展示了外邊距、內(nèi)邊距和邊框如何交互。HTML文檔:
Examples of margins, padding, and borders
該文檔結(jié)果為文檔樹中(省略其他關(guān)系)一個(gè) ul 元素及其兩個(gè) li 子元素。
下面的第一圖展示了例子的結(jié)果。第二圖展示了 ul 元素及其 li 子元素的外邊距、內(nèi)邊距和邊框之間的關(guān)系。(圖片不成比例)
注意:
每個(gè) li 盒的內(nèi)容寬度是從上到下計(jì)算的;所有 li 盒的包含塊由 ul 元素創(chuàng)建。
每個(gè) li 盒的外邊距盒高度由其內(nèi)容高度加上上下內(nèi)邊距、邊框、外邊距所決定。需要留意的是 li 盒間的垂直外邊距發(fā)生了折疊。
li 盒的右內(nèi)邊距寬度被設(shè)為零( padding 屬性)。效果如第二圖所示。
li 盒的外邊距是透明的——外邊距總為透明——所以 ul 的內(nèi)邊距和內(nèi)容區(qū)域的背景顏色(黃)穿透外邊距顯示了出來。
第二個(gè) li 元素指定了虛線邊框( border-style 屬性)。
8.3 外邊距各屬性外邊距的各屬性規(guī)定了盒的外邊距區(qū)域的寬度。 margin 設(shè)置所有四個(gè)方向的外邊距,而其他外邊距屬性則只設(shè)置各自方向?qū)挾?。這些屬性應(yīng)用于所有元素,但垂直外邊距在非替代行內(nèi)元素上無效。
8.3.1 外邊距折疊譯者注:此處以及下文的各屬性介紹均略,可查CSS手冊(cè)
在CSS中,兩個(gè)及以上的(不一定是同胞)盒的相鄰?fù)膺吘嗫赡芎喜橐粋€(gè)多帶帶的外邊距。以這種方式的合并的外邊距被稱為折疊 Collapse ,合并后的外邊距被稱為折疊外邊距 Collapsed Margin 。
相鄰垂直外邊距發(fā)生折疊,除了:
根元素的盒的外邊距不折疊
如果一個(gè)有空隙的元素的上下外邊距相鄰,其外邊距將同其后同胞的相鄰?fù)膺吘嗾郫B,但不同父塊的下外邊距折疊。
水平外邊距不重疊。
兩個(gè)外邊距為相鄰關(guān)系,當(dāng)且僅當(dāng):
是同屬一個(gè)塊格式化上下文的文檔流內(nèi)塊級(jí)盒
沒有行盒、空隙、內(nèi)邊距和邊框分隔它們(注意某些零高度行盒會(huì)因此而被忽略(見9.4.2章))
盒邊緣垂直相鄰,也就是說,滿足以下形式之一:
盒上外邊距及其第一個(gè)文檔流內(nèi)子盒的上外邊距
盒下外邊距及下一個(gè)文檔流內(nèi)的同胞盒的上外邊距
如果父盒的高度計(jì)算值為 auto ,其最后一個(gè)文檔流內(nèi)子盒的下外邊距及父盒的下外邊距
如果一個(gè)盒不建立新的塊格式化上下文、 min-height 計(jì)算值為零、 height 計(jì)算值為零或 auto 、沒有在文檔流內(nèi)的子盒,其上下外邊距
如果一個(gè)折疊外邊距與另一外邊距的任何一邊相鄰,則視二者相鄰。
注意:不是同胞或祖先關(guān)系的元素也可以產(chǎn)生相鄰?fù)膺吘唷?/p>
注意:上述規(guī)則表明了:
浮動(dòng)盒的外邊距不同其他任何盒折疊(甚至浮動(dòng)及其文檔流內(nèi)的子元素也不折疊)
創(chuàng)建了新的塊格式化上下文的元素(如浮動(dòng)、 overflow 不為 visible 的元素)的外邊距不同其在文檔流內(nèi)的子元素外邊距折疊
絕對(duì)定位盒的外邊距不同其他任何盒折疊(甚至不同其文檔流內(nèi)的子元素折疊)
行內(nèi)塊盒的外邊距不同其他任何盒折疊(甚至不同其文檔流內(nèi)的子元素折疊)
文檔流內(nèi)塊級(jí)元素的下外邊距始終同其下一個(gè)文檔流內(nèi)的塊級(jí)同胞的上外邊距折疊,除非該對(duì)同胞之間有空隙。
文檔流內(nèi)塊元素如果沒有上邊框和上內(nèi)邊距,其第一個(gè)文檔流內(nèi)塊級(jí)子元素沒有空隙,二者的上外邊距折疊。
文檔流內(nèi) height 為 auto 、 min-height 為零、沒有下內(nèi)邊距和下邊框的塊盒,如果其最后一個(gè)文檔流內(nèi)塊級(jí)子盒的下外邊距沒有同一個(gè)有空隙的上外邊距折疊,二者下外邊距折疊。
如果某盒的 min-height 屬性為零、沒有上下邊框和上下內(nèi)邊距、其 height 為0或 auto 、沒有包含行盒、其所有的文檔流內(nèi)子元素外邊距(如果有)折疊,則折疊其外邊距。
當(dāng)兩個(gè)及以上外邊距折疊,合并后的外邊距寬度是發(fā)生折疊的外邊距中的最大寬度。如果發(fā)生折疊的外邊距中有負(fù)數(shù),則為最大正數(shù)相鄰?fù)膺吘鄿p去最小負(fù)數(shù)相鄰?fù)膺吘嗟慕^對(duì)值。如果不存在正數(shù)外邊距,則為零減去最小負(fù)數(shù)相鄰?fù)膺吘嗟慕^對(duì)值。
如果一個(gè)盒的上下外邊距相鄰,則外邊距可能穿過盒而折疊 Collapse Through It 。這種情況下,元素的定位取決于它同其他外邊距折疊的元素的關(guān)系。
如果該元素的外邊距同其父元素的上外邊距折疊,則該盒的上邊框邊緣同其父元盒的上邊框邊緣相同。
否則,要么該元素的父元素的外邊距不折疊,要么只有父元素的下外邊距折疊。上邊框邊緣位置是假定該元素下邊框非零時(shí)的位置。
需要注意的是,被折疊穿過的元素的定位對(duì)與之外邊距折疊的其他元素的定位無影響;其上邊框邊緣的定位僅用于布局其后代元素。
8.6 雙向上下文 Bidirectional Context 中行內(nèi)元素的盒模型對(duì)每個(gè)行盒而言,用戶代理必須按視覺順序(而非邏輯順序)渲染其生成的行內(nèi)盒的外邊距、邊框和內(nèi)邊距。
當(dāng)元素 direction 屬性值為 ltr ,元素呈現(xiàn)的第一個(gè)行盒的最左生成盒擁有左外邊距、左邊框和左內(nèi)邊距,而元素呈現(xiàn)的最后一個(gè)行盒的最右生成盒擁有右內(nèi)邊距、右邊框和右外邊距。
當(dāng)元素 direction 屬性值為 rtl ,元素呈現(xiàn)的第一個(gè)行盒的最右生成盒擁有右外邊距、右邊框和右內(nèi)邊距,而元素呈現(xiàn)的最后一個(gè)行盒的最左生成盒擁有左內(nèi)邊距、左邊框和左外邊距。
譯者之思譯者讀畢此文,細(xì)心揣摩,將經(jīng)驗(yàn)和疑問總結(jié)如下:
一、兩種盒模型本章節(jié)描述了W3C的標(biāo)準(zhǔn)盒模型,同時(shí)還存在IE6在怪異模式 Quicks Mode 的另一種盒模型。此處簡(jiǎn)述二者的區(qū)別如下——
W3C標(biāo)準(zhǔn)下:盒總寬/高度 = width/height + padding + border + margin
怪異模式下:盒總寬/高度 = width/height + margin = 內(nèi)容寬/高度 + padding + border + margin
CSS3中, box-sizing 默認(rèn)為 content-box ,即采用W3C標(biāo)準(zhǔn)盒模型,若取值 border-box 則采用怪異模式盒模型。
二、不透明的外邊距CSS規(guī)范道:
盒的內(nèi)容、內(nèi)邊距以及邊框區(qū)域的背景樣式由生成盒的元素的 background 屬性所規(guī)定。外邊距的背景始終為透明。
但在根元素 html 上設(shè)置了外邊距,并規(guī)定了背景,該背景仍鋪滿全屏。
如下CSS:
html { margin: 50px; background: #000; }
body 同此理。譯者暫不知其因。歡迎讀者指教。
三、有空隙的元素外邊距折疊中,很多地方敘述了“有空隙的元素”,這是什么意思呢?其意義即是說,該元素清除了浮動(dòng)。
在翻譯視覺格式化模型一章中,W3C給出了清除浮動(dòng)以及計(jì)算空隙寬度的的案例,譯者建議讀者認(rèn)真閱讀該部分,尤其關(guān)注:當(dāng)空隙為負(fù)值時(shí)取消外邊距折疊的情形。
點(diǎn)此閱讀:http://segmentfault.com/a/119...。
如果讀者已經(jīng)掌握清除浮動(dòng)和空隙的知識(shí),那就讓我們來看一個(gè)有空隙的情景。
如果一個(gè)有空隙的元素的上下外邊距相鄰,其外邊距將同其后同胞的相鄰?fù)膺吘嗾郫B,但不同父塊的下外邊距折疊。
以下代碼中, B 是浮動(dòng)塊,為清除其浮動(dòng), C 引入了空隙。
共同CSS:
html,body{padding:0;margin:0;} /*橫線,直觀對(duì)比折疊情況*/ .line{height:50px;background:red;} .mt{margin-top:50px;} .mb{margin-bottom:50px;} #B{float:left;width:1px;height:1px;} #C{clear:both;}
其外邊距將同其后同胞的相鄰?fù)膺吘嗾郫B:
HTML:
渲染結(jié)果是, C 和 D 的外邊距折疊。
不同父塊的下外邊距折疊
HTML:
渲染結(jié)果是, C 的外邊距不同其父元素 A 的外邊距折疊。
四、避免盒自身垂直外邊距折疊如果一個(gè)盒不建立新的塊格式化上下文、 min-height 計(jì)算值為零、 height 計(jì)算值為零或 auto 、沒有在文檔流內(nèi)的子盒,其上下外邊距
由此可以得出幾種避免盒自身上下外邊距折疊的辦法,簡(jiǎn)單列舉如下:
建立新塊格式化上下文,如 overflow: hidden
設(shè)置 min-height
設(shè)置固定高 height
添加文檔流內(nèi)(即非浮動(dòng)、非絕對(duì)定位)子盒
需要注意最后一種辦法,子盒要么有邊框或內(nèi)邊距,要么有內(nèi)容,否則父盒的自身垂直外邊距同樣會(huì)折疊。而如果子盒只有垂直外邊距,該垂直外邊距將同父盒的垂直外邊距折疊,而不會(huì)阻止父盒自身垂直邊距折疊。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/111117.html
摘要:盒的類型會(huì)影響其在視覺格式化模型中的表現(xiàn)。浮動(dòng)元素絕對(duì)定位元素根元素都被稱為脫離文檔流其他元素被稱為文檔流內(nèi)。 視覺格式化模型 Visual Formatting Model URL:http://www.w3.org/TR/CSS2/visuren.html Translator: HaoyCn Date: 14th of Aug, 2015 本文并未全部翻譯,譯者在原文基礎(chǔ)上...
摘要:行盒的寬度由其包含塊給予,但可能因浮動(dòng)而縮小。絕對(duì)定位不可替換元素的使用值約束為包含塊寬度如果和均為首先將以及值為的設(shè)為。 2015/10/08: 原10.8標(biāo)題 行盒高度計(jì)算改為10.8 行高計(jì)算。英文原文為line height。由于翻譯時(shí)候看到那段結(jié)論是行盒的高度,腦抽就把原本翻譯對(duì)的標(biāo)題改了下,剛回顧一番深覺不妥,故改回來。 原文:http://www.w3.org/TR/CS...
摘要:但該盒不建立新的層疊上下文,除非是根元素。以上是基于的層疊上下文介紹。同級(jí)情況下,按照二者在源代碼中的順序,居后的又重新占領(lǐng)高地了。現(xiàn)在我們看以下源代碼這個(gè)時(shí)候,以視口為包含塊進(jìn)行定位和大小計(jì)算,將會(huì)鋪滿整個(gè)屏幕。 前言:關(guān)于層疊上下文,筆者還沒有去閱讀更詳細(xì)的 W3C 規(guī)范來了解更本質(zhì)的原理(表打我,等我校招拿到 offer 了我就讀好伐 T_T)。一直聽說 CSS3 里的層疊上下文...
摘要:中各種布局的背后,實(shí)質(zhì)上是各種的組合。相反,一些塊容器盒,比如非替換行內(nèi)塊及非替換表格單元格,不是塊級(jí)盒。描述元素跟它的后代之間的影響。行盒行盒由行內(nèi)格式化上下文產(chǎn)生的盒,用于表示一行。彈性容器外和彈性項(xiàng)目?jī)?nèi)的一切元素都不受影響。 CSS中各種布局的背后,實(shí)質(zhì)上是各種*FC的組合。CSS2.1 中只有 BFC 和 IFC, CSS3 中還增加了 FFC 和 GFC。 盒模型(Box M...
摘要:塊級(jí)盒參與塊格式化上下文。行內(nèi)級(jí)盒參與行內(nèi)格式化上下文塊格式化上下文行內(nèi)格式化上下文相對(duì)定位浮動(dòng)盒就是一個(gè)在當(dāng)前行向左或向右移動(dòng)的盒。浮動(dòng)絕對(duì)定位絕對(duì)定位模型中,一個(gè)盒會(huì)有相對(duì)于其包含塊的明確偏移,它會(huì)從常規(guī)流中全部移除不會(huì)影響后面的兄弟。 在可視化格式模型(Visual formatting model)當(dāng)中,文檔樹中的每個(gè)元素根據(jù)其盒模型生成0個(gè)或多個(gè)盒.這些盒的布局由(以下因素)...
閱讀 2700·2021-11-25 09:43
閱讀 2789·2021-11-04 16:09
閱讀 1779·2021-10-12 10:13
閱讀 932·2021-09-29 09:35
閱讀 935·2021-08-03 14:03
閱讀 1826·2019-08-30 15:55
閱讀 3062·2019-08-28 18:14
閱讀 3650·2019-08-26 13:43