本文轉(zhuǎn)載自:眾成翻譯
譯者:為之漫筆
鏈接:http://www.zcfy.cc/article/239
原文:https://www.smashingmagazine.com/2016/05/an-ultimate-guide-to-css-pseudo-classes-and-pseudo-elements/#?
剛開(kāi)始從事Web設(shè)計(jì)時(shí),我犯了很多錯(cuò)誤,也因此獲得了進(jìn)步。那時(shí)候沒(méi)有Smashing Magazine、Can I Use、_ CodePen_,也沒(méi)有其他我們現(xiàn)在常見(jiàn)的工具。只要有人能告訴一個(gè)設(shè)計(jì)思路,特別是CSS前沿方向的,那就謝天謝地了。
今天我的經(jīng)驗(yàn)已經(jīng)很豐富了,所以想本著友好、隨意、探討的原則,跟大分享一下CSS中的偽類和偽元素。
如果你已經(jīng)是有經(jīng)驗(yàn)的Web設(shè)計(jì)者和開(kāi)發(fā)者了,那么一定對(duì)本文要討論的偽類和偽元素有所了解。不過(guò),還是建議你先看看本文后面完整的列表,看有沒(méi)有一兩個(gè)你還不知道的?
在真正開(kāi)始之前,因?yàn)槲覀兿胫v偽類和偽元素嘛,所以先問(wèn)個(gè)基本的問(wèn)題:你知道這里的“偽”是什么意思嗎?不確定的話,可以參考Dictionary.com的定義:
形容詞
1. 不是真實(shí)的但有其外觀;偽裝的;假的或欺騙的;騙人的。
2. 差不多,很接近,或盡可能一樣。
不用管W3C是怎么定義的,反正偽類就是某個(gè)元素的一種虛擬狀態(tài),或者說(shuō)一種特有的性質(zhì),這種狀態(tài)或性可以通過(guò)CSS捕捉到。常見(jiàn)的偽類有::link
、:visited
、:hover
、:active
、:first-child
和:nth-child
。當(dāng)然這只是一少部分,一會(huì)兒我們都會(huì)介紹。
偽類是一個(gè)冒號(hào)(:
)后跟偽類的名字構(gòu)成的,有時(shí)候名字后面還會(huì)有一個(gè)放在括號(hào)里的值。:nth-child
是第幾個(gè)?
好了,再說(shuō)偽元素。偽元素是一種虛擬的元素,CSS把它當(dāng)成普通HTML元素看待。之所以叫偽元素,就因?yàn)樗鼈冊(cè)谖臋n樹(shù)或DOM中并不實(shí)際存在。換句話說(shuō),我們不會(huì)在HTML中包含偽元素,只會(huì)通過(guò)CSS來(lái)創(chuàng)建偽元素。
以下是幾個(gè)常見(jiàn)的偽元素::after
、:before
和:first-letter
。偽元素會(huì)在本文后面介紹。
偽元素是一個(gè)冒號(hào)還是兩個(gè)冒號(hào)?
簡(jiǎn)單回答:多數(shù)情況下,都行。
兩個(gè)冒號(hào)(::
)是CSS3為了區(qū)分::before
、::after
這樣的偽元素和:hover
、:active
等偽類才引入的。除了IE8及以下版本,所有瀏覽器都支持兩個(gè)冒號(hào)的偽元素表示法。
不過(guò),有些偽元素只能使用兩個(gè)冒號(hào),像::backdrop
。
我個(gè)人使用一個(gè)冒號(hào),為了跟以前的瀏覽器兼容。當(dāng)然,不用兩個(gè)冒號(hào)不行的時(shí)候,還是要用兩個(gè)冒號(hào)。
這里沒(méi)有對(duì)錯(cuò),完全看你個(gè)人喜好。
不過(guò),我在寫(xiě)這篇文章時(shí)查了一下,規(guī)范建議使用單冒號(hào)表示法,原因也是向后兼容:
請(qǐng)注意CSS3中表示偽元素使用雙冒號(hào),比如
a::after { … }
,這是為了與偽類區(qū)分開(kāi)。偽類應(yīng)該是在CSS中經(jīng)常出現(xiàn)的。不過(guò),CSS3也允許單冒號(hào)的偽元素,目的是向后兼容。我們也建議暫時(shí)使用單冒號(hào)。
如果偽元素同時(shí)支持單、雙冒號(hào)的形式,本文標(biāo)題會(huì)給出兩種形式。如果只支持雙冒號(hào),那就只有一種形式。
什么時(shí)候使用(不使用)生成的內(nèi)容
通過(guò)CSS生成內(nèi)容需要用到CSS屬性content
和偽元素:before
或:after
。
其中的“內(nèi)容”(content
)可是純文本,也可以是一個(gè)容器,通過(guò)CSS操作來(lái)顯示某種圖形或者裝飾性元素。本文只介紹第一種內(nèi)容,即文本。
重要的內(nèi)容可不要使用生成的內(nèi)容,原因如下:
- 屏幕閱讀器讀不到它
- 無(wú)法選中
- 如果為了裝飾而在生成內(nèi)容中使用了多余的內(nèi)容,那么支持CSS生成內(nèi)容的屏幕閱讀器會(huì)大聲地把它讀出來(lái),導(dǎo)致用戶體驗(yàn)更差
CSS生成的內(nèi)容只適用于裝飾性、不重要的內(nèi)容,但也要確保屏幕閱讀器能夠適當(dāng)處理它,讓使用這些輔助技術(shù)的用戶不至于分心。這里適用“漸進(jìn)增強(qiáng)”原則。
在Smashing Magazine上,Gabriele Romanato為此寫(xiě)過(guò)一篇非常棒的文章。
實(shí)驗(yàn)性偽類和偽元素
實(shí)驗(yàn)性的偽類和偽元素,指的是那些不穩(wěn)定或沒(méi)最終定案的偽類和偽元素。它們的語(yǔ)法和行為還可能有變。
不過(guò),加上廠商前綴就可以使用這些實(shí)驗(yàn)性的偽類和偽元素。可以參考Can I Use,以及一些自動(dòng)加前綴的工具,比如-prefix-free或Autoprefixer就是必備的。
本文會(huì)在實(shí)驗(yàn)性的偽類和偽元素的名字旁邊加上“experimental”標(biāo)簽。
全部偽類和偽元素(按字母順序)
:active
::after/:after
::backdrop (experimental)
::before/:before
:checked
:default
:dir (experimental)
:disabled
:empty
:enabled
:first-child
::first-letter/:first-letter
::first-line/:first-line
:first-of-type
:focus
:fullscreen (experimental)
:hover
:in-range
:indeterminate
:invalid
:lang
:last-child
:last-of-type
:link
:not
:nth-child
:nth-last-child
:nth-last-of-type
:nth-of-type
:only-child
:only-of-type
:optional
:out-of-range
::placeholder (experimental)
:read-only
:read-write
:required
:root
::selection
:scope (experimental)
:target
:valid
:visited
Bonus content: A Sass mixin for links
好啦,諸位,好戲開(kāi)場(chǎng)了!
偽類
首先,我們討論偽類,從狀態(tài)偽類開(kāi)始。
狀態(tài)偽類
狀態(tài)偽類通常出現(xiàn)在用戶執(zhí)行某個(gè)操作的情況下。在CSS里,“操作”也可以是“無(wú)操作”,比如尚未點(diǎn)過(guò)的鏈接。
下面就有請(qǐng)它們一個(gè)一個(gè)地上場(chǎng)。
:LINK
:link
偽類表示鏈接的正常狀態(tài),選擇那些尚未被點(diǎn)過(guò)的鏈接。建議在其他鏈接相關(guān)的偽類之前聲明:link
,它們的順序?yàn)椋?code>:link、:visited
、:hover
、:active
。
a:link {
color: orange;
}
當(dāng)然,這個(gè)偽類也可以省略:
a {
color: orange;
}
:VISITED
:visited
偽類選擇點(diǎn)過(guò)的鏈接,應(yīng)該聲明在第二位(在:link
之后)。
a:visited {
color: blue;
}
:HOVER
:hover
偽類在用戶指針懸停時(shí)生效。而且它不只可以用于鏈接。
它應(yīng)該在第三位(在:visited
之后)。
a:hover {
color: orange;
}
看示例:http://codepen.io/ricardozea/pen/vGEzJK
:ACTIVE
:active
偽類選擇被鼠標(biāo)指針或觸摸操作“激活的” 元素,也可以通過(guò)鍵盤(pán)來(lái)激活,就像:focus
偽類一樣。
與:focus
類似,但區(qū)別在于:active
只發(fā)生在鼠標(biāo)被按下到被釋放的這段時(shí)間里。
它應(yīng)該在第四位(在hover
后面)。
a:active {
color: rebeccapurple;
}
:FOCUS
:focus
用于選擇已經(jīng)通過(guò)指針設(shè)備、觸摸或鍵盤(pán)獲得焦點(diǎn)的元素,在表單里使用得非常多。
a:focus {
color: green;
}
或者:
input:focus {
background: #eee;
}
擴(kuò)展內(nèi)容:Sass中針對(duì)鏈接的混入
如果你用過(guò)CSS預(yù)處理器,那應(yīng)該對(duì)這一部分感興趣。
(如果你不熟悉CSS預(yù)處理器,沒(méi)問(wèn)題,跳過(guò)這一節(jié),直接看下一節(jié)吧。)
為了簡(jiǎn)化CSS編碼工作,這里介紹一下創(chuàng)建一組基本的鏈接樣式的Sass混入(mixin)。
這里的混入沒(méi)有默認(rèn)參數(shù),因此我們必須以一種友好的方式,聲明鏈接的全部4種狀態(tài)。
:focus
和:active
偽類的聲明通常在一塊,當(dāng)然也可以給它們分開(kāi)。
注意這個(gè)混入不僅僅適用于鏈接,而是適用于任何 HTML元素。
這就是我們定義的混入:
@mixin links ($link, $visited, $hover, $active) {
& {
color: $link;
&:visited {
color: $visited;
}
&:hover {
color: $hover;
}
&:active, &:focus {
color: $active;
}
}
}
使用方法:
a {
@include links(orange, blue, yellow, teal);
}
編譯結(jié)果:
a {
color: orange;
}
a:visited {
color: blue;
}
a:hover {
color: yellow;
}
a:active, a:focus {
color: teal;
}
看示例:http://codepen.io/ricardozea/pen/wMyZQe
結(jié)構(gòu)化偽類
結(jié)構(gòu)化偽類選擇通過(guò)其他選擇符無(wú)法選擇的文檔樹(shù)或DOM中的其他信息。
:FIRST-CHILD
:first-child
偽類選擇父元素的第一個(gè)子元素。
在下面的例子中,只有第一個(gè)li
元素的文本是橙色的。
HTML:
<ul>
<li>This text will be orange.</li>
<li>Lorem ipsum dolor sit amet.</li>
<li>Lorem ipsum dolor sit amet.</li>
</ul>
CSS:
li:first-child {
color: orange;
}
:FIRST-OF-TYPE
:first-of-type
偽類選擇父元素容器內(nèi)任意類型子元素的第一個(gè)元素。
在下面的例子中,第一個(gè)li
元素和第一個(gè)span
元素的文本才是橙色的。
HTML:
<ul>
<li>This text will be orange.</li>
<li>Lorem ipsum dolor sit amet. <span>This text will be orange.</span></li>
<li>Lorem ipsum dolor sit amet.</li>
</ul>
CSS:
ul :first-of-type {
color: orange;
}
:LAST-CHILD
:last-child
偽類選擇父元素的最后一個(gè)子元素。
在下面的例子中,只有最后一個(gè)li
元素的文本是橙色的。
HTML:
<ul>
<li>Lorem ipsum dolor sit amet.</li>
<li>Lorem ipsum dolor sit amet.</li>
<li>This text will be orange.</li>
</ul>
CSS:
li:last-child {
color: orange;
}
:LAST-OF-TYPE
:last-of-type
偽類選擇父元素容器內(nèi)任意類型子元素的最后一個(gè)元素。
在下面的例子中,最后一個(gè)li
元素和最后一個(gè)span
元素的文本才是橙色的。
HTML:
<ul>
<li>Lorem ipsum dolor sit amet. <span>Lorem ipsum dolor sit amet.</span> <span>This text will be orange.</span></li>
<li>Lorem ipsum dolor sit amet.</li>
<li>This text will be orange.</li>
</ul>
CSS:
ul :last-of-type {
color: orange;
}
:NOT
:not
偽類也叫取反偽類,它通過(guò)括號(hào)接受一個(gè)參數(shù),一個(gè)“選擇符”。實(shí)際上,這個(gè)參數(shù)也可以是另一個(gè)偽類。
這個(gè)偽類可以連綴使用,但不能包含別的:not
選擇符。
在下面的例子中,:not
偽類選擇與參數(shù)不匹配的元素。
HTML:
<ul>
<li class="first-item">Lorem ipsum dolor sit amet.</li>
<li>Lorem ipsum dolor sit amet.</li>
<li>Lorem ipsum dolor sit amet.</li>
<li>Lorem ipsum dolor sit amet.</li>
</ul>
CSS:
應(yīng)用下面的CSS,除了類為.first-item
的li
之外的li
元素的文本都是橙色的:
li:not(.first-item) {
color: orange;
}
下面看一看“連綴”兩個(gè):not
偽類。應(yīng)用下面的CSS規(guī)則,除了類為.first-item
的li
和最后一個(gè)li
,其他li
都會(huì)有黃色背景和黑色文本:
li:not(.first-item):not(:last-of-type) {
background: yellow;
color: black;
}
看示例:http://codepen.io/ricardozea/pen/dGmqbg
:NTH-CHILD
:nth-child
偽類根據(jù)元素在標(biāo)記中的次序選擇相應(yīng)的元素。
這個(gè)偽類在CSS中是用途最廣、支持也最廣的。
所有:nth
偽類都接受一個(gè)參數(shù),這個(gè)參數(shù)是一個(gè)公式。公式可以是一個(gè)整數(shù),或者關(guān)鍵字odd
、even
,或者形如an+b
的結(jié)構(gòu)。
對(duì)于an+b
:
-
a
是一個(gè)數(shù)值(整數(shù)) -
n
就是n
-
+
是運(yùn)算符,可以是加號(hào)+
或減號(hào)-
-
b
也是一個(gè)整數(shù),但只有使用了運(yùn)算符的時(shí)候才會(huì)用到
以希臘字母的英文列表為例,以下是HTML標(biāo)記結(jié)構(gòu):
<ol>
<li>Alpha</li>
<li>Beta</li>
<li>Gamma</li>
<li>Delta</li>
<li>Epsilon</li>
<li>Zeta</li>
<li>Eta</li>
<li>Theta</li>
<li>Iota</li>
<li>Kappa</li>
</ol>
CSS:
選擇第2個(gè)子元素,結(jié)果Beta會(huì)變成橙色:
ol :nth-child(2) {
color: orange;
}
從第2個(gè)子元素起,隔一個(gè)選一個(gè),結(jié)果Beta、Delta、Zeta、Theta和Kappa會(huì)變成橙色:
ol :nth-child(2n) {
color: orange;
}
選擇所有偶數(shù)個(gè)子元素:
ol :nth-child(even) {
color: orange;
}
從第6個(gè)子元素起,隔一個(gè)選一個(gè),結(jié)果Zeta、Theta和Kappa會(huì)變成橙色:
ol :nth-child(2n+6) {
color: orange;
}
看示例:http://codepen.io/ricardozea/pen/adYaER
:NTH-LAST-CHILD
除了是從后往前選擇元素,:nth-last-child
跟:nth-child
完全一樣。
CSS:
選擇倒數(shù)第2個(gè)子元素,只有Iota是橙色:
ol :nth-last-child(2) {
color: orange;
}
從倒數(shù)第2個(gè)子元素開(kāi)始,隔一個(gè)選一個(gè),結(jié)果Iota、Eta、Epsilon、Gamma和Alpha會(huì)變成橙色:
ol :nth-last-child(2n) {
color: orange;
}
從后往前,選擇所有偶數(shù)個(gè)子元素:
ol :nth-last-child(even) {
color: orange;
}
從倒數(shù)第6個(gè)元素開(kāi)始,隔一個(gè)選一個(gè),因此Epsilon、Gamma和Alpha會(huì)變成橙色:
ol :nth-last-child(2n+6) {
color: orange;
}
:NTH-OF-TYPE
:nth-of-type
偽類與:nth-child
類似,主要區(qū)別是它更具體了,只針對(duì)特定類型的元素。
在下面的例子中,所有容器內(nèi)的第2個(gè)p
元素將為橙色。
HTML:
<article>
<h1>Heading Goes Here</h1>
<p>Lorem ipsum dolor sit amet.</p>
<a href=""></a>
<p>This text will be orange.</p>
</article>
CSS:
p:nth-of-type(2) {
color: orange;
}
:NTH-LAST-OF-TYPE
:nth-last-of-type
偽類是從后往前數(shù),其余跟:nth-of-type
一樣。
對(duì)于下面的例子,因?yàn)槭菑哪┪查_(kāi)始,所以第1個(gè)段落會(huì)變成橙色。
HTML:
<article>
<h1>Heading Goes Here</h1>
<p>Lorem ipsum dolor sit amet.</p>
<a href=""></a>
<p>This text will be orange.</p>
</article>
CSS:
p:nth-last-of-type(2) {
color: orange;
}
相關(guān)資源
建議大家在使用:nth
偽類前,一定要參考下面這兩篇不錯(cuò)的文章:
- “CSS3 Structural Pseudo-Class Selector Tester” Lea Verou
- “:nth Tester” CSS-Tricks
:ONLY-CHILD
:only-child
選擇父元素中唯一的子元素。
在下面的例子中,第一個(gè)ul
只有一個(gè)子元素,因此該子元素將變成橙色。第二個(gè)ul
有多個(gè)子元素,因此其子元素不會(huì)受:only-child
偽類影響。
HTML:
<ul>
<li>This text will be orange.</li>
</ul>
<ul>
<li>Lorem ipsum dolor sit amet.</li>
<li>Lorem ipsum dolor sit amet.</li>
</ul>
CSS:
ul :only-child {
color: orange;
}
:ONLY-OF-TYPE
:only-of-type
偽類選擇同級(jí)中類型唯一的元素,與:only-child
類似,但針對(duì)特定類型的元素,讓選擇符有了更強(qiáng)的意義。
在下面的例子中,第一個(gè)ul
只有一個(gè)li
元素,因此其文本將為橙色。
HTML:
<ul>
<li>This text will be orange.</li>
</ul>
<ul>
<li>Lorem ipsum dolor sit amet.</li>
<li>Lorem ipsum dolor sit amet.</li>
</ul>
CSS:
li:only-of-type {
color: orange;
}
:TARGET
:target
偽類通過(guò)元素的ID及URL中的錨名稱選擇元素。
在下面的例子中,當(dāng)瀏覽器中的URL以#target
結(jié)尾時(shí),ID為target
的文章將被選中。
URL:
http://awesomebook.com/#target
HTML:
<article id="target">
<h1><code>:target</code> pseudo-class</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit!</p>
</article>
CSS:
:target {
background: yellow;
}
提示: background:
是background-color:
的簡(jiǎn)寫(xiě)形式,用于指定顏色時(shí)效果一樣。
驗(yàn)證偽類
表單驗(yàn)證一直是Web設(shè)計(jì)與開(kāi)始中最不好搞的。有了驗(yàn)證偽類,可以讓用戶填寫(xiě)表單的過(guò)程更平順。
有一點(diǎn)要注意,雖然本節(jié)介紹的偽類都用于表單元素,但其中有的偽類也可以用于其他HTML元素。
下面就來(lái)看看這些偽類吧!
:CHECKED
:checked
偽類選擇被勾選或選中的單選按鈕、多選按鈕及列表選項(xiàng)。
在下面的例子中,復(fù)選框被勾選后,標(biāo)簽會(huì)突出顯示,增加了用戶體驗(yàn)。
看示例:http://codepen.io/ricardozea/pen/wMYExY
:DEFAULT
:default
偽類從表單中一組類似元素里選擇默認(rèn)的元素(即“提交”按鈕。——譯者注)。
如果要選擇表單中沒(méi)有類的默認(rèn)按鈕,可以使用:default
。
注意,在表單中使用Reset或Clear按鈕會(huì)招致嚴(yán)重的可用性問(wèn)題,所以除非絕對(duì)必要再用。參考下面兩篇文章:
- “Reset and Cancel Buttons,” Nielsen Norman Group (2000)
- “Killing the Cancel Button on Forms for Good,” UX Movement (2010)
看示例:http://codepen.io/ricardozea/pen/WrzJKO
:DISABLED
:disabled
偽類選擇禁用狀態(tài)的表單元素。處于禁用狀態(tài)的元素,不能被選中、勾選,不能獲得焦點(diǎn)。
在下面的例子中,name
輸入框處于禁用狀態(tài),因此會(huì)半透明。
HTML:
<input type="text" id="name" disabled>
CSS:
:disabled {
opacity: .5;
}
提示: 標(biāo)記中是非要使用disabled="disabled"
,只寫(xiě)一個(gè)disabled
屬性就行了。在XHTML中,disabled="disabled"
這種寫(xiě)法才是必須的。
看示例:http://codepen.io/ricardozea/pen/NxOLZm
:EMPTY
:empty
偽類選擇其中不包含任何內(nèi)容的空元素。只要包含一個(gè)字母、其他HTML元素,甚至一個(gè)空格,都不算空。
關(guān)于空或非空,以下是定義:
-
空
元素中沒(méi)有內(nèi)容或字符。元素中包含HTML注釋不算有內(nèi)容。 -
非空
出現(xiàn)在元素中的字符。空格也算。
在下面的例子中,
- 第一個(gè)元素中包含文本,因此背景不會(huì)變成橙色
- 第二個(gè)元素包含一個(gè)空格,空格也是內(nèi)容,因此也不會(huì)有橙色背景
- 第三個(gè)元素中什么也沒(méi)有(空的),因此背景為橙色
- 最后一個(gè)元素中只有一個(gè)HTML注釋(也是空的),因此也有橙色背景。
HTML:
<div>This box is orange</div>
<div> </div>
<div></div>
<div><!-- This comment is not considered content --></div>
CSS:
div {
background: orange;
height: 30px;
width: 200px;
}
div:empty {
background: yellow;
}
看示例:http://codepen.io/ricardozea/pen/rxqqaM
:ENABLED
:enabled
偽類選擇啟用的元素。所有表單元素默認(rèn)都是啟用的,除非在標(biāo)記中添加了disabled
屬性。
通過(guò):enabled
和:disabled
可以提供視覺(jué)上的反饋,改善用戶體驗(yàn)。
在下面的例子中,禁用后又被啟用的name
輸入框的不透明度將變?yōu)?code>1,同時(shí)會(huì)有一個(gè)1像素的邊框:
:enabled {
opacity: 1;
border: 1px solid green;
}
提示: 標(biāo)記中是非要使用enabled="enabled"
,只寫(xiě)一個(gè)enabled
屬性就行了。在XHTML中,enabled="enabled"
這種寫(xiě)法才是必須的。
看示例:http://codepen.io/ricardozea/pen/zqYQxq
:IN-RANGE
:in-range
偽類選擇有范圍且值在指定范圍內(nèi)的元素。
在下面的例子中,輸入元素支持輸入5~10。輸入值在這個(gè)范圍內(nèi),會(huì)觸發(fā)綠色邊框。
HTML:
<input type="number" min="5" max="10">
CSS:
input[type=number] {
border: 5px solid orange;
}
input[type=number]:in-range {
border: 5px solid green;
}
看示例:http://codepen.io/ricardozea/pen/XXOKwq
:OUT-OF-RANGE
:out-of-range
偽類選擇有范圍且值超出指定范圍的元素。
在下面的例子中,輸入元素支持輸入1~12。輸入值超出這個(gè)范圍內(nèi),會(huì)觸發(fā)橙色邊框。
HTML:
<input id="months" name="months" type="number" min="1" max="12">`
CSS:
input[type=number]:out-of-range {
border: 1px solid orange;
}
看示例:http://codepen.io/ricardozea/pen/XXOKwq
:INDETERMINATE
:indeterminate
偽類選擇單選按鈕或復(fù)選框在頁(yè)面加載時(shí)沒(méi)有被勾選的。
比如,頁(yè)面加載后,一組單選按鈕中沒(méi)有默認(rèn)或預(yù)先勾選的,或者一個(gè)復(fù)選框已經(jīng)通過(guò)JavaScript設(shè)置為indeterminate
狀態(tài)。
HTML:
<ul>
<li>
<input type="radio" name="list" id="option1">
<label for="option1">Option 1</label>
</li>
<li>
<input type="radio" name="list" id="option2">
<label for="option2">Option 2</label>
</li>
<li>
<input type="radio" name="list" id="option3">
<label for="option3">Option 3</label>
</li>
</ul>
CSS:
:indeterminate + label {
background: orange;
}
看示例:http://codepen.io/ricardozea/pen/adXpQK
:VALID
:valid
偽類選擇輸入格式符合要求的表單元素。
在下面的例子中,email
輸入框中的電子郵箱格式是正確的,因此這個(gè)輸入框會(huì)被認(rèn)為有效,將出現(xiàn)1像素的綠色邊框:
input[type=email]:valid {
border: 1px solid green;
}
看示例:http://codepen.io/ricardozea/pen/bEzqVg
:INVALID
:invalid
偽類選擇輸入格式不符合要求的表單元素。
在下面的例子中,email
輸入框中的電子郵箱格式不正確,因此這個(gè)輸入框會(huì)被認(rèn)為無(wú)效,將出現(xiàn)橙色邊框:
input[type=email]:invalid {
background: orange;
}
看示例:http://codepen.io/ricardozea/pen/bEzqVg
:OPTIONAL
:optional
偽類選擇表單中非必填的輸入字段。換句話說(shuō),只要輸入字段中沒(méi)有required
屬性,就會(huì)被:optional
偽類選中。
在下面的例子中,這個(gè)數(shù)值字段是可以選填的,因此其中的文本將為灰色。
HTML:
<input type="number">
CSS:
:optional {
color: gray;
}
:READ-ONLY
:read-only
偽類選擇用戶不能編輯的元素,與:disabled
偽類相似,標(biāo)記中使用的屬性決定了使用哪個(gè)偽類。
不能編輯的元素可以用來(lái)顯示預(yù)先填好、不允許修改,但又需要連同表單一起提交的信息。
在下面的例子中,文本框有一個(gè)readonly
屬性,因此會(huì)被:read-only
偽類選中,文本將為灰色。
HTML:
<input type="text" value="I am read only" readonly>
CSS:
input:read-only {
color: gray;
}
看示例:http://codepen.io/ricardozea/pen/Nxopbj
:READ-WRITE
:read-write
偽類選擇用戶可以編輯的元素,適用于有contenteditable
屬性的HTML元素。
有時(shí)候,可以與:focus
偽類一塊使用以增強(qiáng)用戶體驗(yàn)。
在下面的例子中,點(diǎn)擊div
元素就可以編輯其中的內(nèi)容,為此可以應(yīng)用特殊的樣式,讓用戶知道自己可以編輯其中的內(nèi)容。
HTML:
<div class="editable" contenteditable>
<h1>Click on this text to edit it</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit!</p>
</div>
CSS:
:read-write:focus {
padding: 5px;
border: 1px dotted black;
}
看示例:http://codepen.io/ricardozea/pen/LGqWxK
:REQUIRED
:required
偽類選擇有required
屬性的表單元素。
除了通過(guò)標(biāo)簽中的星號(hào)(*)提示必填,也可以通過(guò)這個(gè)偽類為輸入字段應(yīng)用樣式。這樣就萬(wàn)無(wú)一失了。
在下面的例子中,輸入框有required
屬性,通過(guò)這個(gè)偽類為它應(yīng)用特殊樣式,可以提醒用戶它是必填項(xiàng)。
HTML:
<input type="email" required>
CSS:
:required {
color: black;
font-weight: bold;
}
看示例:http://codepen.io/ricardozea/pen/KVJWmZ
:SCOPE (EXPERIMENTAL)
:scope
偽類適用于style
標(biāo)簽中有scoped
屬性的情形。
如果頁(yè)面中某一部分的style
標(biāo)簽里沒(méi)有scoped
屬性,那么:scope
偽類會(huì)一直向上查找,直到html
元素,即當(dāng)前樣式表的默認(rèn)作用范圍。
在下面的例子中,第二個(gè)section
中有一個(gè)scoped
樣式表,因此這個(gè)section
中的文本會(huì)變成斜體。
HTML and CSS:
<article>
<section>
<h1>Lorem ipsum dolor sit amet</h1>
<p>Lorem ipsum dolor sit amet.</p>
</section>
<section>
**<style scoped>
:scope {
font-style: italic;
}
</style>**
<h1>This text will be italicized</h1>
<p>This text will be italicized.</p>
</section>
</article>
看示例:http://codepen.io/ricardozea/pen/ZQobzz
語(yǔ)言偽類
語(yǔ)言偽類與頁(yè)面中包含的文本相關(guān),與圖片、視頻等媒體無(wú)關(guān)。
:DIR (EXPERIMENTAL)
:dir
偽類選擇文檔中指定了語(yǔ)言方向的元素。換句話說(shuō),為了使用:dir
偽類,需要在標(biāo)記中為相關(guān)元素指定dir
屬性。
語(yǔ)言方向目前有兩種:ltr
(從左到右)和rtl
(從右往左)。
寫(xiě)這篇文章時(shí),支持:dir
偽類的只有Firefox(-moz-dir()
),下面的例子同時(shí)使用帶前綴和不帶前綴的:dir
選擇符。
注意: 要用帶前綴和不帶前綴的選擇符分別創(chuàng)建規(guī)則,兩種選擇符共享一條規(guī)則是不行的。
在下面的例子中,段落中的文字是阿拉伯文(是從右往左書(shū)寫(xiě)的),因此其顏色是橙色。
HTML:
<article dir="rtl">
<p>??????? ???? ?? ???? ?????? ?????? ???? ????? ??????? ????? ??? ???????? ?????? ?????? ??? ????? ?????.</p>
</article>
CSS:
/* 帶前綴 */
article :-moz-dir(rtl) {
color: orange;
}
/* 不帶前綴 */
article :dir(rtl) {
color: orange;
}
下面段落中的文字是英文(從左到右),顏色為藍(lán)色。
HTML:
<article dir="ltr">
<p>If you already know some HTML and CSS and understand the principles of responsive web design, then this book is for you.</p>
</article>
CSS:
/* 帶前綴 */
article :-moz-dir(ltr) {
color: blue;
}
/* 不帶前綴 */
article :dir(ltr) {
color: blue;
}
看示例:http://codepen.io/ricardozea/pen/adrxJy
:LANG
:lang
偽類選擇的元素通過(guò)lang=""
屬性、相應(yīng)的meta
元素以及HTTP首部的協(xié)議信息來(lái)確定。
lang=""
屬性常用于html
標(biāo)簽,其實(shí)也可以用于其他標(biāo)簽。
插一句,這里通常的做法是使用CSS的quotes
屬性來(lái)標(biāo)記特定的語(yǔ)言。不過(guò),多數(shù)瀏覽器(包括IE9及更高版本)會(huì)在CSS中沒(méi)有聲明的情況下自動(dòng)添加適當(dāng)?shù)囊脴?biāo)記。
不過(guò),自動(dòng)添加的引用標(biāo)記也可能不合適。因?yàn)闉g覽器自動(dòng)添加的與CSS添加的還不太一樣。
比如瀏覽器為德語(yǔ)(de
)添加的引用標(biāo)記如下:
?Lorem ipsum dolor sit amet.“
但通過(guò)CSS為德語(yǔ)添加的引用標(biāo)簽則通常如下:
?Lorem ipsum dolor sit amet.?
這兩種都對(duì)。因此,使用瀏覽器自動(dòng)添加的引用標(biāo)記,還是自己通過(guò)CSS的:lang
偽類及quotes
屬性添加,都看你的需要。
下面看看怎么通過(guò)CSS來(lái)添加引用標(biāo)記。
HTML:
<article lang="en">
<q>Lorem ipsum dolor sit amet.</q>
</article>
<article lang="fr">
<q>Lorem ipsum dolor sit amet.</q>
</article>
<article lang="de">
<q>Lorem ipsum dolor sit amet.</q>
</article>
CSS:
:lang(en) q { quotes: '“' '”'; }
:lang(fr) q { quotes: '?' '?'; }
:lang(de) q { quotes: '?' '?'; }
看示例:http://codepen.io/ricardozea/pen/gPJyvJ
其他偽類
下面再看看擁有其他功能的偽類。
:ROOT
:root
偽類選擇文檔中最高層次的父元素。
在HTML中,:root
偽類選擇的就是html
元素。但在SVG或XML等標(biāo)記語(yǔ)言中,它可能選擇不同的元素。
以下規(guī)則為HTML文檔中最高層次的父元素html
添加背景顏色:
:root {
background: orange;
}
注意: 使用html
也可以設(shè)置相同的樣式,但:root
是一個(gè)類,擁有比元素選擇符(即html
)更高的特指度。
:FULLSCREEN (EXPERIMENTAL)
:fullscreen
偽類選擇在全屏模式下顯示的元素。
不過(guò),這不適用于用戶按F11進(jìn)入的全屏模式,只適用于通過(guò)JavaScript Fullscreen API切換進(jìn)入的全屏模式,通常由父容器中的圖片、視頻或游戲來(lái)調(diào)用。
怎么知道已經(jīng)進(jìn)入全屏模式呢?一般瀏覽器會(huì)在窗口頂部提示你,并告訴你按Escape鍵可以退出全屏模式。
使用:fullscreen
偽類前必須知道,瀏覽器應(yīng)用樣式的方式差別很大。而且,不僅要在CSS中使用前綴,JavaScript中也一樣。推薦使用Hernan Rajchert的screenfull.js,它幫我們填了不少瀏覽器的“坑”。
本文不會(huì)討論全屏API,只給出一個(gè)在WebKit和Blink瀏覽器中可用的例子。
HTML:
<h1 id="element">This heading will have a solid background color in full-screen mode.</h1>
<button onclick="var el = document.getElementById('element'); el.webkitRequestFullscreen();">Trigger full screen!</button>
CSS:
h1:fullscreen {
background: orange;
}
看示例:http://codepen.io/ricardozea/pen/ZQNZqy
偽元素
如前所述,偽元素類似一種虛擬元素,可以將其視為普通的HTML元素。但偽元素并不存在于文檔樹(shù)或DOM中,因此不能在HTML中輸入,只能通過(guò)CSS創(chuàng)建。
同樣,雙冒號(hào)(::
)與單冒號(hào)(:
)也只是CSS3與CSS2.1的不同。
::BEFORE/:BEFORE
:before
偽元素與:after
類似,都可以為其他HTML元素添加內(nèi)容(文本或圖形)。同樣,這里的內(nèi)容并不實(shí)際存在于DOM中,但可以像存在一樣操作它們。需要在CSS中聲明content
屬性。
記住,通過(guò)這個(gè)偽元素生成的內(nèi)容不能通過(guò)其他選擇符選中。
HTML:
<h1>Ricardo</h1>
CSS:
h1:before {
content: "Hello "; /* 注意Hello后面有一個(gè)空格 */
}
結(jié)果網(wǎng)頁(yè)中會(huì)變成這樣:
Hello Ricardo!
注意: 看到“Hello ”后面的空格了嗎?沒(méi)錯(cuò),空格也算數(shù)。
::AFTER/:AFTER
:after
偽元素也用于為其他HTML元素添加內(nèi)容(文本或圖形)。這里的內(nèi)容并不實(shí)際存在于DOM中,但可以像存在一樣操作它們。為了使用這個(gè)偽元素,必須在CSS中聲明content
屬性。
同樣,通過(guò)這個(gè)偽元素添加的任何內(nèi)容都無(wú)法通過(guò)其他選擇符選中。
HTML:
<h1>Ricardo</h1>
CSS:
h1:after {
content: ", Web Designer!";
}
結(jié)果如下:
Ricardo, Web Designer!
::BACKDROP (EXPERIMENTAL)
::backdrop
偽元素是在全屏元素后面生成的一個(gè)盒子,與:fullscreen
偽類連用,修改全屏后元素的背景顏色。
注意: ::backdrop
偽元素必須用雙冒號(hào)。
還看前面:fullscreen
偽類的例子。
HTML:
<h1 id="element">This heading will have a solid background color in full-screen mode.</h1>
<button onclick="var el = document.getElementById('element'); el.webkitRequestFullscreen();">Trigger full screen!</button>
CSS:
h1:fullscreen::backdrop {
background: orange;
}
看示例:http://codepen.io/ricardozea/pen/bEPEPE
::FIRST-LETTER/:FIRST-LETTER
:first-letter
偽元素選擇一行文本第一個(gè)字符。
如果相應(yīng)行前面包含圖片、視頻或表格元素,那么不會(huì)影響選擇第一個(gè)字符。
這個(gè)偽元素非常適合對(duì)段落進(jìn)行排版,有了它就不必用圖片或其他技巧了。
提示: 這個(gè)偽元素也可以選中:before
偽元素生成的第一個(gè)字符。
CSS:
h1:first-letter {
font-size: 5em;
}
::FIRST-LINE/:FIRST-LINE
:first-line
選擇元素的第一行,只適用于塊級(jí)元素,行內(nèi)元素不適用。
即使一段文本有多行,也會(huì)選中第一行。
CSS:
p:first-line {
background: orange;
}
::SELECTION
::selection
選擇文檔中被高亮選中的部分。
注意,基于Gecko的瀏覽器要求使用前面:::-moz-selection
。
注意: 在一條規(guī)則中同時(shí)使用帶前綴和不還前綴的::selection
是不行的,要分別寫(xiě)。
CSS:
::-moz-selection {
color: orange;
background: #333;
}
::selection {
color: orange;
background: #333;
}
::PLACEHOLDER (EXPERIMENTAL)
::placeholder
偽元素選擇表單元素中通過(guò)placeholder
屬性設(shè)置的占位文本。
也可以寫(xiě)成::input-placeholder
。
注意: 這個(gè)偽元素不是標(biāo)準(zhǔn)的,因此將來(lái)有可能會(huì)變化。
在某些瀏覽器(IE10及Firefox 18之前)中,::placeholder
偽元素的實(shí)現(xiàn)類似一個(gè)偽類。其他瀏覽器都將其視為偽元素。因此,除非要兼容IE10或舊版本的Firefox瀏覽器,因此應(yīng)該這樣寫(xiě):
HTML:
<input type="email" placeholder="name@domain.com">
CSS:
input::-moz-placeholder {
color:#666;
}
input::-webkit-input-placeholder {
color:#666;
}
/* IE 10 only */
input:-ms-input-placeholder {
color:#666;
}
/* Firefox 18 and below */
input:-moz-input-placeholder {
color:#666;
}
小結(jié)
CSS偽類和偽元素相當(dāng)有用,對(duì)不?這些偽類和偽元素提供了豐富的選擇便利。
不要光看,自己動(dòng)手試一試吧。廣受支持的偽類和偽元素是很靠譜的。
希望大家看了這篇長(zhǎng)文能有所收獲。別忘了收藏它!