質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

2回答

2406閲覧

jQueryを使ったフィルタリング機能の実装について

退会済みユーザー

退会済みユーザー

総合スコア0

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2020/01/14 03:02

編集2020/01/14 04:57

jQueryを使って、タブ切り替えのフィルタリング機能を実装しようと考えております。

フィルターは「大カテゴリー」と「小カテゴリー」の2階層に分かれていて、「大カテゴリー」でフィルタリングした値を「小カテゴリー」フィルターを使用してさらに細分化表示が出来るようになっております。

大カテゴリーフィルターは以下の3種
・All
・大カテゴリーA
・大カテゴリーB
で、
いずれかのタブを選択した際には、さらに4項目の小カテゴリー用のタブが表示され、そちらを選択する事でそれぞれにカテゴライズされた値を表示します。
【大カテゴリーA選択時】
・A小カテゴリー1
・A小カテゴリー2
・A小カテゴリー3
・A小カテゴリー4
【大カテゴリーB選択時】
・B小カテゴリー1
・B小カテゴリー2
・B小カテゴリー3
・B小カテゴリー4

大カテゴリーAll選択時には、全ての値が表示される様になっています。

以下ソースです。

HML

1<div class="tab" style="text-align:center;"><!--大カテゴリーfilter--> 2 <a href="" data-filter="all" >ALL</a> 3 <a href="" data-filter="A">大カテゴリーA</a> 4 <a href="" data-filter="B">大カテゴリーB</a> 5</div> 6 7<div class="list"><!--ここから〜大カテゴリー値--> 8 <!--小カテゴリー All用フィルター--> 9 <!--data-filterで複数値の指定が出来ない為、機能していません。【課題2】--> 10 <div class="under-tab" data-category="" > 11 <a href="" data-filter="a1 b1">ALL時の小カテゴリー1</a> 12 <a href="" data-filter="a2 b2">ALL時の小カテゴリー2</a> 13 <a href="" data-filter="a3 b3">ALL時の小カテゴリー3</a> 14 <a href="" data-filter="a4 b4">ALL時の小カテゴリー4</a> 15 </div> 16 <!--小カテゴリー A用フィルター ※ALLの時は非表示にしたい【課題1】--> 17 <div class="under-tab" data-category="A" style="display:none;"> 18 <a href="" data-filter="a1">A小カテゴリー1</a> 19 <a href="" data-filter="a2">A小カテゴリー2</a> 20 <a href="" data-filter="a3">A小カテゴリー3</a> 21 <a href="" data-filter="a4">A小カテゴリー4</a> 22 </div> 23 <!--小カテゴリー B用フィルター ※ALLの時は非表示にしたい【課題1】--> 24 <div class="under-tab" data-category="B" style="display:none;"> 25 <a href="" data-filter="b1">B小カテゴリー1</a> 26 <a href="" data-filter="b2">B小カテゴリー2</a> 27 <a href="" data-filter="b3">B小カテゴリー3</a> 28 <a href="" data-filter="b4">B小カテゴリー4</a> 29 </div><!--ここまで〜大カテゴリー値--> 30 31 <ul class="under-list"><!--ここから〜小カテゴリー値--> 32 <li data-category="A a1">A-1</li> 33 <li data-category="B b1">B-1</li> 34 <li data-category="A a2">A-2</li> 35 <li data-category="B b2">B-2</li> 36 <li data-category="A a3">A-3</li> 37 <li data-category="B b3">B-3</li> 38 <li data-category="A a4">A-4</li> 39 <li data-category="B b4">B-4</li> 40 </ul><!--ここまで〜小カテゴリー値--> 41</div>

CSS

1.tab{ margin:30px 0 50px; } 2.tab a{ border:solid black 5px; padding:10px; } 3.under-tab{ text-align:center; margin:30px; } 4.under-tab a{ border:solid red 3px; padding:10px; } 5.under-tab:nth-child(2) a{ border:solid yellow 3px; } 6.under-tab:nth-child(3) a{ border:solid green 3px; }

jQuery

1$(function(){ 2 var $tab = $('.tab [data-filter]'),//大カテゴリーフィルター 3 $list = $('.list [data-category]'),//大カテゴリー値 4 $underTab = $('.under-tab [data-filter]'),//小カテゴリーフィルター 5 $underList = $('.under-list [data-category]');//大カテゴリー値 6 7//大カテゴリーフィルタリング機能 8 $tab.on('click', function(e) { 9 e.preventDefault(); 10 11 var $btnTxt = $(this).attr('data-filter'); 12 13 if ($btnTxt == 'all'){ 14 $list.fadeOut().promise().done(function() { 15 $list.addClass('animate').fadeIn(); 16 });//allの時にはとかく全てをfadeInする 17 } else { 18 $list.fadeOut().promise().done(function() { 19 $list.filter('[data-category~= "' + $btnTxt + '"]').addClass('animate').fadeIn(); 20 });//allじゃない時にはfilterをかけてdata-categoryの値が一致したもののみをfadeInする 21 } 22 }); 23 24//小カテゴリーフィルリング機能 25 $underTab.on('click', function(e) { 26 e.preventDefault(); 27 28 var $btnTxt = $(this).attr('data-filter'); 29 30 if ($btnTxt == 'all'){ 31 $underList.fadeOut().promise().done(function() { 32 $underList.addClass('animate').fadeIn(); 33 }); 34 } else { 35 $underList.fadeOut().promise().done(function() { 36 $underList.filter('[data-category~= "' + $btnTxt + '"]').addClass('animate').fadeIn(); 37 }); 38 } 39 }); 40 41}); 42</script> 43 44<script>//選択中タブの可視化用 45$(function(){ 46 var tabOn = $('.tab a'); 47 tabOn.click(function(){ 48 tabOn.removeClass('tab_active'); 49 $(this).addClass('tab_active'); 50 }); 51}); 52</script>

###課題1
大カテゴリー「All」を選択時には全ての値が表示されるのですが、この時には「Aカテゴリー」と「Bカテゴリー」のフィルタータブは非表示にしたい。
(All用に作成したフィルタータブのみ表示したい。)
イメージ説明

###課題2
All用のフィルタータブをクリックした場合、「A小カテゴリー」と「B小カテゴリー」それぞれの値を表示したい。
※data-filterで、複数の値を適用したい。
【All用フィルターの値】
・小カテゴリーA、Bそれぞれの1
・小カテゴリーA、Bそれぞれの2
・小カテゴリーA、Bそれぞれの3
・小カテゴリーA、Bそれぞれの4
イメージ説明

以上
何卒お力添えいただけますと幸いでございます。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thyda.eiqau

2020/01/14 04:34

> jQuery未勉強者ですが、 勉強していないのであれば回答(解説)しても理解されないと思うのですが、どのような回答をお望みなのでしょうか
退会済みユーザー

退会済みユーザー

2020/01/14 04:54 編集

実際のソースコード変更箇所を教えていただけると有り難いです。
退会済みユーザー

退会済みユーザー

2020/01/14 05:01

本件jQuery部分も試行錯誤しながらなんとなくで理解を進めておりましたが。。。 teratail利用の認識も含めて、勉強不足でした。 真面目にご回答くださいます利用者の皆様には、大変失礼いたしました。
thyda.eiqau

2020/01/14 05:01

つまり、どうしたら直るのかを理解したいわけではなく、単純に直してほしいということですか?
thyda.eiqau

2020/01/14 05:03

おっと、タイミングが重なってしまいましたね。私の14:01のコメントは、先の「実際のソースコード変更箇所を教えていただけると有り難いです。」に対する質問です。
退会済みユーザー

退会済みユーザー

2020/01/14 05:07

>つまり、どうしたら直るのかを理解したいわけではなく、単純に直してほしいということですか? 恥ずかしながら、初めはそういう意図が大きかったです。 ご指摘いただいて考え方を改めました。 お目汚し失礼いたしました。
thyda.eiqau

2020/01/14 05:11

考え方を改められたとのことですので改善すべき点を指摘することにします。
退会済みユーザー

退会済みユーザー

2020/01/14 05:14

ありがとうございます。 何卒よろしくお願い申し上げます。
guest

回答2

0

課題1

大カテゴリー「All」を選択時には全ての値が表示されるのですが、この時には「Aカテゴリー」と「Bカテゴリー」のフィルタータブは非表示にしたい。
(All用に作成したフィルタータブのみ表示したい。)

js

1 if ($btnTxt == 'all'){ 2 $list.fadeOut().promise().done(function() { 3 $list.addClass('animate').fadeIn(); 4 });//allの時にはとかく全てをfadeInする 5 } else { 6 $list.fadeOut().promise().done(function() { 7 $list.filter('[data-category~= "' + $btnTxt + '"]').addClass('animate').fadeIn(); 8 });//allじゃない時にはfilterをかけてdata-categoryの値が一致したもののみをfadeInする 9 }

ここで「とにかくすべてをfadeIn」しているのが原因です。


課題2

All用のフィルタータブをクリックした場合、「A小カテゴリー」と「B小カテゴリー」それぞれの値を表示したい。
※data-filterで、複数の値を適用したい。

やりかたはいくつかありますが、現状のコードを活かすのであれば、filter() に何を渡すのかを意識するのがよいでしょう。
API Document を見ると、 filter() には複数の引数を渡すことができると書いてあります。このうち、 selector を渡すか、 function を渡すのがよいかと思います。
selector を渡す場合ですが、セレクタはカンマ区切りで複数指定することができますので、

js

1const filterString = $(this).attr('data-filter').split(' ').map(function(category) { 2 return `[data-category~="${category}"]`; 3}).join(',');

とすることで、複数の条件をターゲットとしたセレクターを作ることができます。
他方、 function を渡す場合では、シンプルに .filter(function() { $(this) }) の形で、フィルターの検査対象の要素の一つ一つにアクセスすることができますので、この $(this) に対して条件分けをして、最終的に function の中で return true すればフィルターの結果表示され、 return false すればフィルターの結果除外されます。

投稿2020/01/14 05:19

thyda.eiqau

総合スコア2982

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/14 05:38

ご回答ありがとうございます。 ・課題1について if ($btnTxt == 'all'){ $list.fadeOut().promise().done(function() { $list.addClass('animate').fadeIn(); });//allの時にはとかく全てをfadeInする この箇所の中の .fadeIn(); にて、表示したくないものを除外出来ればいいんですね。 ・課題2について いただいたコードを紐解きながら、勉強を進める事が出来ます。 ありがとうございます!
guest

0

ざっくりこんな感じ

投稿2020/01/14 05:05

yambejp

総合スコア114839

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/01/14 05:07

・大カテゴリーにもクラスをつかたほうが楽 ・カスタムデータは複数指定するなら配列をつかう ・Aで小カテゴリ選んだあと、Bを選び直したときどうする?
退会済みユーザー

退会済みユーザー

2020/01/14 05:30

>カスタムデータは複数指定するなら配列をつかう なるほど「配列」ですね。 >Aで小カテゴリ選んだあと、Bを選び直したときどうする? この時は、Bの値のみを表示する事を想定しております。 ご回答くださいまして誠にありがとうございます。 いただいたソースを元に勉強を進めます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問