咱們都知道元素都擁有 position
這個css屬性,先來看看他的基本定義和可用值。css
position
決定了元素位置是如何被渲染的html
值 | 描述 |
---|---|
static | 默認值,元素在文檔流中依次渲染 |
absolute | 元素位置相對於其最近的非 static 的父元素 |
fixed | 元素位置相對於瀏覽器窗口 |
relative | 元素位置相對於本來應該渲染的位置 |
sticky | 根據滾動的位置在 relative 和 fixed 之間切換 |
initial | 設置爲默認值 |
inherit | 從父元素繼承 |
<body> <section> <p>This is a paragraph!</p> </section> </body>
body { background: beige; } section { display: block; width: 400px; height: 160px; background: lightgray; } p { width: 50%; /* == 400px * .5 = 200px */ height: 25%; /* == 160px * .25 = 40px */ margin: 5%; /* == 400px * .05 = 20px */ padding: 5%; /* == 400px * .05 = 20px */ background: cyan; }
很好,與咱們指望的同樣渲染出來了。如今咱們把 section
的 display
屬性 換成 inline
git
section { display: inline; width: 400px; height: 160px; background: lightgray; }
這個破壞真是立竿見影啊,爲何會這樣呢?要知曉其中的奧祕,就要了解什麼是內容塊。github
一般狀況下,元素的大小和位置都取決他的內容塊。通常地,內容塊是該元素最近的塊級父元素,但有一些例外狀況。瀏覽器
元素的大小和位置都是由其內容塊作爲參考的,他會影響到元素的 width
, height
, padding
, margin
還有 offset
相關的屬性。flex
position
是 static
或者 relative
時,其內容塊是其最近的塊級父元素的內容框(content-box),好比 block
, inline-block
, list-item
,或者是被指定爲某種格式容器的元素,好比 table
, flex
, grid
。position
是 absolute
時,其內容塊是其最近的 position
不是 static
的塊級父元素的填充框(padding-box)。position
是 fixed
時,其內容塊是整個視圖窗口(viewport)position
是 absolute
或者 fixed
時,其內容塊也多是有下列特殊狀況的最近的父元素的填充框(padding-box)。spa
transform
或者 perspective
被設置過或將被設置不爲 none
。filter
被設置或將被設置不爲 none
。height
, top
和 bottom
依據內容塊的 height
值進行百分比計算。若是內容塊是 static
或者 relative
,而且沒有設置高度,依靠其內容決定高度,那麼這些值都會變成 0
。code
width
, left
, right
, padding
, margin
依據內容塊的 width
值進行百分比計算。orm
如今咱們瞭解了內容快的概念以後,再來看看上面的例子,p
最近的父元素是 section
, 被設置爲 inline
以後再也不是塊級元素,因此 body
變成了離 p
最近的塊級父元素,此時內部的百分比計算都依據 body
的寬高作對應計算。htm
咱們再看看別的例子
如今咱們將第一個例子中的 p
的 position
設置爲 absolute
, section
從 inline
改回 block
,
body { background: beige; } section { display: block; width: 400px; height: 160px; background: lightgray; } p { position: absolute; width: 50%; /* == 瀏覽器寬度的50% */ height: 25%; /* == 瀏覽器高度的25% */ margin: 5%; /* == 瀏覽器寬度的5% */ padding: 5%; /* == 瀏覽器寬度的5% */ background: cyan; }
因爲 p
設置爲了 absolute
, 顯而易見他的大小尺寸都根據了瀏覽器窗口來計算,注意這裏也經歷了尋找內容塊的過程。p
的祖先元素均是 static
,因此瀏覽器窗口才成爲了其內容塊。
如今咱們還不錯,一切都在掌握之中,咱們試着把 section
的 transform
設置爲 rotate(0deg)
,旋轉了 0 度,能夠預計到原本應該沒有視覺上的效果,但這麼作會影響對內容塊的決定,從而致使 p
的大小和位置變化。
section { transform: rotate(0deg); width: 400px; height: 160px; background: lightgray; } p { position: absolute; ... }
看!因爲咱們爲 section
設置了 transform
,p
的內容塊再也不是瀏覽器窗口了,而是 section
。
css 的世界就是這麼奇妙,表面上看上去酷炫多彩,心裏維護着本身的規則世界。有時候產生了一些讓人迷惑不解的 bug ...不過,經過探究其本質,迷霧終會散盡,bug 總會改完的。
但願你們都 get 到了新技能,下回再見!
首發於本身的 github/kimochg/TinyThoughts