你可能不知道的 css 內容塊

2022-08-05 18:06:15 字數 2797 閱讀 1385

我們都知道元素都擁有position這個css屬性,先來看看他的基本定義和可用值。

position決定了元素位置是如何被渲染的值描述

static

預設值,元素在文件流中依次渲染

absolute

元素位置相對於其最近的非 static 的父元素

fixed

元素位置相對於瀏覽器視窗

relative

元素位置相對於原本應該渲染的位置

sticky

根據滾動的位置在 relative 和 fixed 之間切換

initial

設定為預設值

inherit

從父元素繼承

this is a paragraph!

body 

section

p

很好,與我們期望的一樣渲染出來了。現在我們把sectiondisplay屬性 換成inline

section
這個破壞真是立竿見影啊,為什麼會這樣呢?要知曉其中的奧祕,就要了解什麼是內容塊。

通常情況下,元素的大小和位置都取決他的內容塊。一般地,內容塊是該元素最近的塊級父元素,但有一些例外情況。

元素的大小和位置都是由其內容塊做為參考的,他會影響到元素的width,height,padding,margin還有offset相關的屬性。

positionstatic或者relative時,其內容塊是其最近的塊級父元素的內容框(content-box),比如block,inline-block,list-item,或者是被指定為某種格式容器的元素,比如table,flex,grid

positionabsolute時,其內容塊是其最近的position不是static的塊級父元素的填充框(padding-box)。

positionfixed時,其內容塊是整個檢視視窗(viewport)

positionabsolute或者fixed時,其內容塊也可能是有下列特殊情況的最近的父元素的填充框(padding-box)。

height,topbottom依據內容塊的height值進行百分比計算。如果內容塊是static或者relative,並且沒有設定高度,依靠其內容決定高度,那麼這些值都會變成0

width,left,right,padding,margin依據內容塊的width值進行百分比計算。

現在我們瞭解了內容快的概念之後,再來看看上面的例子,p最近的父元素是section, 被設定為inline之後不再是塊級元素,所以body變成了離p最近的塊級父元素,此時內部的百分比計算都依據body的寬高做對應計算。

我們再看看別的例子

現在我們將第一個例子中的pposition設定為absolute,sectioninline改回block,

body 

section

p

由於p設定為了absolute, 顯而易見他的大小尺寸都根據了瀏覽器視窗來計算,注意這裡也經歷了尋找內容塊的過程。p的祖先元素均是static,所以瀏覽器視窗才成為了其內容塊。

現在我們還不錯,一切都在掌握之中,我們試著把sectiontransform設定為rotate(0deg),旋轉了 0 度,可以預計到本來應該沒有視覺上的效果,但這麼做會影響對內容塊的決定,從而導致p的大小和位置變化。

section 

p

看!由於我們為section設定了transformp的內容塊不再是瀏覽器視窗了,而是section

css 的世界就是這麼奇妙,表面上看上去酷炫多彩,內心維護著自己的規則世界。有時候產生了一些讓人疑惑不解的 bug ...不過,通過**其本質,迷霧終會散盡,bug 總會改完的。

希望大家都 get 到了新技能,下回再見!

首發於自己的 github/kimochg/tinythoughts

你可能不知道的viewport

前幾天偶然看到一個pc端網頁,發現用手機開啟竟然同比縮放了,作為一個前端從業者,我自然想要弄清它到底是怎麼縮放的。之後查了它的meta資訊,...

詳解php中switch你可能不知道的事

switch的常規用法是傳遞一個引數然後逐一跟case對比 switch variable 在分支比較多的時候 switch要比if else if好用 比如 if value else if value2 else if value3 else if value4 value5 用switch來寫...

你不知道的HTML CSS

flex佈局 如果想把div作為一個元素任意放置,實現複雜的佈局,就需要float left屬性。 但是浮動會將元素移出文件流,父元素無法包裹它,有以下幾個方法可選擇,而clean left可以將之後的元素還原,被清除的元素不會被提升到浮動元素的旁邊。 要想強迫父元素包圍其浮動的子元素,有三種方式 ...