成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

深入理解CSS外邊距折疊(Margin Collapse)

zhonghanwen / 2157人閱讀

摘要:我們可以注意定義中的幾個(gè)關(guān)鍵字毗鄰兩個(gè)或多個(gè)垂直方向和普通流。如何避免外邊距疊加上面講了外邊距的疊加,那如何避免呢,其實(shí)只要破壞上面講到的四個(gè)條件中的任何一個(gè)即可毗鄰兩個(gè)或多個(gè)普通流和垂直方向。

外邊距疊加一直是前端開(kāi)發(fā)必須了解的一個(gè)概念,面試一般也會(huì)問(wèn)到這個(gè)問(wèn)題。所以整理一下相關(guān)外邊距疊加相關(guān)的知識(shí)點(diǎn)。外邊距疊加是什么?什么時(shí)候會(huì)發(fā)生外邊距疊加?如何避免外邊距疊加?

什么是外邊距疊加

先來(lái)看看 W3C 對(duì)于外邊距疊加的定義:

In CSS, the adjoining margins of two or more boxes (which might or might not be siblings) can combine to form a single margin. Margins that combine this way are said to collapse, and the resulting combined margin is called a collapsed margin.

大概意思是:在CSS中,兩個(gè)或多個(gè)毗鄰的普通流中的盒子(可能是父子元素,也可能是兄弟元素)在垂直方向上的外邊距會(huì)發(fā)生疊加,這種形成的外邊距稱之為外邊距疊加。

我們可以注意定義中的幾個(gè)關(guān)鍵字:毗鄰、兩個(gè)或多個(gè)、垂直方向和普通流。

毗鄰

毗鄰說(shuō)明了他們的位置關(guān)系,沒(méi)有被 padding、borderclearline box 分隔開(kāi)。

兩個(gè)或多個(gè)

兩個(gè)或多個(gè)盒子是指元素之間的相互影響,單個(gè)元素不會(huì)存在外邊距疊加的情況。

垂直方向

Horizontal margins never collapse.

只有垂直方向的外邊距會(huì)發(fā)生外邊距疊加。水平方向的外邊距不存在疊加的情況。

普通流(in flow)

啥為普通流?W3C 只對(duì) out of flow 作了定義:

An element is called out of flow if it is floated, absolutely positioned, or is the root element.An element is called in-flow if it is not out-of-flow.

從定義中我們可以知道只要不是 floatabsolutely positionedroot element 時(shí)就是 in flow。

什么時(shí)候會(huì)發(fā)生外邊距疊加

外邊距疊加存在兩種情況:一是父子外邊距疊加;二是兄弟外邊距疊加。

W3C 對(duì)于什么是毗鄰的外邊距也有定義:

Two margins are adjoining if and only if: - both belong to in-flow block-level boxes that participate in the same block formatting context - no line boxes, no clearance, no padding and no border separate them - both belong to vertically-adjacent box edges, i.e. form one of the following pairs:

top margin of a box and top margin of its first in-flow child

bottom margin of box and top margin of its next in-flow following sibling

bottom margin of a last in-flow child and bottom margin of its parent if the > parent has "auto" computed height

top and bottom margins of a box that does not establish a new block formatting context and that has zero computed "min-height", zero or "auto" computed "height", and no in-flow children

從定義中我們可以很清楚的知道要符合哪些情況才會(huì)發(fā)生外邊距折疊:

都屬于普通流的塊級(jí)盒子且參與到相同的塊級(jí)格式上下文中

沒(méi)有被padding、border、clear和line box分隔開(kāi)

都屬于垂直毗鄰盒子邊緣:

盒子的top margin和它第一個(gè)普通流子元素的top margin

盒子的bottom margin和它下一個(gè)普通流兄弟的top margin

盒子的bottom margin和它父元素的bottom margin

盒子的top margin和bottom margin,且沒(méi)有創(chuàng)建一個(gè)新的塊級(jí)格式上下文,且有被計(jì)算為0的min-height,被計(jì)算為0或auto的height,且沒(méi)有普通流子元素

Demo 1
.parent1 {
    height: 20px;
    background: yellow;
    margin-bottom: 20px;
}
.parent2 {
    margin: 20px 0 30px;
}
.parent3 {
    height: 20px;
    background: green;
    margin-top: 20px;
}
.child {
    background: red;
    height: 20px;
    margin: 40px 0 30px;
}

這個(gè) demo 里的 .parent2 和第一個(gè) .child 的 top margin 疊加,導(dǎo)致 .parent1.parent2 之間的邊距為 40px。

Demo 2

還是用上面的代碼,.parent2 中的 .child 中的 top margin 和 bottom margin 發(fā)生外邊距疊加,它們之間的外邊距為 40px。

Demo 3

還是上面的代碼,.parent2 中的最后一個(gè) .child 發(fā)生 bottom margin 疊加,.parent2
.parent3 之間的邊距為 30px。

Demo 4
.demo {
    height: 30px;
    background: red;
}
.margin-test {
    margin: 20px 0 30px;
}

這個(gè) demo 是上面的第四種情況,元素自身的外邊距 topbottom 發(fā)生折疊,我們可以看出 .container 的高度為 90px,這里可以看到 margin-testtopbottom 外邊距發(fā)生了折疊。

如何避免外邊距疊加

上面講了外邊距的疊加,那如何避免呢,其實(shí)只要破壞上面講到的四個(gè)條件中的任何一個(gè)即可:毗鄰、兩個(gè)或多個(gè)、普通流和垂直方向。

W3C也對(duì)此做了總結(jié):

Margins between a floated box and any other box do not collapse (not even between a float and its in-flow children).

Margins of elements that establish new block formatting contexts (such as floats and elements with "overflow" other than "visible") do not collapse with their in-flow children.

Margins of absolutely positioned boxes do not collapse (not even with their in-flow children).

Margins of inline-block boxes do not collapse (not even with their in-flow children).

The bottom margin of an in-flow block-level element always collapses with the top margin of its next in-flow block-level sibling, unless that sibling has clearance.

The top margin of an in-flow block element collapses with its first in-flow block-level child"s top margin if the element has no top border, no top padding, and the child has no clearance.

The bottom margin of an in-flow block box with a "height" of "auto" and a "min-height" of zero collapses with its last in-flow block-level child"s bottom margin if the box has no bottom padding and no bottom border and the child"s bottom margin does not collapse with a top margin that has clearance.

A box"s own margins collapse if the "min-height" property is zero, and it has neither top or bottom borders nor top or bottom padding, and it has a "height" of either 0 or "auto", and it does not contain a line box, and all of its in-flow children"s margins (if any) collapse.

翻譯一下:

浮動(dòng)元素不會(huì)與任何元素發(fā)生疊加,也包括它的子元素

創(chuàng)建了 BFC 的元素不會(huì)和它的子元素發(fā)生外邊距疊加

絕對(duì)定位元素和其他任何元素之間不發(fā)生外邊距疊加,也包括它的子元素

inline-block 元素和其他任何元素之間不發(fā)生外邊距疊加,也包括它的子元素

普通流中的塊級(jí)元素的 margin-bottom 永遠(yuǎn)和它相鄰的下一個(gè)塊級(jí)元素的 margin-top 疊加,除非相鄰的兄弟元素 clear

普通流中的塊級(jí)元素(沒(méi)有 border-top、沒(méi)有 padding-top)的 margin-top 和它的第一個(gè)普通流中的子元素(沒(méi)有clear)發(fā)生 margin-top 疊加

普通流中的塊級(jí)元素(height為 auto、min-height為0、沒(méi)有 border-bottom、沒(méi)有 padding-bottom)和它的最后一個(gè)普通流中的子元素(沒(méi)有自身發(fā)生margin疊加或clear)發(fā)生 margin-bottom疊加

如果一個(gè)元素的 min-height 為0、沒(méi)有 border、沒(méi)有padding、高度為0或者auto、不包含子元素,那么它自身的外邊距會(huì)發(fā)生疊加

本文首發(fā)于有贊技術(shù)博客:http://tech.youzan.com/css-ma...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/112313.html

相關(guān)文章

  • 深入CSS外邊折疊(margin collapse)詳解

    摘要:發(fā)生外邊距折疊的條件是什么垂直方向上相鄰的兩個(gè)元素這種情況很好理解,就是上面的例子中給出的情況。外邊距折疊后的大小兩個(gè)相同大小的正數(shù)取某個(gè)外邊距的值。即與發(fā)生折疊,折疊后的值為。根據(jù)塊級(jí)格式化上下文來(lái)阻止外邊距折疊。 什么是外邊距折疊 準(zhǔn)確來(lái)說(shuō),外邊距折疊應(yīng)該叫垂直外邊距折疊,因?yàn)橹粫?huì)發(fā)生在垂直方向上,而水平方向上不會(huì)發(fā)生。 對(duì)于以下簡(jiǎn)單的html代碼和css代碼, 請(qǐng)問(wèn)top塊和bo...

    ctriptech 評(píng)論0 收藏0
  • CSS margin合并問(wèn)題

    摘要:兩個(gè)相鄰的外邊距都是負(fù)數(shù)時(shí),折疊結(jié)果是兩者絕對(duì)值的較大值。兩個(gè)外邊距一正一負(fù)時(shí),折疊結(jié)果是兩者的相加的和。 在CSS當(dāng)中,相鄰的兩個(gè)盒子(可能是兄弟關(guān)系也可能是祖先關(guān)系)的外邊距可以結(jié)合成一個(gè)單獨(dú)的外邊距。這種合并外邊距的方式被稱為折疊,并且因而所結(jié)合成的外邊距稱為折疊外邊距。 1. 折疊的結(jié)果 兩個(gè)相鄰的外邊距都是正數(shù)時(shí),折疊結(jié)果是它們兩者之間較大的值。 兩個(gè)相鄰的外邊距都是負(fù)數(shù)時(shí)...

    zhongmeizhi 評(píng)論0 收藏0
  • 關(guān)于CSS里BFC特性的理解和應(yīng)用

    摘要:它是頁(yè)面中的一塊渲染區(qū)域,并且有一套渲染規(guī)則,它決定了其子元素將如何定位,以及和其他元素的關(guān)系和相互作用。而,塊級(jí)格式化上下文,就是一個(gè)塊級(jí)元素的渲染顯示規(guī)則。定位和清除浮動(dòng)的樣式規(guī)則只適用于處于同一塊格式化上下文內(nèi)的元素。 什么是BFC(Block Formatting Context) Formatting context(格式化上下文) 是 W3C CSS2.1 規(guī)范中的一個(gè)概念...

    shixinzhang 評(píng)論0 收藏0
  • 關(guān)于CSS里BFC特性的理解和應(yīng)用

    摘要:它是頁(yè)面中的一塊渲染區(qū)域,并且有一套渲染規(guī)則,它決定了其子元素將如何定位,以及和其他元素的關(guān)系和相互作用。而,塊級(jí)格式化上下文,就是一個(gè)塊級(jí)元素的渲染顯示規(guī)則。定位和清除浮動(dòng)的樣式規(guī)則只適用于處于同一塊格式化上下文內(nèi)的元素。 什么是BFC(Block Formatting Context) Formatting context(格式化上下文) 是 W3C CSS2.1 規(guī)范中的一個(gè)概念...

    vspiders 評(píng)論0 收藏0
  • CSS規(guī)范 > 8 盒模型 Box Model

    摘要:當(dāng)兩個(gè)及以上外邊距折疊,合并后的外邊距寬度是發(fā)生折疊的外邊距中的最大寬度。如果該元素的外邊距同其父元素的上外邊距折疊,則該盒的上邊框邊緣同其父元盒的上邊框邊緣相同。 2017-07-20: 關(guān)于外邊距折疊, 推薦問(wèn)題: https://segmentfault.com/q/10... 8 盒模型 Box Model URL: http://www.w3.org/TR/CSS2/box...

    suemi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<