我們都知道元素都擁有 position 這個 css 屬性,先來看看他的基本定義和可用值。
定義
position 決定了元素位置是如何被渲染的
可用值
static: 預設值,元素在文件流中依次渲染
absolute: 元素位置相對於其最近的非 static 的父元素
fixed: 元素位置相對於瀏覽器視窗
relative: 元素位置相對於原本應該渲染的位置
sticky: 根據滾動的位置在 relative 和 fixed 之間切換
initial: 設定為預設值
inherit: 從父元素繼承
基本用法
很好,與我們期望的一樣渲染出來了。現在我們把 section 的 display 屬性 換成 inline
這個破壞真是立竿見影啊,為什麼會這樣呢?要知曉其中的奧秘,就要了解什麼是內容塊。
內容塊
定義
通常情況下,元素的大小和位置都取決他的內容塊。一般地,內容塊是該元素最近的塊級父元素,但有一些例外情況。
為什麼內容塊很重要
如何找到元素對應的內容塊
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)。
從內容塊計算百分比
height, top 和 bottom 依據內容塊的 height 值進行百分比計算。如果內容塊是 static 或者 relative,並且沒有設定高度,依靠其內容決定高度,那麼這些值都會變成 0。
width, left, right, padding, margin 依據內容塊的 width 值進行百分比計算。
例子解釋
現在我們了解了內容快的概念之後,再來看看上面的例子,p 最近的父元素是 section, 被設定為 inline 之後不再是塊級元素,所以 body 變成了離 p 最近的塊級父元素,此時內部的百分比計算都依據 body 的寬高做對應計算。
absolute的用例
我們再看看別的例子
現在我們將第乙個例子中的 p 的 position 設定為 absolute, section 從 inline 改回 block,
由於 p 設定為了 absolute, 顯而易見他的大小尺寸都根據了瀏覽器視窗來計算,注意這裡也經歷了尋找內容塊的過程。p 的祖先元素均是 static,所以瀏覽器視窗才成為了其內容塊。
現在我們還不錯,一切都在掌握之中,我們試著把 section 的 transform 設定為 rotate(0deg),旋轉了 0 度,可以預計到本來應該沒有視覺上的效果,但這麼做會影響對內容塊的決定,從而導致 p 的大小和位置變化。
看!由於我們為 section 設定了 transform,p 的內容塊不再是瀏覽器視窗了,而是 section。
總結
css 的世界就是這麼奇妙,表面上看上去酷炫多彩,內心維護著自己的規則世界。有時候產生了一些讓人疑惑不解的 bug ...不過,通過**其本質,迷霧終會散盡,bug 總會改完的。
希望大家都 get 到了新技能,下回再見!
你可能不知道的 css 內容塊
我們都知道元素都擁有position這個css屬性,先來看看他的基本定義和可用值。position決定了元素位置是如何被渲染的值描述 static 預設值,元素在文件流中依次渲染 absolute 元素位置相對於其最近的非 static 的父元素 fixed 元素位置相對於瀏覽器視窗 relativ...
你可能不知道的 css 內容塊
我們都知道元素都擁有 position 這個 css 屬性,先來看看他的基本定義和可用值。定義 position 決定了元素位置是如何被渲染的 可用值 static 預設值,元素在文件流中依次渲染 absolute 元素位置相對於其最近的非 static 的父元素 fixed 元素位置相對於瀏覽器視...
你可能不知道的 css 內容塊
我們都知道元素都擁有position這個css屬性,先來看看他的基本定義和可用值。position決定了元素位置是如何被渲染的值描述 static 預設值,元素在文件流中依次渲染 absolute 元素位置相對於其最近的非 static 的父元素 fixed 元素位置相對於瀏覽器視窗 relativ...