質問編集履歴
3
修正
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
|
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
|
-
・クラス名`
|
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
|
-
|
12
|
+
<li class="mainNav__item">
|
113
|
-
|
13
|
+
<a href="#" class="mainNav__item__link is-toggle-accNav">メニュー1(クリックで開く)</a>
|
114
|
-
|
14
|
+
<ul class="mainNavKids">
|
15
|
+
<li class="mainNavKids__item"><a href="./test.html" class="mainNav__item__link">サブメニュー1</a></li>
|
115
|
-
|
16
|
+
<li class="mainNavKids__item"><a href="#" class="mainNav__item__link">サブメニュー1</a></li>
|
116
|
-
|
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
|
-
|
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
|
-
</
|
31
|
+
</div>
|
120
|
-
<li class="mainNav__item">
|
121
|
-
<a href="#" class="mainNav__toggleAcc js-mainNav__toggleAcc">メニュー2</a>
|
122
|
-
|
32
|
+
</nav>
|
123
|
-
</ul>
|
124
33
|
〜略〜
|
125
34
|
<script>
|
126
35
|
$(function(){
|
127
|
-
$(".
|
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
|
-
$('.
|
43
|
+
$('.mainNav__item__link').each(function(){
|
135
44
|
var $href = $(this).attr('href');
|
136
45
|
if(location.href.match($href)) {
|
137
|
-
$(this).parent().addClass('
|
46
|
+
$(this).parent().addClass('current');
|
138
|
-
$(this).parent().parent().parent().addClass('
|
47
|
+
$(this).parent().parent().parent().addClass('current');
|
139
48
|
} else {
|
140
|
-
$(this).parent().removeClass('
|
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に`
|
61
|
+
現在もしくは遷移時のページを子メニュー1とし、ロード時にメニュー1と子メニュー1に`current`が付与され、メニュー1のアコーディオンが展開されている。
|
152
62
|
|
153
63
|
```
|
64
|
+
〜略〜
|
154
65
|
<ul class="mainNav">
|
155
|
-
<li class="mainNav__item
|
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
|
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
|
-
|
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
|

|
2
文章変更
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 一部変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -124,12 +124,9 @@
|
|
124
124
|
〜略〜
|
125
125
|
<script>
|
126
126
|
$(function(){
|
127
|
-
|
127
|
+
$(".js-mainNav__toggleAcc").on("click", function() {
|
128
|
-
$(this).on('click',function(){
|
129
|
-
|
128
|
+
$(this).next().slideToggle();
|
130
|
-
return false;
|
131
|
-
|
129
|
+
});
|
132
|
-
});
|
133
130
|
});
|
134
131
|
|
135
132
|
//current
|