【jQuery】eq()で要素の順番を指定して選択する方法|:eq()セレクタ・first・last比較まで

【jQuery】eq()で要素の順番を指定して選択する jQuery

jQueryの eq() メソッドは、選択した要素群の中からインデックス番号で特定の要素を1つ選択します。リストのN番目・タブの特定パネルを操作するなど、インデックスベースの要素選択が必要な場面で活躍します。

この記事でわかること

  • eq()の基本構文と0始まりのインデックス
  • 負のインデックスで末尾から選択する方法
  • :eq()セレクタとメソッドの違い
  • first()・last()・slice()との使い分け
  • 実用的なタブ・スライダー実装例
スポンサーリンク

1. eq()の基本構文

インデックスは 0始まりです。最初の要素が0、2番目が1、となります。

// 基本構文
$('li').eq(0)   // 1番目(先頭)
$('li').eq(1)   // 2番目
$('li').eq(2)   // 3番目
$('li').eq(-1)  // 最後の要素(末尾から1番目)
$('li').eq(-2)  // 末尾から2番目

// 実際の使用例
$('li').eq(0).addClass('first');   // 最初のliにクラス追加
$('li').eq(-1).addClass('last');   // 最後のliにクラス追加
$('li').eq(2).css('color', 'red'); // 3番目のliに色付け

2. 負のインデックスで末尾から選択

jQuery 1.4以降、eq() に負の値を渡すと末尾から数えた要素を返します。

<ul class="item-list">
  <li>アイテム1</li>  <!-- eq(0) / eq(-5) -->
  <li>アイテム2</li>  <!-- eq(1) / eq(-4) -->
  <li>アイテム3</li>  <!-- eq(2) / eq(-3) -->
  <li>アイテム4</li>  <!-- eq(3) / eq(-2) -->
  <li>アイテム5</li>  <!-- eq(4) / eq(-1) -->
</ul>
$('.item-list li').eq(0).text();   // 'アイテム1'
$('.item-list li').eq(-1).text();  // 'アイテム5'
$('.item-list li').eq(-2).text();  // 'アイテム4'

3. :eq()セレクタとの比較

:eq(n) セレクタでも同様の選択ができますが、メソッド形式の .eq() が推奨されます。

// セレクタ形式(古い書き方)
$('li:eq(2)').addClass('third');

// メソッド形式(推奨)
$('li').eq(2).addClass('third');

// パフォーマンス: メソッド形式がやや速い
// セレクタ形式はjQuery独自拡張でCSS標準ではないため
:eq()セレクタは非推奨傾向
:eq(n) はCSS標準のセレクタではなくjQuery独自拡張です。Sizzleエンジンを通すため若干遅く、jQuery 3.x では .eq() メソッド形式が推奨されています。

4. first()・last()・slice()との使い分け

var $li = $('ul li');

$li.eq(0)          // 0番目(1つだけ)= first() と同じ
$li.first()        // 最初の要素
$li.last()         // 最後の要素
$li.eq(-1)         // 最後の要素 = last() と同じ

// slice(start, end): 範囲選択
$li.slice(0, 3)    // 0〜2番目(3番目は含まない)
$li.slice(2)       // 2番目以降すべて
メソッド 用途 備考
eq(n) n番目の1つを選択 負数で末尾から
first() 最初の要素 eq(0)の糖衣構文
last() 最後の要素 eq(-1)の糖衣構文
slice(s,e) s〜e-1番目の範囲 複数要素を範囲選択

5. 実用例:タブ切り替えでeq()を活用

タブのインデックスとパネルのインデックスを揃えることで、eq() による対応付けが簡潔になります。

<div class="tab-wrapper">
  <ul class="tab-list">
    <li class="tab-btn active">タブ1</li>
    <li class="tab-btn">タブ2</li>
    <li class="tab-btn">タブ3</li>
  </ul>
  <div class="tab-panel active">パネル1のコンテンツ</div>
  <div class="tab-panel">パネル2のコンテンツ</div>
  <div class="tab-panel">パネル3のコンテンツ</div>
</div>
$(function () {
  $('.tab-btn').on('click', function () {
    var idx = $(this).index();  // クリックしたタブのインデックスを取得

    // タブボタンのアクティブ切り替え
    $('.tab-btn').removeClass('active');
    $(this).addClass('active');

    // 対応するパネルをeq()で指定して表示
    $('.tab-panel').hide();
    $('.tab-panel').eq(idx).show();
  });
});

まとめ

jQueryの eq() はインデックスで特定要素を選択するメソッドです。0始まりで負の値は末尾からカウントします。first()last()eq() の糖衣構文で、範囲選択は slice() を使います。タブUIのパネル対応付けなど、インデックスを活用した実装に重宝します。

関連記事: jQueryのeach()を使ったループ処理 / jQueryの.lengthプロパティで要素数をカウントする方法

よくある質問(FAQ)

Qeq()のインデックスは何番から始まりますか?
A0始まりです。最初の要素が eq(0)、2番目が eq(1) になります。負の値を使うと末尾から数えられ、eq(-1) が最後の要素です。
Q:eq()セレクタとeq()メソッドの違いは?
Aどちらも同じ要素を選択しますが、.eq() メソッド形式の方がパフォーマンスが良く推奨されます。:eq(n) はCSS標準ではないjQuery独自拡張のためjQueryエンジンを通す処理が増えます。
Q複数要素をまとめて選択したい場合は?
Aslice(start, end) を使うと範囲選択ができます。$("li").slice(0, 3) で最初の3つを取得できます。
Qクリックした要素のインデックスを取得するには?
A$(this).index() で同一親要素内でのインデックス(0始まり)を取得できます。これをeq()と組み合わせてタブUIなどに活用できます。
Q要素が存在しないインデックスを指定するとどうなる?
A要素数を超えたインデックスを指定すると空のjQueryオブジェクトが返ります。エラーにはなりませんが処理が意図通り動かないため、.length で事前確認することをお勧めします。