簡單選擇器
復合選擇器
首先復合選擇器是以多個簡單選擇器構成的,只要把簡單選擇器挨著寫就變成一個復合選擇器了。它的語義就是我們選中的元素必須同時 match 幾個簡單選擇器,形成了 “與” 的關系。
復雜選擇器
復合選擇器中間用連接符就可以變成復雜選擇器了,復雜選擇器是針對一個元素的結構來進行選擇的。
偽類其實是一類非常多的內容的簡單選擇器。
一旦使用了:link 或者:visited 之后,我們就再也無法對這個元素的文字顏色之外的屬性進行更改。為什么要這樣設計呢?因為一旦我們使用了 layout 相關的屬性,比如說我們給:visited 的尺寸加大一點,它就會影響排班。這樣我們就可以通過 JavaScript 的 API 去獲取這個鏈接是否被訪問過了。但是如果我們能獲得鏈接是否被訪問過了,那么我們就可以知道用戶訪問過那些網站了,這個對于瀏覽器的安全性來說是一個致命打擊。所以這里也提醒一下大家,不要以為做一些表現性的東西與安全沒有任何關系,其實安全性是一個綜合的考量。CSS 它也能造成安全漏洞的。
:nth-child 是一個非常復雜的偽類,里面支持一種語法,比如說可以在括號里面寫奇偶event 或者odd,也可以寫4N+1、3N-1,這個就會分別匹配到整數的形態。因為這個是一個比較復雜的選擇器,我們就不要在里面寫過于復雜的表達式了,只用它來處理一下奇偶,逢3個多1個,逢4個多1個等等這種表達式。
其實empty 、nth-last-child、last-child、only-child 這兩個選擇器,是破壞了我們之前在 《實現中學習瀏覽器原理》中的說到的 CSS 計算的時機問題。我們可以想象一下,當我們在開始標簽計算的時候,肯定不知道它有沒有子標簽。empty 影響不是特別大,但是last-child 的這個關系其實還是影響蠻大的。所以瀏覽在實現這些的時候是做了特別處理的,要么就是瀏覽器實現的不是特別好,要么就是瀏覽器要耗費更大的性能來得以實現。所以建議大家盡量避免大量使用這些。
這里還是想溫馨建議一下大家,不建議大家把選擇器寫的過于復雜,我們很多時候都可以多加一點 class 去解決的。如果我們的選擇器寫的過于復雜,某種程度上意味著 HTML 結構寫的不合理。我們不光是為了給瀏覽器工程省麻煩,也不光是為了性能,而是為了我們自身的代碼結構考慮,所以我們不應該出現過于復雜的選擇器。
一共分為 4 種
::before 和::after 是在元素的內容的前和后,插入一個偽元素。一旦應用了 before 和 after 的屬性,declaration(聲明)里面就可以寫一個叫做content 的屬性(一般元素是沒有辦法寫 content 的屬性的)。content 的屬性就像一個真正的 DOM 元素一樣,可以去生成盒,可以參與后續的排版和渲染了。所以我們可以給他聲明border、background等這樣的屬性。
可以理解為:偽元素向界面上添加了一個不存在的元素。
::first-line 和::first-letter 的機制就不一樣了。這兩個其實原本就存在 content 之中。他們顧名思義就是 選中“第一行” 和選中 “第一個字母”。它們 不是一個不存在的元素,是把一部分的文本括了起來讓我們可以對它進行一些處理。
在我們概念里,我們可以認為帶有 before 偽元素的選擇器,會給他實際選中的元素的內容前面增加了一個元素,我們只需要通過他的 content 屬性為它添加文本內容即可。(這里我們也可以給偽元素賦予content: '' 為空的)所以我們可以任何的給 before 和 after 指定 display 屬性,和不同元素一樣比較自由的。
我們在實現一些組建的時候,也會常常使用這種不污染 DOM 樹,但是能實際創造視覺效果的方式來給頁面添加一些修飾性的內容。
<div>
<::before/>
content content content content
content content content content
content content content content
content content content content
<::after/>
</div>
first-letter 相當于我們有一個元素把內容里面的第一個字母給括了起來。這個first-letter 我們是可以任意聲明各種不同的屬性的,但是我們是無法改變它的 content 的。我們應該都看到過報紙上的第一個字母會比較大,然后會游離出來的效果,這個在 CSS 里面我們就可以用::first-letter的偽元素選擇器了。使用這個來實現相比用 JavaScript 來實現就會更加穩定和代碼更加優雅一些。
<div>
<::first-letter>c</::first-letter>ontent content content content
content content content content
content content content content
content content content content
</div>
first-line 是針對排版之后的line,其實跟我們源碼里面的first line 沒有任何的關系的。假如說我們的瀏覽器提供的渲染的寬度不同,first-line 在兩個環境里面它最終括住的元素數量就不一樣多了。所以我們用這個選擇器的時候需要去根據需求的情況使用,很有可能在我們開發機器上和用戶的機器上渲染出來的效果是不一樣的!
【 微信掃一掃 】