1. 用到百分比的屬性:
- width, height
- margin, padding
- top, right, bottom, left
- transform – translate
- background-position, background-size
2. containing block
2.1 為什麼要知道containing block
MDN:
The size and position of an element are often impacted by its containing block. Most often, the containing block is the content area of an element`s nearest block-level ancestor, but this is not always the case. In this article, we examine the factors that deterime an element`s containing block.
所以百分比都是相對於其containing block來計算的
2.2 containing block的定義
翻譯自MDN:
containing block的定義和元素的postion屬性有關:
- static 或 relative時:
最近的__block container__(比如inline-block, block, list-item)或者建立了__formatting context__(比如table container, flex container, grid container或block container)的祖先元素的__context box__
- absolute:
最近的
position
屬性不是static
的祖先元素的__padding box__- fixed:
視窗
- 特殊情況, fixed或absolute時, 當其父元素有以下情況出現時, containing block為其父元素的__padding box__:
1).
transform
或perspective
屬性的值不是none
2).
will-change
屬性的值是transform
或perspective
3).
filter
屬性不是none
或will-change
屬性的值是filter
(只在Firefox中有效)
3. 如何計算
- height, top, bottom根據其containing block的
height
進行計算, 如果該height
沒有指定(根據內容自適應), 那麼計算值為0 - width, left, right, padding, margin根據其containing block的
width
進行計算 - transform – translate, translateX, translateY, 根據__自身元素__的實際寬度計算
- background:
4.1 background-position根據__自身元素(不是containing block)__的寬高計算
4.2 background-size根據圖片的大小進行計算. 需要注意的時, 當使用單個百分比(比如
background-size: 50%;
)計算時, height會隱式設為auto
, 當其height計算出來的值大於容器的高度時, 超出部分會隱藏. 如果需要全部顯示, 需要明確設定寬和高的值(比如,background-size: 50% 50%;
)