jQuery後代過濾器簡介
由名稱來看,可以很容易了解此過濾器主要是處理一些後代元素選擇動作。我們在基礎過濾器(Basic Filters)中介紹過:even與:odd,這兩個過濾器常使用於表格的處理,但如果今天我們以三的倍數來計算呢?例如,第3,6,9…行進行處理呢?怎麼做?jQuery後代過濾器速查表
| 過濾器 | 說明 | 範例 |
|---|---|---|
| :first-child | 選擇所有父元素下的第一個子元素 | $(':first-child') |
| :last-child | 選擇所有父元素下的最後一個子元素 | $(':last-child') |
| :nth-child(index/even/odd/equation) | 選擇元素集合裡第幾個指定的子元素 | $(':nth-child(1)') |
| :only-child | 選擇所有父元素下只有一個子元素 | $(':only-child') |
jQuery後代過濾器範例
:first-child過濾器範例:選擇div元素下第一個span元素進行處理
選擇所有父元素下的第一個子元素。<!DOCTYPE html>
<html>
<head>
<style>
span { color:#008; }
span.sogreen { color:green; font-weight: bolder; }
</style>
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
<div>
<span>John,</span>
<span>Karl,</span>
<span>Brandon</span>
</div>
<div>
<span>Glen,</span>
<span>Tane,</span>
<span>Ralph</span>
</div>
<script>
// 1. 選擇div元素裡所有span元素
// 2. 選擇第一個span元素
$("div span:first-child")
// 1. 進行CSS設定
.css("text-decoration", "underline")
// 1. 進行切換效果設定
.hover(function () {
$(this).addClass("sogreen");
}, function () {
$(this).removeClass("sogreen");
});
</script>
</body>
</html>
雖然:first(Basic Filters)只符合一個單獨的元素,但:first-child過濾器可以符合超過一個的元素,為每個父元素分配第一個子元素,這相當於:nth-child(1)。:last-child過濾器範例:選擇div元素下最後一個span元素進行處理
選擇所有父元素下的最後一個子元素。<!DOCTYPE html>
<html>
<head>
<style>
span.solast { text-decoration:line-through; }
</style>
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
<div>
<span>John,</span>
<span>Karl,</span>
<span>Brandon,</span>
<span>Sam</span>
</div>
<div>
<span>Glen,</span>
<span>Tane,</span>
<span>Ralph,</span>
<span>David</span>
</div>
<script>
// 1. 選擇div元素裡所有span元素
// 2. 選擇最後一個span元素
$("div span:last-child")
.css({color:"red", fontSize:"80%"})
.hover(function () {
$(this).addClass("solast");
}, function () {
$(this).removeClass("solast");
});
</script>
</body>
</html>
此範例與:first-child相反,它是選擇父元素之後的子集合元素的最後一個。雖然:last(Basic Filters)只符合一個單獨的元素,但:last-child過濾器可以符合超過一個的元素,為每個父元素分配最後一個子元素。
:nth-child()過濾器範例:選擇所有ul元素裡的第二個li元素
- Index:指定第幾個
- odd:指定奇數個
- even:指定偶數個
- :eq(index):指定第幾個,index從0開始
<!DOCTYPE html>
<html>
<head>
<style>
div { float:left; }
span { color:blue; }
</style>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
</head>
<body>
<div>
<ul>
<li>John</li>
<li>Karl</li>
<li>Brandon</li>
</ul>
</div>
<div>
<ul>
<li>Sam</li>
</ul>
</div>
<div>
<ul>
<li>Glen</li>
<li>Tane</li>
<li>Ralph</li>
<li>David</li>
</ul>
</div>
<script>
// 1. 選擇ul元素裡所有li元素
// 2. 選擇li集合裡的第二個元素(n從1開始)
$("ul li:nth-child(2)").append("<span> - 2nd!</span>");</script>
</body>
</html>
因為jQuery實作:nth-child(n)是來自CSS規範,n值是"1索引(1-indexed)",也就是說,是由1開始計數。對於其他選擇器表達式(selector expressions),jQuery遵循JavaScript的"0索引(0-indexed)"來計數,因此,一個<ul>包含兩個<li>,$('li:nth-child(1)')會選擇第一個<li>,$('li:eq(1)')會選擇第二個<li>。:nth-child(n)虛擬類別很容易與:eq(n)混淆,即使兩者可能導致完全不同的符合元素。用:nth-child(n)所有子元素都會計算在內,不管它們是什麼,和它符合的虛擬類別相連的選擇器(selector),才會選中指定的元素。而:eq(n)只有選擇器(selector)附加到虛擬類別,並不局限於任何子元素或其他元素,且(n+1)個(n是0為基礎)的元素被選擇。
更多的討論,請參考W3C CSS specification。
:only-child過濾器範例:選擇div元素下只有一個button子元素
:only-child過濾器適合使用在要過濾選擇出一父一子的情況。<!DOCTYPE html>
<html>
<head>
<style>
div { width:100px; height:80px; margin:5px; float:left; background:#b9e }
</style>
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
<div>
<button>Sibling!</button>
<button>Sibling!</button>
</div>
<div>
<button>Sibling!</button>
</div>
<div>
None
</div>
<div>
<button>Sibling!</button>
<button>Sibling!</button>
<button>Sibling!</button>
</div>
<div>
<button>Sibling!</button>
</div>
<script>
// 1. 由div元素裡
// 2. 選擇只含有一個button子元素
$("div button:only-child").text("Alone").css("border", "2px blue solid");
</script>
</body>
</html>
只有第二個div元素及第五個div元素符合:only-child條件。如果父元素有其他子元素,就不會符合。KKBruce補充
後代選擇器中,比較難理解的只有:nth-child(n),因為功能強大,所以可以多花些心思在這裡。n值除了可以是index/even/odd/equation之外,還是能倍數方式指定。:nth-child(an)
- a是倍數的數字,必須大於0
- n是倍數的意思
例如,$('li:nth-child(3n)').css('...'),把第3,6,9…所有3的倍數的li元素設定CSS。
:nth-child(an+b)與:nth-child(an-b)
這裡會進行兩個步驟:- 先對元素進行"分組",每組有a個
- b為每組的編號,從0開始
- :nth-child(3n+1):每3個一組,從編號1開始。1,4,7,...
- :nth-child(3n+5):每3個一組,從編號5開始。5,8,11,...
- :nth-child(5n-1):每5個一組,從第5n-1個開始。4,9,14,...
jQuery基礎選擇器修改歷程
[2012/1/4] 參考 jQuery 1.7 文件翻譯編寫。- Child Filters :first-child
- Child Filters :last-child
- Child Filters :nth-child()
- Child Filters :only-child
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。