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

質問編集履歴

3

修正

2020/01/23 02:14

投稿

crigw
crigw

スコア24

title CHANGED
@@ -1,1 +1,1 @@
1
- js制御のアコーディオンメニューカレントクラス名付与と付与時に初期から展させる
1
+ JS アコーディオンメニュー カレントクラス名付与した部分を
body CHANGED
@@ -2,145 +2,55 @@
2
2
  チェックボックスでアコーディンを開閉を制御していましたが、今後メニュー項目の増加で`input`と`label`の記述が多くなるという理由からjsに変えました。
3
3
 
4
4
  ### やりたいこと
5
- js制御で動くアコーディオンメニューに対して、旧デザインのチェックボックス時動作同様の以下の動きを実現させたいのですが、修正点の予測がついても変更の仕方がわかりません。
6
- ・URLから現在地を取得して`li`にカレントのクラス名を付与`mainNavKids__item--current`
7
- ・カレントクラスは親と子どちらの`li`にもつける
8
- ・クラス名`mainNavKids__item--current`が付与された場合アコーディオンの初期値をアコーディオン展開にする
5
+ ・クラス名`current`が付与された場合、該当のアコーディオンをアコーディオン展開にする
9
6
 
10
- 数カ所触ってみましたが、クラス名は全ての`li`に付与されてしまい、アコーディオンの展開は実現できませんでした。
11
- 以下新旧のHTML+css+jsの記述です。基本的にはCSSに変更がないため、新には記載していません。
12
-
13
- ### 旧html+css+js
14
- ```
15
- <style>
16
- /*=============== ul.subNab/// accordion ===============*/
17
- .mainNavBox ul.mainNav>li.mainNav__item>input.acc-subOpen { display: none; }
18
- .mainNavBox ul.mainNav>li.mainNav__item>label.acc-unshown {
19
- display: block;
20
- margin-bottom: 1px;
21
- }
22
- .mainNavBox ul.mainNav>li.mainNav__item>ul.mainNavKids {
23
- height: 0;
24
- opacity: 0;
25
- visibility: hidden;
26
- }
27
- .mainNavBox ul.mainNav>li.mainNav__item>ul.mainNavKids>li {}
28
- .mainNavBox ul.mainNav>li.mainNav__item>ul.mainNavKids>li>a {
29
- color: rgba(240,245,250,.7);
30
- font-size: 1.3rem;
31
- line-height: 1.4;
32
- padding: 6px 12px;
33
- }
34
- .mainNavBox ul.mainNav>li.mainNav__item>ul.mainNavKids>li>a:hover { color: #fd8a39; }
35
- .mainNavBox ul.mainNav>li.mainNav__item>ul.mainNavKids>li.current>a { color: #fff; }
36
-
37
- .mainNavBox ul.mainNav>li.mainNav__item>input.acc-subOpen:checked + label.acc-unshown + ul.mainNavKids {
38
- background-color: #32373c;
39
- height: auto;
40
- opacity: 1;
41
- padding: 7px 0 8px;
42
- visibility: visible;
43
- }
44
- /*---------- accordion/// icon ----------*/
45
- .mainNavBox ul.mainNav>li.mainNav__item>label.acc-unshown::after {
46
- display: block;
47
- line-height: 2;
48
- height: 34px;
49
- width: 34px;
50
- top: 0;
51
- right: 0;
52
- position: absolute;
53
- -webkit-transition: all 0.35s;
54
- transition: all 0.35s;
55
- text-align: center;
56
- }
57
- .mainNavBox ul.mainNav>li.mainNav__item>input.acc-subOpen[type=checkbox] + label::after {
58
- content: '+';
59
- }
60
- .mainNavBox ul.mainNav>li.mainNav__item>input.acc-subOpen[type=checkbox]:checked + label::after {
61
- transform: rotate(315deg);
62
- }
63
- @media screen and (max-width:768px) {
64
- { display: none; }
65
- .unshown { display: none; }
66
- .mainNavBox { display: none; }
67
- }
68
- </style>
69
- 〜略〜
70
- <ul class="mainNav">
71
- <li class="mainNav__item">
72
- <input id="acc-subOpen-menu2" class="acc-subOpen" type="checkbox">
73
- <label class="acc-unshown" for="acc-subOpen-menu1">メニュー1</label>
74
- <ul class="mainNavKids">
75
- <li><a href="#">子メニュー1</a></li>
76
- <li><a href="#">子メニュー2</a></li>
77
- </ul>
78
- </li>
79
- <li class="mainNav__item">
80
- <input id="acc-subOpen-menu1" class="acc-subOpen" type="checkbox">
81
- <label class="acc-unshown" for="acc-subOpen-menu2">メニュー2</label>
82
- <ul class="mainNavKids">
83
- <li><a href="#">子メニュー1</a></li>
84
- <li><a href="#">子メニュー2</a></li>
85
- </ul>
86
- </li>
87
- <li class="mainNav__item"><a href="#">メニュー3</a></li>
88
- </ul>
89
- 〜略〜
90
- <script>
91
- //current
92
- $(function(){
93
- $('.js-mainNav__toggleAcc').each(function(){
94
- var $href = $(this).attr('href');
95
- if(location.href.match($href)) {
96
- $(this).parent().addClass('current');
97
- $(this).parent().parent().parent().addClass('current');
98
- } else {
99
- $(this).parent().removeClass('current');
100
- }
101
- });
102
- });
103
- //current-open
104
- $(function(){
105
- $('.acc-subOpen', $('.current').closest('.item')).prop('checked', true).trigger('change');
106
- });
107
- </script>
108
- ```
109
7
  ### 新html
110
8
  ```
9
+ <nav class="collapsibleNav">
10
+ <div class="collapsibleNav__wrap">
111
- <ul class="mainNav">
11
+ <ul class="mainNav">
112
- <li class="mainNav__item">
12
+ <li class="mainNav__item">
113
- <span class="mainNav__toggleAcc js-mainNav__toggleAcc">メニュー1</span>
13
+ <a href="#" class="mainNav__item__link is-toggle-accNav">メニュー1(クリックで開く)</a>
114
- <ul class="mainNavKids">
14
+ <ul class="mainNavKids">
15
+ <li class="mainNavKids__item"><a href="./test.html" class="mainNav__item__link">サブメニュー1</a></li>
115
- <li class="mainNavKids__item"><a href="">サブメニュー1</a></li>
16
+ <li class="mainNavKids__item"><a href="#" class="mainNav__item__link">サブメニュー1</a></li>
116
- <li class="mainNavKids__item"><a href="">サブメニュー1</a></li>
17
+ <li class="mainNavKids__item"><a href="#" class="mainNav__item__link">サブメニュー1</a></li>
18
+ </ul>
19
+ </li>
20
+ <li class="mainNav__item">
21
+ <span class="is-toggle-accNav">メニュー2(クリックで開く)</span>
22
+ <ul class="mainNavKids">
117
- <li class="mainNavKids__item"><a href="">サブメニュー1</a></li>
23
+ <li class="mainNavKids__item"><a href="#" class="mainNav__item__link">サブメニュー1</a></li>
24
+ <li class="mainNavKids__item"><a href="#" class="mainNav__item__link">サブメニュー1</a></li>
25
+ </ul>
26
+ </li>
27
+ <li class="mainNav__item">
28
+ <a href="#" class="">メニュー1(クリックで開く)</a>
29
+ </li>
118
30
  </ul>
119
- </li>
31
+ </div>
120
- <li class="mainNav__item">
121
- <a href="#" class="mainNav__toggleAcc js-mainNav__toggleAcc">メニュー2</a>
122
- </li>
32
+ </nav>
123
- </ul>
124
33
  〜略〜
125
34
  <script>
126
35
  $(function(){
127
- $(".js-mainNav__toggleAcc").on("click", function() {
36
+ $(".is-toggle-accNav").on("click", function() {
128
- $(this).next().slideToggle();
37
+ $(this).next().slideToggle(500);
129
38
  });
130
39
  });
131
40
 
132
41
  //current
133
42
  $(function(){
134
- $('.js-mainNav__toggleAcc').each(function(){
43
+ $('.mainNav__item__link').each(function(){
135
44
  var $href = $(this).attr('href');
136
45
  if(location.href.match($href)) {
137
- $(this).parent().addClass('mainNavKids__item--current');
46
+ $(this).parent().addClass('current');
138
- $(this).parent().parent().parent().addClass('mainNavKids__item--current');
47
+ $(this).parent().parent().parent().addClass('current');
139
48
  } else {
140
- $(this).parent().removeClass('mainNavKids__item--current');
49
+ $(this).parent().removeClass('current');
141
50
  }
142
51
  });
143
52
  });
53
+
144
54
  //current-open
145
55
  $(function(){
146
56
  $('.acc-subOpen', $('.mainNav__current').closest('.mainNav__item')).prop('checked', true).trigger('change');
@@ -148,21 +58,18 @@
148
58
  </script>
149
59
  ```
150
60
  ### 完成イメージ
151
- 現在もしくは遷移時のページを子メニュー1とし、ロード時にメニュー1と子メニュー1に`mainNavKids__item--current`が付与され、メニュー1のアコーディオンが展開されている。
61
+ 現在もしくは遷移時のページを子メニュー1とし、ロード時にメニュー1と子メニュー1に`current`が付与され、メニュー1のアコーディオンが展開されている。
152
62
 
153
63
  ```
64
+ 〜略〜
154
65
  <ul class="mainNav">
155
- <li class="mainNav__item mainNavKids__item--current">
66
+ <li class="mainNav__item current">
156
67
  <span class="mainNav__toggleAcc js-mainNav__toggleAcc">メニュー1</span>
157
68
  <ul class="mainNavKids">
158
- <li class="mainNavKids__item mainNavKids__item--current"><a href="">サブメニュー1</a></li>
69
+ <li class="mainNavKids__item current"><a href="">サブメニュー1</a></li>
159
70
  <li class="mainNavKids__item"><a href="">サブメニュー1</a></li>
160
71
  <li class="mainNavKids__item"><a href="">サブメニュー1</a></li>
161
72
  </ul>
162
- </li>
73
+ 〜略〜
163
- <li class="mainNav__item">
164
- <a href="#" class="mainNav__toggleAcc js-mainNav__toggleAcc">メニュー2</a>
165
- </li>
166
- </ul>
167
74
  ```
168
75
  ![完成イメージ](4f771ef6fb4f7186723a5235b400932e.png)

2

文章変更

2020/01/23 02:14

投稿

crigw
crigw

スコア24

title CHANGED
File without changes
body CHANGED
@@ -7,7 +7,7 @@
7
7
  ・カレントクラスは親と子どちらの`li`にもつける
8
8
  ・クラス名`mainNavKids__item--current`が付与された場合アコーディオンの初期値をアコーディオン展開にする
9
9
 
10
- 数カ所触ってみましたが、クラス名の付与及びアコーディオンの展開は実現できませんでした。
10
+ 数カ所触ってみましたが、クラス名は全て`li`に付与されてしまい、アコーディオンの展開は実現できませんでした。
11
11
  以下新旧のHTML+css+jsの記述です。基本的にはCSSに変更がないため、新には記載していません。
12
12
 
13
13
  ### 旧html+css+js

1

js 一部変更

2020/01/22 08:29

投稿

crigw
crigw

スコア24

title CHANGED
File without changes
body CHANGED
@@ -124,12 +124,9 @@
124
124
  〜略〜
125
125
  <script>
126
126
  $(function(){
127
- $('.js-mainNav__toggleAcc').each(function(){
127
+ $(".js-mainNav__toggleAcc").on("click", function() {
128
- $(this).on('click',function(){
129
- $("+.mainNavKids",this).slideToggle();
128
+ $(this).next().slideToggle();
130
- return false;
131
- });
129
+ });
132
- });
133
130
  });
134
131
 
135
132
  //current