teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

誤記

2016/04/04 17:16

投稿

manabufukai
manabufukai

スコア700

answer CHANGED
@@ -46,9 +46,9 @@
46
46
  $(".button").on( "click.drop" , function() { //isotopeのクリックイベントと衝突しないように名前空間を使って
47
47
  var parent = $(this).parent()
48
48
  if( parent.hasClass("open") ){ //開いていれば
49
- $(this).siblings().slideUp( 200 , function(){ parent.removeClass('open') });
49
+ $(this).siblings().slideUp( 200 , function(){ parent.removeClass("open") });
50
50
  }else{ //閉じていれば
51
- $(this).siblings().slideDown( 200 , function(){ parent.addClass('open') });
51
+ $(this).siblings().slideDown( 200 , function(){ parent.addClass("open") });
52
52
  }
53
53
  });
54
54
  }
@@ -57,7 +57,7 @@
57
57
  var windowW = $(window).width();//画面の横幅を取得
58
58
 
59
59
  if( windowW < 481 ){//画面の横幅が480px以下なら
60
- dropDownLi(open)
60
+ dropDownLi()
61
61
  }
62
62
 
63
63
  $(window).resize(function(){

2

追記を追加

2016/04/04 17:16

投稿

manabufukai
manabufukai

スコア700

answer CHANGED
@@ -13,7 +13,8 @@
13
13
  $(this).children(".button:not(.is-checked)").hide(0,function(){$(this).css( "zIndex", "" );open = false;});
14
14
  }else{
15
15
  // "ul.button-group"をクリックするとその中の"li"が見えるようになって、zIndex+1
16
- $(this).children(".button").show(0,function(){$(this).css( "zIndex", 1 );open = true;});//show()の数値はdurationなのでお好みの数値を
16
+ $(this).children(".button").show(0,function(){$(this).css( "zIndex", 1 );open = true;});
17
+ /*show/hideの数値はdurationなのでお好みの数値を*/
17
18
  }
18
19
  })
19
20
  }
@@ -22,4 +23,68 @@
22
23
 
23
24
  - `$(window).load(function(){..});`の中に`$(function(){...});`が入れ子になっていましたが、入れ子にする意味が無いので、一つに。
24
25
  - body最後だったので`$(function(){...})`でいいかな…と。(もし全て読み込み後のほうが良ければ$(window).loadでもいいですが、場合によっては結構遅いので…)
25
- - 単純に表示/非表示を切り替えるだけなら`.toggle()`系のメソッドで書すっきりすると思います。
26
+ - 単純に表示/非表示を切り替えるだけなら`.toggle()`系のメソッドで書いていいと思います。
27
+
28
+
29
+
30
+
31
+ ## 4/3追記:画面リサイズでも動くように
32
+ 自分だとこのようにするかな…というコードを記載させていただきます。
33
+ ```ここに言語を入力
34
+ (function($){
35
+ var dropDown = false;//liがモバイル(ドロップダウンリスト)状態か判定する用の変数
36
+
37
+ function listOpen(){
38
+ dropDown = false; //ドロップダウン状態をOFF
39
+ $(".button:not(.is-checked)").show();
40
+ $(".button").off(".drop"); //ドロップダウン時に付加したクリックイベントをキャンセル
41
+ }
42
+
43
+ function dropDownLi(){
44
+ dropDown = true; //ドロップダウン状態をON
45
+ $(".button:not(.is-checked)").hide();
46
+ $(".button").on( "click.drop" , function() { //isotopeのクリックイベントと衝突しないように名前空間を使って
47
+ var parent = $(this).parent()
48
+ if( parent.hasClass("open") ){ //開いていれば
49
+ $(this).siblings().slideUp( 200 , function(){ parent.removeClass('open') });
50
+ }else{ //閉じていれば
51
+ $(this).siblings().slideDown( 200 , function(){ parent.addClass('open') });
52
+ }
53
+ });
54
+ }
55
+
56
+ $(function() {
57
+ var windowW = $(window).width();//画面の横幅を取得
58
+
59
+ if( windowW < 481 ){//画面の横幅が480px以下なら
60
+ dropDownLi(open)
61
+ }
62
+
63
+ $(window).resize(function(){
64
+ //window幅が変化した際にドロップダウン状態か判定し、イベントを分岐
65
+ windowW = $(window).width();
66
+ if(windowW < 481){
67
+ if(dropDown) return; //ドロップダウン状態なら以後の処理を行わない
68
+ dropDownLi()
69
+ }else{
70
+ if(!dropDown) return; //ドロップダウン状態でなければ以後の処理を行わない
71
+ listOpen()
72
+ }
73
+ })
74
+
75
+ });
76
+ })(jQuery);
77
+ ```
78
+ グローバルをあまり汚したくなかったので、クロージャにしました。
79
+ windowのresizeイベントに対して、**画面幅によってイベントを分岐させる**という処理を入れると作成できます。
80
+ resizeイベントは画面幅が変わる度に何度も呼び出されるため、記述によってはイベントがどんどん重複してしまいます。
81
+ そのため、今の状態を判別するフラグのようなものを併用して、
82
+ 状態が変わるとすぐにフラグを切り替え、それ以後同じイベントが呼ばれないようにしています。
83
+
84
+ また、よくよく考えれば変数の真偽判定だけだと、複数ドロップダウンリストを開いている時の挙動が意図した通りにならないので、親要素へのクラス有無判定に変更しました。
85
+
86
+ - ドロップダウン状態⇔通常 を何度も切り替える事も想定して、それぞれのイベントを関数にまとめました。
87
+ - 親要素であるulにクリックイベントだったのが何だか気持ちが悪かったので、li要素に対してのイベントへ変更。
88
+ - isotope側にもliに対するクリックイベントがあるので、衝突を避けるため、clickイベントに名前空間を利用しました。
89
+ - isotopeがせっかくアニメーションで動くのにドロップダウンリストの動きが無いのはちょっとアンバランスかな、と思ったので、show/hideをslideToggleにしてみました。
90
+

1

誤字の修正

2016/04/03 04:57

投稿

manabufukai
manabufukai

スコア700

answer CHANGED
@@ -10,12 +10,10 @@
10
10
  $(".button-group").click(function() {
11
11
  if(open){
12
12
  //ドロップダウンリストが開いていたら閉じる
13
- $(this).children(".button:not(.is-checked)").hide().css( "zIndex", "" );
13
+ $(this).children(".button:not(.is-checked)").hide(0,function(){$(this).css( "zIndex", "" );open = false;});
14
- open = false;
15
14
  }else{
16
15
  // "ul.button-group"をクリックするとその中の"li"が見えるようになって、zIndex+1
17
- $(this).children(".button").show(0,function(){$(this).css( "zIndex", 1 );});//show()の数値はdurationなのでお好みの数値を
16
+ $(this).children(".button").show(0,function(){$(this).css( "zIndex", 1 );open = true;});//show()の数値はdurationなのでお好みの数値を
18
- open = true;
19
17
  }
20
18
  })
21
19
  }