這篇紀錄了CSS中不算少見、卻也有些難理解的東西
DOM Tree之中不涵蓋偽元素及偽類別,可以對DOM元素以外的部分做一些修飾、點綴。
偽元素前面通常會掛上兩個冒號::
偽元素不是真正的元素,而是看起來很像元素的虛擬元素,看的到他、卻不存在於DOM結點上。
偽元素因為是假的,必須要加上content
屬性才會存在
HTML
...
<div class="a"> DIV </div>
...
CSS
* :not(body){
outline: 3px orange solid;
}
.a{
content: "這裡打啥都不會出現";
}
.a::before{
content: 'before ';
}
.a::after{
content: 'after ';
}
可以看到<body>
裡只出現一個<div>
標籤,<div>
元素底下的內容(content)分別是::before
、DIV文字、::after
,::before
與::after
內容完全不會出現在Chrome瀏覽器的檢查元素中。
而元素border橘色框框居然也只有框出<div>
標籤,沒有框出偽元素,可見他根本就不是元素嘛!
CSS
.a{
outline: 3px orange solid;
content: "改成這樣也不會出現偽元素的邊框";
}
因為偽元素能夠畫面中呈現的文字並不是因為HTML Element的關係,而是靠CSS渲染出來的,就像幽靈人口,
除非有額外爬CSS、對CSS來作解析,否則爬蟲光是爬HTML或JS是無法爬到偽元素內容的
我們在這個元素掛上偽元素,讓偽元素實體化後,便可對元素進行一些額外的間接操作。
對偽元素加上display: block;
以及width
、height
,讓他具有實體寬高。
CSS
.a::before{
content: 'before ';
display: block;
width: 100px;
height: 100px;
background: yellowgreen;
}
.a::after{
content: 'after ';
display: block;
width: 100px;
height: 100px;
background: yellow;
}
我們來玩一下,
讓HTML只留下空白標籤、稍加修改一下CSS並且加上前一章的絕對定位 position: absolute;
另外將相對定為點設在長出偽元素的元素身上。
HTML
...
<div class="a"></div>
...
CSS
.a{
position: relative;
}
.a::before{
content: 'before ';
display: block;
width: 150px;
height: 150px;
background: yellowgreen;
position: absolute;
}
.a::after{
content: 'after ';
display: block;
width: 100px;
height: 100px;
background: yellow;
position: absolute;
}
嗯,這樣感覺很酷,
透過偽元素,我們可以辦到只用一個元素時做不到的事情、效果
::before
、::after
::before
、::after
是較常出現的兩大宗,
一個指定在該元素前、一個指定在該元素後出現
另外比較常見的還有::first-letter
指定元素內容中的第一個文字::first-line
指定元素內容中第一行文字
等等
偽類別前面通常會掛上一個冒號:
偽類別不是真正的類別(class),而是當元件處於一或多個特定狀態時去做選取,
依照使用者互動動態行為而讓當網頁元素處於特殊狀態、事件時(例如被滑鼠覆蓋、被點擊、被選取等等),
我們可以透過一些偽類別來描述出上述的變化狀態,並根據元素的狀態而設置元素樣式、加以修飾。
偽類別能對DOM產生影響。
常見的有:link
、:visited
未被造訪過、以造訪過的連結:hover
、:active
滑鼠在上方懸浮、被滑鼠選中:checked
、:focus
單選或複選框被確認、元素被聚焦:is()
、:not()
是或否匹配的選取器:first-chid
、:last-child
指定元素底下的第一個、最後一個子元素:only-child
指定元素底下只有單個子元素(沒有其他兄弟):nth-child()
、:nth-col()
元素底下第N個子元素、表格網格(table、grid)第N欄