JavaScriptとjQueryを使って、サイト内でコンテンツをフィルタリングする方法をご紹介します。
主な使いどころは、たくさんあるニュースをジャンル分けし、選んだジャンルのニュースだけを表示させるなどの場合です。
他にも、商品のジャンル分けなど、種類別に並べなおす、という場面で非常に便利です。
まずは実例をご覧ください。
こちらにALL/RED/GREEN/BLUEの4つのボタンがあります。
これらを押すと、フィルターがかかり、その色の四角だけが表示されます。
ALLを押すと再び全てが表示されます。
- ALL
- RED
- GREEN
- BLUE
- 赤1
- 緑1
- 青1
- 赤2
- 緑2
- 青2
- 赤3
- 緑3
- 青3
- 赤4
- 緑4
- 青4
- 赤5
- 緑5
- 青5
実際のソースコードと解説
実際のソースコードはこちらです。
解説は後ほどさらに下の方に書いておきます。
HTML
対応するボタンとコンテンツに同じクラスを付与します。つまり、REDのボタンと赤のコンテンツにredというクラスを付けます。
現在選択されているボタンにis_activeクラスを付けます。ページにアクセスした初期状態ではALLのボタンに付いているようにします。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 | <!-- ボタンになるリスト --> < ul id = "filterBtnList" > < li id = "filterAll" class = "all is_active" >ALL</ li > < li id = "filterRed" class = "red" >RED</ li > < li id = "filterGreen" class = "green" >GREEN</ li > < li id = "filterBlue" class = "blue" >BLUE</ li > </ ul > <!-- ソートするコンテンツ --> < ul class = "test_list" > < li class = "red box" >赤1</ li > < li class = "green box" >緑1</ li > < li class = "blue box" >青1</ li > < li class = "red box" >赤2</ li > < li class = "green box" >緑2</ li > < li class = "blue box" >青2</ li > < li class = "red box" >赤3</ li > < li class = "green box" >緑3</ li > < li class = "blue box" >青3</ li > <!-- 要素はいくつでも並べられる --> </ ul > |
JavaScript
実装する動作を文章で表現するとこのようになります。
- いずれかのボタンをクリックしたとき、
- もし、クリックしたボタンにis_activeが無い場合は、
- クリックしたボタンのclassを取得し、全てのボタンからis_activeを削除する
- そして、クリックしたボタンにis_activeを付与する
- 全ての要素を一旦フェードアウト(削除)
- クリックしたボタンと同じclassを持っているコンテンツを表示する
- もしクリックしたボタンがALLなら、すべてのコンテンツを表示する
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | jQuery( function ($) { /* 要素を取得(ボタンと要素) */ var btnList = $( '#filterBtnList *' ), btnAll = $( '#filterAll' ), btnRed = $( '#filterRed' ), btnGreen = $( '#filterGreen' ), btnBlue = $( '#filterBlue' ), box = $( '.box' ); /* ボタンのいずれかをクリックした場合 */ btnList.click( function (){ if (!($( this ).hasClass( 'is_active' ))){ var filterClass = $( this ).attr( 'class' ); btnList.removeClass( 'is_active' ); $( this ).addClass( 'is_active' ); box.each( function () { $( this ).fadeOut(0); if ($( this ).hasClass(filterClass)){ $( this ).stop().fadeIn(300); } else if (filterClass === 'all' ){ box.stop().fadeIn(300); } }); } }); }); |
CSS
今回の実装ではスタイルはあまり関係ありません。
ボタンやコンテンツをリストではなくdivなどでも問題ありません。
ポイントはis_activeクラスの使い方で、このクラスがjsによって選ばれているボタンに付与されます。そのため、それが判るようなスタイルにします。
この例では、is_activeとhoverを同じスタイルにしています。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | /*ボタンのリスト*/ ul#filterBtnList{ list-style : none ; margin : 0 0 10px 0 ; padding : 0 ; } ul#filterBtnList li{ display : inline-block ; padding : 5px ; font-size : 12px ; border : solid 1px #000 ; cursor : pointer ; } ul#filterBtnList li:hover{ background-color : black ; color : white ; } ul#filterBtnList li.is_active{ background-color : black ; color : white ; } /*コンテンツのリスト*/ ul.test_list{ list-style : none ; margin : 0 ; padding : 0 ; } ul.test_list li{ display : inline-block ; width : 50px ; height : 50px ; margin : 0 5px 5px 0 ; color : #fff ; font-size : 10px ; text-align : center ; } ul.test_list li. red { background-color : #db5858 ;} ul.test_list li. green { background-color : #63a94d ;} ul.test_list li. blue { background-color : #4e57cb ;} |
まとめ
頻出のスクリプトだと思いますが、丁寧に解説してみました。
非常に便利なので 場合に合わせてカスタマイズしながら 使ってみてください。