搜尋

首頁  >  問答  >  主體

html5 - 为什么设置 box-sizing 之后给子元素加 margin 会把父元素的 margin 也撑高?

<style type="text/css">
        * {
            box-sizing: border-box;
        }
        
        #max-box {
            width: 500px;
            height: 500px;
            background-color: aliceblue;
            margin: 0 auto;
            /*position: relative;*/
            /*padding:   10px 10px;*/
        }
        
        #min-box {
            /*position: absolute;*/
            width: 300px;
            height: 300px;
            background-color: #4169E1;
            margin: 30px 100px 100px;
        }
    </style>

    <body>
        <p id="max-box">
            <p id="min-box">

            </p>
        </p>
    </body>

如图、我并没有给父元素 max-box 加 margin,但是也被撑高了

黄舟黄舟2768 天前538

全部回覆(6)我來回復

  • 伊谢尔伦

    伊谢尔伦2017-04-17 13:55:37

    首先,這和box-sizing無關,無論是否設置,都會發生題主所說的情況。

    這個現象叫做外邊距合併(Collapsing Margins),在w3c的css2.2規範文件 - collapsing margins中提到了:

    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
        ...

    這裡提到的就是垂直外邊距發生合併的條件,它們必須同時滿足。題主的例子裡,就屬於"top margin of a box and top margin of its first in-flow child"的情況,此外,它們之間沒有任何行內文字,內邊距等“隔離元素”,因此會變成這樣。

    對應的,只要改變一些狀態,就可以避免垂直外邊距合併,題主註解掉的position: absolute;就是其中一種。

    回覆
    0
  • 阿神

    阿神2017-04-17 13:55:37

    這是CSS樣式margin疊加的問題:
    如果相鄰兩個元素都有margin,那麼間距會取兩者較大的作為間距距離;
    同理,對於包含的兩個元素也是一樣,特殊的是如果包含的兩個元素,父元素沒有margin,而子元素有margin,並且父元素沒有border和padding的話,那麼子元素的margin會溢出到父元素外,要解決這個問題有很多方法,如設定1px的padding,或是設定透明的border等方法來防止margin溢出。

    回覆
    0
  • 阿神

    阿神2017-04-17 13:55:37

    為父級元素設定:overflow:hidden;

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:55:37

    小的p的margin-top是30px

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 13:55:37

    不是因為box-sizing的問題,min-box的margin-top為30px,會影響父級元素跟著一起有一個margin-top,給max-box添加一個overflow:hidden;就可以了

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:55:37

    有關 margin 摺疊的細節和用法Collapsing Margins

    回覆
    0
  • 取消回覆