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