先貼上css文檔的相關(guān)描述:
這里說的是,一個(gè)元素,它的上外邊距和下外邊距塌陷時(shí)的情況。
按照第二條規(guī)則,此元素的上邊框邊界的位置應(yīng)該和下邊框?qū)挾确?時(shí)的位置相同。
可是我的實(shí)踐跟css規(guī)范上描述的是不同的。
沒有發(fā)生邊界塌陷時(shí)的代碼如下:
//css
.box{
margin-top:10px;
margin-bottom:20px;
border-bottom:1px solid red;
}
.item{
float:left;
}
//html
<div class='box'>
<div class='item'>今天天氣不錯(cuò)</div>
</div>
這個(gè)時(shí)候頁面效果如下圖所示:
按照理論,元素上邊框邊界的位置應(yīng)該就是這條紅線,距離頁面頂部10像素。
我將元素的下邊界邊框去掉,此時(shí)會(huì)發(fā)生外邊距塌陷。代碼修改如下:
//css
.box{
margin-top:10px;
margin-bottom:20px;
//border-bottom:1px solid red;
}
.item{
float:left;
}
//html
<div class='box'>
<div class='item'>今天天氣不錯(cuò)</div>
</div>
這個(gè)時(shí)候的頁面效果如下圖所示:
很明顯,文本所在的元素具體頁面頂部的距離是20px。可是,按照css文檔上的規(guī)則,不應(yīng)該是距離頁面頂部10px嗎?
我使用的是Chrome瀏覽器。我的疑問是:
1.是不是我沒有正確理解css文檔規(guī)則?
2.是不是chrome瀏覽器沒有實(shí)現(xiàn)此css規(guī)則?
請賜教!
這是你理解的問題。
你的代碼是發(fā)生外邊距折疊的情況,但并不是你所給出的這段文檔中的情況。
首先來看你給出的文檔的情況:
文檔中的外邊距折疊屬于父元素與子元素之間的外邊距折疊,但是文檔中只提到了折疊產(chǎn)生的結(jié)果。
這里是MDN上的父元素與子元素外邊距折疊產(chǎn)生的條件:
如果在父元素與其第一個(gè)子元素之間不存在邊框、內(nèi)邊距、行內(nèi)內(nèi)容,也沒有創(chuàng)建塊格式化上下文、或者清除浮動(dòng)將兩者的 margin-top 分開;或者在父元素與其最后一個(gè)子元素之間不存在邊框、內(nèi)邊距、行內(nèi)內(nèi)容、height、min-height、max-height將兩者的 margin-bottom 分開,那么這兩對(duì)外邊距之間會(huì)產(chǎn)生折疊。此時(shí)子元素的外邊距會(huì)“溢出”到父元素的外面。
舉個(gè)符合條件的栗子:
.box {
margin-top: 10px;
}
.item {
margin-top: 20px;
}
結(jié)果是,item
和box
擁有相同的上邊距——20px(這里的上邊距是指視覺效果),也就是你給出的文檔中的情況:
the top border edge of the box is deined to be the same as the parent's盒子的上邊距和父元素的相同。
也就是20px。結(jié)果20px是取的兩者margin-top
較大的。
otherwise 的情況就是沒有產(chǎn)生外邊距折疊的情況,結(jié)果就是正常的顯示咯。
在item
前增加一些元素來破壞產(chǎn)生外邊距折疊的條件:
<div class="box">
<span>something</span>
<div class="item">item</div>
</div>
這個(gè)時(shí)候再看,box
上邊距是10px,item
上邊距30px(距離窗口上邊緣),也就是正常的情況。
那再來分析一下你的示例代碼:
你的代碼屬于空的塊級(jí)元素發(fā)生的外邊距折疊。
在沒有設(shè)置border
的時(shí)候:item
浮動(dòng)之后,box
就是個(gè)空的塊級(jí)元素。
如果一個(gè)塊級(jí)元素中不包含任何內(nèi)容,并且在其 margin-top 與 margin-bottom 之間沒有邊框、內(nèi)邊距、行內(nèi)內(nèi)容、height、min-height 將兩者分開,則該元素的上下外邊距會(huì)折疊。
由于bo
x發(fā)生外邊距折疊,選擇20px和10px之間較大的,所以box實(shí)際上邊距為20px,浮動(dòng)的item
根據(jù)box
進(jìn)行定位,所以上邊距也是20px。
當(dāng)你設(shè)置了border
之后,就破壞了外邊距折疊的條件,所以就是正常情況,box
的上邊距就是margin-top
的10px。浮動(dòng)的item
據(jù)此定位也就是10px。
除了這兩種外邊距折疊之外,還有相鄰元素的外邊距折疊,這個(gè)相對(duì)簡單,就不說了。
關(guān)于外邊距折疊問題,具體的解釋你可以看MDN,你看的文檔并不是那么容易理解,最主要的是你看的并不全。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。