1. 程式人生 > >獻給CSS3初學者:選擇器用法總結

獻給CSS3初學者:選擇器用法總結

本篇部落格主要針對CSS3一個很常用的知識點進行歸納總結,那就是選擇器。目的:通過選擇器的使用,開發者可以快速地選取到目標元素。本篇通過以下幾方面介紹選擇器:

  • 萬用字元
  • 直接子節點
  • 常用偽類選擇
  • 位置選擇
  • 屬性選擇
  • 狀態選擇
  • 過濾選擇

萬用字元

萬用字元包括三種:

(1)萬用字元^,表示開頭匹配。

(2)萬用字元$,表示結尾匹配。

(3)萬用字元*,表示包含匹配。

它的用法如下:

<style>
	div[id^="d"] {
		background-color: red;
	}
	/*--選擇div元素中id開頭為d字母的元素--*/
	
	div[id$="1"] {
		background-color: red;
	}
	/*--選擇div元素中id結尾為1的元素--*/
	
	div[id*="d"] {
		background-color: red;
	}
	/*--選擇div元素中id包含字母d的元素--*/
</style>
<script>
	//jquery寫法
	$(document).ready(function() {
		$("div[id^='d']").css("background-color", "red");
		$("div[id$='1']").css("background-color", "red");
		$("div[id*='d']").css("background-color", "red");
	});
</script>

父結構直接子節點的選擇

父結構的直接子節點的選擇,需要通過大於號>來表示,它的用法如下:

<style>
	.red {
		background-color: red;
	}
</style>
<body>
	<ul class="myList">
		<li>
			<a href="http://www.baidu.com">BaiDu</a>
			<ul>
				<li>
					<a href="css1-pdf">css1</a>
				</li>
			</ul>
		</li>
	</ul>
</body>
<script>
	//選中所有包含樣式myList的ul標籤下的<li>標籤的連線<a>
	//執行結果:文字Baidu、css1背景色變紅
	$("ul.myList li a").addClass("red"); 
	
	//選中所有包含樣式myList的ul標籤下的直接子節點<li>標籤的連線<a>
	//執行結果:僅文字Baidu背景色變紅
	$("ul.myList>li>a").addClass("red"); 
</script>

偽類選擇:after、:before、:first-letter、:first-line

:after,表示在元素後插入內容。

:before,表示在元素前插入內容。

:first-letter,表示文字首字母。

:first-line,表示文字首行。

它們的用法如下:

<style>
	#e1:after {
		content: "after(網址)";
		color: blue;
	}
	/*--在元素後插入內容--*/
	#e2:before {
		content: "before(圖片)";
		color: blue;
	}
	/*--在元素前插入內容--*/
	#e3:first-letter {
		color: blue;
	}
	/*--文字首字母改變樣式--*/
	#e4:first-line {
		color: blue;
	}
	/*--文字首行改變樣式--*/
</style>
<body>
	<ul>
		<li>
			<a id="e1" href="http://www.baidu.com" target="_blank">百度</a>
		</li>
		<li>
			<a id="e2" href="http://www.baidu.com/img/bd_logo1.png" target="_blank">百度</a>
		</li>
		<li>
			<div id="e3" id="p1">百度</div>
		</li>
		<li>
			<div id="e4" id="p2">百度</div>
		</li>
	</ul>
</body>

效果圖:


通過jquery實現上述效果,可以是:

<style>
	.after_add:after {
		content: "after(網址)";
		color: blue;
	}
</style>

//效果相同,新增的內容包含在a標籤內
$("#e1").removeClass().addClass("after_add");
//效果不同,新增的內容不包含在a標籤
$("#e1").before("<span style='color: blue;'>after(網址)</span>");

使用before和after實現的巢狀效果,如

<style>
	#d1 h2.hot:after {
		content: url(../../img/new.gif);
	}
	/*加熱點標籤*/
	
	#d1 h2:before {
		content: '第'counter(mc)'章 ';
		color: #FAEBD7;
	}
	
	#d1 h2 {
		counter-increment: mc;
	}
	/*連續編號*/
	
	#d2 h2:before {
		content: '第'counter(mc, upper-roman)'章 ';
		color: #FAEBD7;
	}
	
	#d2 h2 {
		counter-increment: mc;
	}
	/*指定編號:upper-alpha大寫英文字母,upper-roman大寫羅馬字母*/
	
	#d3 h1:before {
		content: counter(mc_max);
	}
	
	#d3 h1 {
		counter-increment: mc_max;
		counter-reset: mc_mid;
	}
	
	#d3 h2:before {
		content: counter(mc_max)'.'counter(mc_mid);
		margin-left: 40px;
	}
	
	#d3 h2 {
		counter-increment: mc_mid;
		counter-reset: mc_small;
	}
	
	#d3 h3:before {
		content: counter(mc_max)'.'counter(mc_mid)'.'counter(mc_small);
		margin-left: 80px;
	}
	
	#d3 h3 {
		counter-increment: mc_small;
	}
	/*編號巢狀*/
	
	#d4 h2:before {
		content: open-quote;
	}
	
	#d4 h2:after {
		content: close-quote;
	}
	
	#d4 h2 {
		quotes: "("")";
	}
	/*左右兩邊新增符號*/
</style>

<body>
	<div id="d1">
		<h2 class="hot">鹿鼎記</h2>
	</div>

	<div id="d2">
		<h2 class="hot">鹿鼎記</h2>
	</div>
	
	<div id="d4">
		<h2>鹿鼎記</h2>
	</div>

	<div id="d3">
		<h1>大標題</h1>
		<h2>中標題</h2>
		<h3>小標題</h3>
	</div>
</body>

效果圖:



位置選擇

位置選擇器包括以下幾種:

:first-child,選擇第一個元素

:last-child,選擇最後一個元素

:nth-child(3),選擇第三個元素

:nth-last-child(3),選擇倒數第三個元素

:nth-child(even),選擇第偶數個元素

:nth-last-child(even),選擇第倒數偶數個元素

:nth-child(odd),選擇奇數個元素

:nth-last-child(odd),選擇倒數奇數個函式

它們用法如下:

<style>
	li:first-child {
		background-color: yellow;
	}
	/*第一個*/
	li:last-child {
		background-color: yellow;
	}
	/*最後一個*/
	li:nth-child(3) {
		background-color: yellow;
	}
	/*第三個,索引從1開始*/
	li:nth-last-child(3) {
		background-color: yellow;
	}
	/*倒數第三個*/
	li:nth-child(even) {
		background-color: yellow;
	}
	/*偶數2、4、6*/
	li:nth-last-child(even) {
		background-color: yellow;
	}
	/*倒數偶數1、3、5,即奇數*/
</style>

<body>
	<ul>
		<li>1</li>
		<li>2</li>
		<li>3</li>
		<li>4</li>
		<li>5</li>
		<li>6</li>
		<li>7</li>
		<li>8</li>
		<li>9</li>
		<li>10</li>
	</ul>
</body>

其中,使用jquery的話,還有如下幾種型別的位置選擇器:

:first,選擇某元素集合的第一個

:eq(2),選擇某元素集合的第三個,其索引值從0開始,注意與:nth-child(3)的區分

:lt(2),選擇某元素集合的第三個之前的(不包括自身)所有該類元素

:gt(2),選擇某元素集合的第三個之後的(不包括自身)所有該類元素

:last,選擇某元素集合的最後一個

它們的用法如下:

$("ul li:first-child").addClass("yellow"); //選中每個ul下的第一個li
$("ul li:last-child").addClass("yellow"); //選中每個ul的最後一個li
$("ul li:nth-child(3)").addClass("yellow"); //選中每個ul的第三個li
$("ul li:nth-last-child(3)").addClass("yellow"); //選中每個ul的倒數第三個li
$("ul li:nth-child(even)").addClass("yellow"); //選中每個ul的偶數li
$("ul li:nth-child(odd)").addClass("yellow"); //選中每個ul的奇數li
$("ul li:first").addClass("yellow"); //把ul下所有li合併作為集合,集合中的第一個li
$("ul li:eq(2)").addClass("yellow"); //把ul下所有li合併作為集合,集合中的第三個li
$("ul li:lt(2)").addClass("yellow"); //把ul下所有li合併作為集合,集合中的第三個li(不包括自身)之前的所有li
$("ul li:gt(2)").addClass("yellow"); //把ul下所有li合併作為集合,集合中的第三個li(不包括自身)之後的所有li
$("ul li:last").addClass("yellow"); //把ul下所有li合併作為集合,集合中的第最後一個li

關於位置選擇器,還有一些值得注意的地方,如:nth-child和:nth-of-type的區別:

h2:nth-child(even),是指父級結構內,第偶數元素是h2時,這意味著第偶個元素不一定是h2,新增樣式。

h2:nth-of-type(even),是指父級結構內,第偶數h2元素,新增樣式。

如何迴圈樣式:

li:nth-child(3n+1),是指每3個選項開始迴圈樣式,+1表示每個迴圈的第1個選項

只有一個元素時的樣式:

li:only-child,是指只有一個選項時使用該樣式。

測試程式碼:

<style>
	#d1 p:nth-of-type(even) {
		background-color: yellow;
	}
	/*--奇數--*/
	
	#d1 p:nth-of-type(odd) {
		background-color: aliceblue;
	}
	/*--偶數--*/
	
	#d2 li:nth-child(3n+1) {
		background-color: yellow;
	}
	
	#d2 li:nth-child(3n+2) {
		background-color: antiquewhite;
	}
	
	#d2 li:nth-child(3n+3) {
		background-color: aqua;
	}
	/*迴圈*/
	
	#d3 li:only-child {
		background-color: red;
	}
	/*僅有一個*/
</style>
<body>
	<div id="d1">
		<p>奇數</p>
		<p>偶數</p>
		<p>奇數</p>
		<p>偶數</p>
		<p>奇數</p>
	</div>
	
	<div id="d2">
		<ul>
			<li>1</li>
			<li>2</li>
			<li>3</li>
			<li>4</li>
			<li>5</li>
			<li>6</li>
			<li>7</li>
			<li>8</li>
			<li>9</li>
		</ul>
	</div>
	<div id="d3">
		<ul>
			<li>only one</li>
		</ul>
	</div>
</body>
效果圖:

屬性選擇

用法:$('元素[屬性]')即可、測試程式碼如下:

<style>
	.red {
		background-color: red;
	}
</style>

<body>
	<table id="languages">
		<thead>
			<tr>
				<th>Language</th>
				<th>Type</th>
				<th>Invented</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td>Java</td>
				<td>Static</td>
				<td>1995</td>
			</tr>
			<tr>
				<td>Ruby</td>
				<td>Dynamic</td>
				<td>1993</td>
			</tr>
			<tr id="Smalltalk" title="Smalltalk">
				<td>Smalltalk</td>
				<td>Dynamic</td>
				<td>1972</td>
			</tr>
			<tr id="c++" title="c++">
				<td>C++</td>
				<td>Static</td>
				<td>1983</td>
			</tr>
		</tbody>
	</table>
</body>

<script>
	var tr = "";
	tr = $("tr").get(); //獲取所有<tr>標籤元素包裝集
	tr = $("tr").get(1); //獲取所有<tr>標籤元素包裝集的第二個元素
	tr = $("tr").slice(0, 2); //獲取所有<tr>標籤元素包裝集從0位置開始連續2個元素組成的包裝集
	var index = $("tr").index($("tr#Smalltalk")); //獲取<tr>標籤元素包裝集中id為Smalltalk的下標
	
	$('tr[id]').addClass("red"); //選中<tr>標籤中包括id屬性的元素包裝集新增red樣式
	$("tr[id*='Sma']").addClass("red"); //選中<tr>標籤中包括id屬性且id包含Sma字樣的元素包裝集新增red樣式
	$('tr[id]').add('tr[title]').addClass("red"); //選中<tr>標籤中包括id屬性的元素包裝集[或]包括title屬性的元素包裝集新增red樣式
	$("tr[title]").not("tr[title*='c++']").addClass("red"); //選中<tr>標籤中包括title屬性的元素但title不包括c++的包裝集
	$("tr[title]").filter("tr[title*='c++']").addClass("red"); //選中<tr>標籤中包括title屬性的元素且title包括c++字樣的包裝集
</script>

狀態選擇

可供選擇的狀態類別如下:

E:hover,滑鼠經過

E:focus,獲取焦點

E:active,按下滑鼠還沒鬆開

E:enabled,可用狀態

E:disabled,不可用狀態

E:default,單選框或複選框預設狀態

E:checked,單選框或複選框選中狀態

E:indeterminate,單選框還沒開始選擇

E::selection,文字被選中時樣式

E[id="e1"]~E,id為e1的E元素的兄弟元素

E:read-only、E:read-write 指只讀、讀寫

E:invalid 指文字不能通過如元素required、pattern驗證時的樣式

E:valid 指文字通過如元素required、pattern驗證時的樣式

E:in-range、E:out-range 需設定min和max屬性,指當在三屬性內或超出屬性時的樣式

測試程式碼如下:

<!DOCTYPE html>
<meta charset="utf-8" />
<html>

	<head>
		<meta charset="utf-8" />
		<title></title>
		<script type="text/javascript" src="../../js/jquery/jquery-1.8.0.js"></script>
		<style>
			form input[type="text"]:hover {
				background-color: greenyellow;
			}
			/*滑鼠經過*/
			
			form input[type="text"]:focus {
				background-color: skyblue;
			}
			/*獲取焦點*/
			
			form input[type="text"]:active {
				background-color: yellow;
			}
			/*按下滑鼠還沒鬆開*/
			
			div[id="d1"] input:enabled {
				background-color: #F0F8FF;
			}
			/*可用狀態*/
			
			div[id="d1"] input:disabled {
				background-color: red;
			}
			/*不可用狀態*/
			
			div[id="d2"] input[type="checkbox"]:default {
				outline: 2px solid blue;
			}
			/*單選框或複選框預設狀態*/
			
			div[id="d2"] input[type="checkbox"]:checked {
				outline: 2px solid red;
			}
			/*單選框或複選框選中狀態*/
			
			div[id="d2"] input:indeterminate {
				outline: 2px solid black;
			}
			/*單選框還沒開始選擇*/
			
			div[id="d3"] p::selection {
				background-color: red;
			}
			/*文字被選中時樣式*/
			/*div[id="d4"] p[id="p1"]~p {
				background-color: azure;
			}*/
			/*選中id為p1的兄弟元素*/
			
			.yellow {
				background-color: yellow;
			}
			/*jquery新增樣式效果*/
		</style>
	</head>

	<body>
		<!--	E:hover、E:focus、E:active 指經過、獲取焦點和啟用  -->
		<form>
			<p>姓名:<input type="text" name="name" /> </p>
			<p>地址:<input type="text" name="address" /> </p>
		</form>

		<!-- E:enabled、E:disabled 指元素可用、不可用 -->
		<div id="d1">
			<input type="text" value="可用" />
			<input type="text" disabled="disabled" value="不可用" />
		</div>

		<!--	E:default、E:checked、E:indeterminate  選擇框的三種狀態 -->
		<div id="d2">
			<input type="checkbox" checked="checked" />
			<input type="checkbox" />
			<input type="radio" name="radio" />
			<input type="radio" name="radio" />
		</div>

		<!-- E::selection 文字被選中時的狀態 -->
		<div id="d3">
			<p>我是文字</p>
		</div>

		<!-- E~E1 選中E元素的所有E1兄弟元素 -->
		<div id="d4">
			<p id="p1">自己</p>
			<p>兄弟1</p>
			<p>兄弟2</p>
		</div>
	</body>

	<script>
		$(document).ready(function() {
			$("#d4 p[id='p1']~p").addClass("yellow");
		});
	</script>

</html>
效果圖:

過濾選擇

過濾選擇器包括:

:not,排除

:filter,過濾

:empty, 表格項為空時的樣式設定,長用於表格內標籤樣式

:target,target元素的id被當頁面中的超連結使用

測試程式碼:

<!DOCTYPE html>
<meta charset="utf-8" />
<html>

	<head>
		<meta charset="utf-8" />
		<title>偽類選擇器</title>
		<script src="../../js/jquery/jquery-1.8.0.js"></script>
		<style>
			/*div:not([id="d1"]) {
				background-color: aliceblue;
			}*/
			/*排除,該樣式排除了id為d1的div*/
			
			td:empty {
				background-color: #0000FF;
			}
			/*表格項為空時的樣式設定,長用於表格內標籤樣式*/
			
			:target {
				background-color: red;
			}
			/*target元素的id被當頁面中的超連結使用*/
		</style>
	</head>

	<body>
		<div id="d1">d1</div>
		<div id="d2">d2</div>
		<table border="1">
			<tr>
				<td>a</td>
				<td>b</td>
				<td>c</td>
			</tr>
			<tr>
				<td>a</td>
				<td></td>
				<td>c</td>
			</tr>
		</table>
		<p id="menu">
			<a href="#t1">t1-示例文字</a>
			<a href="#t2">t2-示例文字</a>
			<a href="#t3">t3-示例文字</a>
		</p>

		<label id="t1">
			示例文字1
		</label>
		<label id="t2">
			示例文字2
		</label>
		<label id="t3">
			示例文字3
		</label>
	</body>
	<script>
		$(document).ready(function() {
			//$("div").not("div[id=d1]").css("background-color", "aliceblue"); 	
			$("div").css("background-color", "orange").filter("div[id=d1]").css("background-color", "aliceblue");	
			//console.log($("p").find("a")); //jquery中filter的用法,查詢後代
		});
	</script>

</html>
效果圖: