第6章 征服CSS3選擇器
屬性選擇器
在HTML中,通過各種各樣的屬性可以給元素增加很多附加的信息纷妆。例如扫外,通過id屬性可以將不同div元素進(jìn)行區(qū)分辑奈。
在CSS2中引入了一些屬性選擇器,而CSS3在CSS2的基礎(chǔ)上對屬性選擇器進(jìn)行了擴(kuò)展之宿,新增了3個屬性選擇器族操,使得屬性選擇器有了通配符的概念,這三個屬性選擇器與CSS2的屬性選擇器共同構(gòu)成了CSS功能強(qiáng)大的屬性選擇器比被。如下表所示:
屬性選擇器 | 功能描述 |
---|---|
E[att^='val'] | 選擇匹配元素E色难,且E元素定義了屬性att,其屬性值以val開頭的任何字符串 |
E[att$='val'] | 選擇匹配元素E等缀,且E元素定義了屬性att枷莉,其屬性值以val結(jié)尾的任何字符串 |
E[att*='val'] | 選擇匹配元素E,且E元素定義了屬性att,其屬性值的任意位置包含了val |
示例:
<a href="xxx.pdf">我鏈接的是PDF文件</a>
<a href="#" class="icon">我類名是icon</a>
<a href="#" title="我的title是more">我的title是more</a>
a[class^=icon]{
background: green;
color:#fff;
}
a[href$=pdf]{
background: orange;
color: #fff;
}
a[title*=more]{
background: blue;
color: #fff;
}
結(jié)構(gòu)性偽類選擇器 root
:root
選擇器尺迂,從字面上我們就可以很清楚的理解是根選擇器笤妙,他的意思就是匹配元素E所在文檔的根元素。在HTML文檔中噪裕,根元素始終是<html>
通過“:root”選擇器設(shè)置背景顏色
:root {
background:orange;
}
結(jié)構(gòu)性偽類選擇器 not
:not
選擇器稱為否定選擇器危喉,和jQuery
中的:not
選擇器一模一樣蔗彤,可以選擇除某個元素之外的所有元素凸郑。就拿form
元素來說,比如說你想給表單中除submit
按鈕之外的input
元素添加紅色邊框
form {
width: 200px;
margin: 20px auto;
}
div {
margin-bottom: 20px;
}
input:not([type="submit"]){
border:1px solid red;
}
結(jié)構(gòu)性偽類選擇器 empty
:empty
選擇器表示的就是空穷吮。用來選擇沒有任何內(nèi)容的元素严蓖,這里沒有內(nèi)容指的是一點(diǎn)內(nèi)容都沒有薄嫡,哪怕是一個空格
比如說氧急,你的文檔中有三個段落p元素,你想把沒有任何內(nèi)容的P元素隱藏起來毫深。我們就可以使用:empty
選擇器來控制
p{
background: orange;
min-height: 30px;
}
p:empty {
display: none;
}?
結(jié)構(gòu)性偽類選擇器 target
:target
選擇器稱為目標(biāo)選擇器吩坝,用來匹配文檔(頁面)的url的某個標(biāo)志符的目標(biāo)元素
點(diǎn)擊鏈接顯示隱藏的段落
html代碼:
<h2><a href="#brand">Brand</a></h2>
<div class="menuSection" id="brand">
content for Brand
</div>
css代碼:
.menuSection{
display: none;
}
:target{ /*這里的:target就是指id="brand"的div對象*/
display:block;
}
分析:
具體來說,觸發(fā)元素的URL中的標(biāo)志符通常會包含一個#號哑蔫,后面帶有一個標(biāo)志符名稱钉寝,上面代碼中是:
#brand
:target
就是用來匹配id為brand
的元素(id="brand"
的元素),上面代碼中是那個div元素。
多個url
(多個target
)的處理:
同一個頁面上有很多的url的時候你可以取不同的名字闸迷,只要#號后對的名稱與id=""中的名稱對應(yīng)就可以了
html代碼:
<h2><a href="#brand">Brand</a></h2>
<div class="menuSection" id="brand">
content for Brand
</div>
<h2><a href="#jake">Brand</a></h2>
<div class="menuSection" id="jake">
content for jake
</div>
<h2><a href="#aron">Brand</a></h2>
<div class="menuSection" id="aron">
content for aron
</div>
CSS代碼:
#brand:target {
background: orange;
color: #fff;
}
#jake:target {
background: blue;
color: #fff;
}
#aron:target {
background: red;
color: #fff;
}
結(jié)構(gòu)性偽類選擇器 first-child
:first-child
選擇器表示的是選擇父元素的第一個子元素的元素E
示例演示:
通過:first-child
選擇器定位列表中的第一個列表項(xiàng)嵌纲,并將序列號顏色變?yōu)榧t色。
html代碼:
<ol>
<li><a href="##">Link1</a></li>
<li><a href="##">Link2</a></li>
<li><a href="##">link3</a></li>
</ol>
CSS代碼:
ol > li{
font-size:20px;
font-weight: bold;
margin-bottom: 10px;
}
ol a {
font-size: 16px;
font-weight: normal;
}
ol > li:first-child{
color: red;
}
結(jié)構(gòu)性偽類選擇器 last-child
:last-child
選擇器選擇的是元素的最后一個子元素
html代碼:
<div class="post">
<p>第一段落</p>
<p>第二段落</p>
<p>第三段落</p>
<p>第四段落</p>
<p>第五段落</p>
</div>?
CSS代碼:
.post {
padding: 10px;
border: 1px solid #ccc;
width: 200px;
margin: 20px auto;
}
.post p {
margin:0 0 15px 0;
}
.post p:last-child {
margin-bottom:0;
}
結(jié)構(gòu)性偽類選擇器 nth-child(n)
:nth-child(n)
選擇器用來定位某個父元素的一個或多個特定的子元素腥沽。其中n
是其參數(shù)逮走,而且可以是整數(shù)值(1,2,3,4),也可以是表達(dá)式(2n+1今阳、-n+5)和關(guān)鍵詞(odd
师溅、even
),但參數(shù)n的起始值始終是1盾舌,而不是0墓臭。也就是說,參數(shù)n的值為0時妖谴,選擇器將選擇不到任何匹配的元素起便。
html代碼:
<ol>
<li>item1</li>
<li>item2</li>
<li>item3</li>
<li>item4</li>
<li>item5</li>
<li>item6</li>
<li>item7</li>
<li>item8</li>
<li>item9</li>
<li>item10</li>
</ol>?
CSS代碼:
ol > li:nth-child(2n){
//將偶數(shù)行列表背景色設(shè)置為橙色
background: orange;
}
結(jié)構(gòu)性偽類選擇器 nth-last-child(n)
:nth-last-child(n)
選擇器和前面的:nth-child(n)
選擇器非常的相似,只是這里多了一個last
窖维,所起的作用和:nth-child(n)
選擇器有所區(qū)別榆综,從某父元素的最后一個子元素開始計(jì)算,來選擇特定的元素铸史。
html代碼:
<ol>
<li>item1</li>
<li>item2</li>
<li>item3</li>
<li>item4</li>
<li>item5</li>
<li>item6</li>
<li>item7</li>
<li>item8</li>
<li>item9</li>
<li>item10</li>
<li>item11</li>
<li>item12</li>
<li>item13</li>
<li>item14</li>
<li>item15</li>
</ol>?
CSS代碼:
ol > li:nth-last-child(5){
background: orange;
}
first-of-type選擇器
:first-of-type
選擇器類似于:first-child
選擇器鼻疮,不同之處就是指定了元素的類型,其主要用來定位一個父元素下的某個類型的第一個子元素。
html代碼:
<div class="wrapper">
<div>我是一個塊元素琳轿,我是.wrapper的第一個子元素</div>
<p>我是一個段落元素判沟,我是不是.wrapper的第一個子元素,但是他的第一個段落元素</p>
<p>我是一個段落元素</p>
<div>我是一個塊元素</div>
</div>
CSS代碼:
.wrapper {
width: 500px;
margin: 20px auto;
padding: 10px;
border: 1px solid #ccc;
color: #fff;
}
.wrapper > div {
background: green;
}
.wrapper > p {
background: blue;
}
/*我要改變第一個段落的背景為橙色*/
.wrapper > p:first-of-type {
background: orange;
}
nth-of-type(n)選擇器
:nth-of-type(n)
選擇器和:nth-child(n)
選擇器非常類似崭篡,不同的是它只計(jì)算父元素中指定的某種類型的子元素挪哄。當(dāng)某個元素中的子元素不單單是同一種類型的子元素時,使用:nth-of-type(n)
選擇器來定位于父元素中某種類型的子元素是非常方便和有用的琉闪。在:nth-of-type(n)
選擇器中的n
和:nth-child(n)
選擇器中的n
參數(shù)也一樣迹炼,可以是具體的整數(shù),也可以是表達(dá)式,還可以是關(guān)鍵詞斯入。
html代碼:
<div class="wrapper">
<div>我是一個Div元素</div>
<p>我是一個段落元素</p>
<div>我是一個Div元素</div>
<p>我是一個段落</p>
<div>我是一個Div元素</div>
<p>我是一個段落</p>
<div>我是一個Div元素</div>
<p>我是一個段落</p>
<div>我是一個Div元素</div>
<p>我是一個段落</p>
<div>我是一個Div元素</div>
<p>我是一個段落</p>
<div>我是一個Div元素</div>
<p>我是一個段落</p>
<div>我是一個Div元素</div>
<p>我是一個段落</p>
</div>
CSS代碼:
.wrapper > p:nth-of-type(2n){
background: orange;
}
last-of-type選擇器
:last-of-type
選擇器和:first-of-type
選擇器功能是一樣的砂碉,不同的是他選擇是父元素下的某個類型的最后一個子元素。
html代碼:
<div class="wrapper">
<p>我是第一個段落</p>
<p>我是第二個段落</p>
<p>我是第三個段落</p>
<div>我是第一個Div元素</div>
<div>我是第二個Div元素</div>
<div>我是第三個Div元素</div>
</div>
CSS代碼:
.wrapper > p:last-of-type{
background: orange;
}
nth-last-of-type(n)選擇器
:nth-last-of-type(n)
選擇器和:nth-of-type(n)
選擇器是一樣的刻两,選擇父元素中指定的某種子元素類型增蹭,但它的起始方向是從最后一個子元素開始
html代碼:
<div class="wrapper">
<p>我是第一個段落</p>
<p>我是第二個段落</p>
<p>我是第三個段落</p>
<p>我是第四個段落</p>
<p>我是第五個段落</p>
<div>我是一個Div元素</div>
<p>我是第六個段落</p>
<p>我是第七個段落</p>
</div>
CSS代碼:
.wrapper > p:nth-last-of-type(3){
background: orange;
}
only-child選擇器
:only-child
選擇器選擇的是父元素中只有一個子元素,而且只有唯一的一個子元素磅摹。也就是說滋迈,匹配的元素的父元素中僅有一個子元素,而且是一個唯一的子元素户誓。
html代碼:
<div class="post">
<p>我是一個段落</p>
<p>我是一個段落</p>
</div>
<div class="post">
<p>我是一個段落</p>
</div>
CSS代碼:
.post p {
background: green;
color: #fff;
padding: 10px;
}
.post p:only-child {
background: orange;
}
only-of-type選擇器
:only-of-type
選擇器用來選擇一個元素是它的父元素的唯一一個相同類型的子元素饼灿。這樣說或許不太好理解,換一種說法厅克。:only-of-type
是表示一個元素他有很多個子元素,而其中只有一種類型的子元素是唯一的橙依,使用:only-of-type
選擇器就可以選中這個元素中的唯一一個類型子元素证舟。
html代碼:
<div class="wrapper">
<p>我是一個段落</p>
<p>我是一個段落</p>
<p>我是一個段落</p>
<div>我是一個Div元素</div>
</div>
<div class="wrapper">
<div>我是一個Div</div>
<ul>
<li>我是一個列表項(xiàng)</li>
</ul>
<p>我是一個段落</p>
</div>
CSS代碼:
.wrapper > div:only-of-type {
background: orange;
}
:enabled選擇器
在Web的表單中,有些表單元素有可用:enabled
和不可用:disabled
狀態(tài)窗骑,比如輸入框女责,密碼框,復(fù)選框等创译。在默認(rèn)情況之下抵知,這些表單元素都處在可用狀態(tài)。那么我們可以通過偽選擇器:enabled
對這些表單元素設(shè)置樣式软族。
html代碼:
<form action="#">
<div>
<label for="name">Text Input:</label>
<input type="text" name="name" id="name" placeholder="可用輸入框" />
</div>
<div>
<label for="name">Text Input:</label>
<input type="text" name="name" id="name" placeholder="禁用輸入框" disabled="disabled" />
</div>
</form>
CSS代碼:
div{
margin: 20px;
}
input[type="text"]:enabled {
background: #ccc;
border: 2px solid red;
}
:disabled選擇器
:disabled
選擇器剛好與:enabled
選擇器相反刷喜,用來選擇不可用表單元素。要正常使用:disabled
選擇器立砸,需要在表單元素的HTML中設(shè)置disabled
屬性掖疮。
html代碼:
<form action="#">
<div>
<input type="text" name="name" id="name" placeholder="我是可用輸入框" />
</div>
<div>
<input type="text" name="name" id="name" placeholder="我是不可用輸入框" disabled />
</div>
</form>
CSS代碼:
form {
margin: 50px;
}
div {
margin-bottom: 20px;
}
input {
background: #fff;
padding: 10px;
border: 1px solid orange;
border-radius: 3px;
}
input[type="text"]:disabled {
background: rgba(0,0,0,.15);
border: 1px solid rgba(0,0,0,.15);
color: rgba(0,0,0,.15);
}
:checked選擇器
在表單元素中,單選按鈕和復(fù)選按鈕都具有選中和未選中狀態(tài)颗祝。(大家都知道浊闪,要覆寫這兩個按鈕默認(rèn)樣式比較困難)。在CSS3中螺戳,我們可以通過狀態(tài)選擇器:checked
配合其他標(biāo)簽實(shí)現(xiàn)自定義樣式,而:checked
表示的是選中狀態(tài)搁宾。
html代碼:
<form action="#">
<div class="wrapper">
<div class="box">
<input type="checkbox" checked="checked" id="usename" /><span>√</span>
</div>
<lable for="usename">我是選中狀態(tài)</lable>
</div>
<div class="wrapper">
<div class="box">
<input type="checkbox" id="usepwd" /><span>√</span>
</div>
<label for="usepwd">我是未選中狀態(tài)</label>
</div>
</form>
CSS代碼:
form {
border: 1px solid #ccc;
padding: 20px;
width: 300px;
margin: 30px auto;
}
.wrapper {
margin-bottom: 10px;
}
.box {
display: inline-block;
width: 20px;
height: 20px;
margin-right: 10px;
position: relative;
border: 2px solid orange;
vertical-align: middle;
}
.box input {
opacity: 0;
position: absolute;
top:0;
left:0;
}
.box span {
position: absolute;
top: -10px;
right: 3px;
font-size: 30px;
font-weight: bold;
font-family: Arial;
-webkit-transform: rotate(30deg);
transform: rotate(30deg);
color: orange;
}
input[type="checkbox"] + span {
opacity: 0;
}
input[type="checkbox"]:checked + span {
opacity: 1;
}
::selection選擇器
::selection
偽元素是用來匹配突出顯示的文本(用鼠標(biāo)選擇文本時的文本)
html代碼:
<p>“::selection”偽元素是用來匹配突出顯示的文本。瀏覽器默認(rèn)情況下倔幼,選擇網(wǎng)站文本是深藍(lán)的背景盖腿,白色的字體,</p>
CSS代碼:
::-moz-selection {
background: red;
color: green;
}
::selection {
background: red;
color: green;
}
:read-only選擇器
:read-only
偽類選擇器用來指定處于只讀狀態(tài)元素的樣式损同。簡單點(diǎn)理解就是奸忽,元素中設(shè)置了readonly=’readonly’
html代碼:
<form action="#">
<div>
<label for="name">姓名:</label>
<input type="text" name="name" id="name" placeholder="大漠" />
</div>
<div>
<label for="address">地址:</label>
<input type="text" name="address" id="address" placeholder="中國上海" readonly="readonly" />
</div>
</form>
CSS代碼:
form {
width: 300px;
padding: 10px;
border: 1px solid #ccc;
margin: 50px auto;
}
form > div {
margin-bottom: 10px;
}
input[type="text"]{
border: 1px solid orange;
padding: 5px;
background: #fff;
border-radius: 5px;
}
input[type="text"]:-moz-read-only{
border-color: #ccc;
}
input[type="text"]:read-only{
border-color: #ccc;
}
:read-write選擇器
:read-write
選擇器剛好與:read-only
選擇器相反堕伪,主要用來指定當(dāng)元素處于非只讀狀態(tài)時的樣式。
html代碼:
<form action="#">
<div>
<label for="name">姓名:</label>
<input type="text" name="name" id="name" placeholder="大漠" />
</div>
<div>
<label for="address">地址:</label>
<input type="text" name="address" id="address" placeholder="中國上海" readonly="readonly" />
</div>
</form>
CSS代碼:
form {
width: 300px;
padding: 10px;
border: 1px solid #ccc;
margin: 50px auto;
}
form > div {
margin-bottom: 10px;
}
input[type="text"]{
border: 1px solid orange;
padding: 5px;
background: #fff;
border-radius: 5px;
}
input[type="text"]:-moz-read-only{
border-color: #ccc;
}
input[type="text"]:read-only{
border-color: #ccc;
}
input[type="text"]:-moz-read-write{
border-color: #f36;
}
input[type="text"]:read-write{
border-color: #f36;
}
::before和::after
::before
和::after
這兩個主要用來給元素的前面或后面插入內(nèi)容栗菜,這兩個常和content
配合使用欠雌,使用的場景最多的就是清除浮動。
.clearfix::before,
.clearfix::after {
content: ".";
display: block;
height: 0;
visibility: hidden;
}
.clearfix:after {clear: both;}
.clearfix {zoom: 1;}
當(dāng)然疙筹,我們還可以使用它們來實(shí)現(xiàn)陰影效果
.effect::before, .effect::after{
content:"";
position:absolute;
z-index:-1;
-webkit-box-shadow:0 0 20px rgba(0,0,0,0.8);
-moz-box-shadow:0 0 20px rgba(0,0,0,0.8);
box-shadow:0 0 20px rgba(0,0,0,0.8);
top:50%;
bottom:0;
left:10px;
right:10px;
-moz-border-radius:100px / 10px;
border-radius:100px / 10px;
}
上面代碼作用在class名叫.effect上的div的前(before)后(after)都添加一個空元素富俄,然后為這兩個空元素添加陰影特效。