CSS - 偽元素
偽類與偽元素
偽類(Pseudo-classes )與偽元素(Pseudo-element)兩者都是 CSS 為了擴張變化性而衍生出的選擇器,偽類以元素狀態、結構為主要的選擇方式:
- :checked(狀態)
- :focus(狀態)
- :root(結構)
- :first-child(結構)
- :nth-child(結構)
而偽元素則是以 before、after 這兩兄弟為主要被探討的對象,可以說是偽元素的代名詞!截至目前為止,偽元素家族比起偽類家族,算是少數。追朔早期,偽元素與偽類一樣,都是以單冒號:
為主,至今依舊可以使用單冒號來選擇偽元素,但從 CSS3 開始,偽類與偽元素開始分家,偽元素被定義成雙冒號::
作為選擇器,隨著前端技術我們必須修正前進,應該使用雙冒號來表示偽元素,不要使用單冒號。
- ::before
- ::after
- ::first-line
- ::first-letter
- ::selection
- ::backdrop
以瀏覽器來看偽類與偽元素,進入開發者模式,偽類不會出現在 Elements 結構畫面,但是偽元素 ::before、::after 會在被選擇的元素內容前後出現,雖然它們可以長在 DOM 身上,但依舊不被 DOM 接納,只能被 CSSOM 所渲染,因此不能使用 JavaScript 或 jQuery 任何獲取 DOM 元素的方式選擇到偽元素。
偽元素建立與特性
這裡的偽元素指的是 ::before 與 ::after 。
- content 是必須的屬性,沒有無法建立偽元素。
- 被建立時,類型為 inline。
- 通常要 display 轉型才能做較多的事情。
- 與絕對定位一起使用時,別忘記本體的定位點。
- img、input、iframe 等置換元素無法使用偽元素。
/* 建立偽元素時,一定要有 content */ |
偽元素是元素的分身
元素如果是主體,::before 與 ::after 兩兄弟是元素主體的分身,也就是元素可以多出兩個容器來做更多事情。就好像 1942~1945 射擊遊戲兩側的小飛機,好吧,我知道沒人聽過。
又或像是火影忍者的影分身之術,聽過了...吧。
這兩分身應用非常多元、非常廣,難以一一談論,能發揮在各種場合,大致上可以分為修飾主體缺少的部分,或是替主體增加更多層次的樣式,又或是三位一體組合的概念,舉個例子,我要畫米老鼠的頭部,元素主體畫了圓臉,兩分身再各畫一隻圓耳朵,這樣只用了一個元素做到了三個圓的樣式。因此,偽元素具有節省元素數量的效果,不用為了做一個效果而多使用一個元素標籤。
偽元素的層級
可以從 html 結構看出在一般流向裡面,::before 之後接著是主體的內容區域,再接著::after。因此若對::before 與::after 進行絕對定位,兩者都會被拉升至定位層蓋住主體的內容區域。當然,若對主體內容區域使用絕對定位,則三者都進入定位層,又會依照排列順序後者蓋過前者(::before < 內容 < ::after)。可以使用 z-index:-1 將一個調至最下層。