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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1463閲覧

JavaScriptでアコーディオン開閉機能を実装したい

ah6BD2gZo5GnjnT

総合スコア46

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2020/10/04 11:58

編集2020/10/05 02:34

実現したい事

アコーディオン機能をJsで実装しようと試みているのですが、開閉機能がなかなか実装出来ません。
Qを押すと、隠れているAが開くというような単純な動きです。。

ただし、クリックしたら、それに属するアコーディオン一つのみ開いている状態にしたいのです。

分からない点

nextElementSiblingとnextSiblingの違いがよく分かりません。また、ループ内での処理も正しいのか
確信を持てません。ご教授頂けますと、幸いで御座います。もしかすると、HTML構造のロジックがしっかりしていないのかもしれません、、、、、。

ソースコード

HTML

1<section id =qanda> 2 3 <div id =qa-wrapper> 4 <h2>よくあるご質問</h2> 5 6 <dl class="qa"> 7 <dt class="question_txt" data-hoge="q3"><span class="qicon">Q</span>矯正治療の費用を教えてください.また、学生ローンは組むことが出来ますか?</dt> 8 <dd id="toggle" class="answer_txt"> 9 <p><span>A:</span>費用は、万円(税込)となっております</p> 10 </dd> 11 12 <dt class="question_txt" data-hoge="q3"><span class="qicon">Q</span>目安の治療期間を教えてください.過去の患者のbefore,afterも知りたいです。</dt> 13 <dd id="toggle" class="answer_txt"> 14 <p><span>A:</span>患者様の経過状況は 15 <a href="#">こちら</a>で公開しております。</p> 16 </dd> 17 18 <dt class="question_txt" data-hoge="q3"><span class="qicon">Q</span>矯正治療の費用を教えてください.また、学生ローンは組むことが出来ますか?</dt> 19 <dd id="toggle" class="answer_txt"> 20 <p><span>A:</span>費用は、万円(税込)となっております</p> 21 </dd> 22 23 <dt class="question_txt" data-hoge="q3"><span class="qicon">Q</span>矯正治療の費用を教えてください.また、学生ローンは組むことが出来ますか?</dt> 24 <dd id="toggle" class="answer_txt"> 25 <p><span>A:</span>費用は、万円(税込)となっております</p> 26 </dd> 27 </dl> 28 29</div> 30</section>

css

1/*リセットcss*/ 2*, 3p, 4div, 5ul, 6li, 7article, 8section, 9footer, 10header { 11 margin: 0; 12 padding: 0; 13} 14 15img { 16 vertical-align: bottom; 17} 18 19body { 20 border-top: solid 8px #6cc6c4; 21 background-color: #f6f6f6; 22} 23 24a, 25p, 26h1, 27h2, 28h3 { 29 font-family: serif; 30} 31 32section h2 { 33 padding: 10px; 34 text-align: left; 35} 36 37header { 38 width: 1050px; 39 margin: 0 auto; 40 margin-bottom: 10px; 41} 42 43header h1 { 44 float: left; 45 padding: 35px; 46 padding-left: 0px; 47} 48 49.header-right { 50 float: right; 51 padding-top: 10px; 52 margin-right: 3px; 53} 54 55p.yoyaku { 56 border: solid 1px #d6d6d6; 57 padding: 10px; 58} 59 60.stickey { 61 position: sticky; 62 top: 0; 63} 64 65.colored { 66 background-color: brown; 67} 68 69.resize { 70 width: 20%; 71} 72 73#header { 74 width: 1050px; 75 margin: 10px auto 0; 76} 77 78#header li + li:before { 79 content: "<"; 80 margin-right: 5px; 81} 82 83#header li { 84 display: inline; 85} 86 87ul { 88 list-style: none; 89} 90 91li { 92 text-decoration: none; 93} 94 95nav ul { 96 display: flex; 97 width: 1050px; 98 margin: 0 auto; 99} 100 101nav ul ul { 102 position: absolute; 103 top: 100%; 104 left: 0; 105 display: none; 106} 107 108nav ul ul li { 109 width: 100%; 110 background-color: navy; 111 border-bottom: 1px solid #fff; 112 right: 0px; 113 width: 190px; 114 z-index: 999; 115 position: relative; 116} 117 118nav ul > li { 119 justify-content: center; 120 background-color: #6cc6c4; 121 width: 20%; 122 padding: 10px; 123 text-align: center; 124 border-right: 1px solid white; 125 position: relative; 126} 127 128nav ul li a { 129 font-size: 0.85em; 130} 131 132nav ul li a { 133 color: white; 134 text-decoration: none; 135} 136 137nav ul > ul > li { 138 background-color: #6cc6c4; 139 width: 200px; 140 display: block; 141 padding: 10px; 142 text-align: center; 143 border-right: 1px solid white; 144} 145 146li.parent { 147 position: relative; 148} 149 150ul.children { 151 left: 100.8%; 152 top: 0; 153 position: absolute; 154 display: none; 155} 156 157li.parent:hover ul.children { 158 display: block; 159 opacity: 0.87; 160} 161 162.clearfix::after { 163 clear: both; 164 display: block; 165 content: ""; 166} 167 168main, 169footer { 170 width: 1050px; 171 margin: 0 auto; 172} 173 174main { 175 border: solid 1px inherit; 176} 177 178#wrapper { 179 width: 100%; 180} 181 182.left-content { 183 width: 25%; 184 float: left; 185 margin-top: 3.2em; 186} 187 188.top h2, 189.bottom h2 { 190 background-color: #6cc6c4; 191 color: white; 192 font-size: 1em; 193 text-align: left; 194 padding: 10px; 195 border-radius: 6px 6px 0px 0px; 196} 197 198.left-content ul { 199 border-right: 1px solid #6cc6c4; 200 border-left: 1px solid #6cc6c4; 201 background-color: white; 202} 203 204.left-content ul li { 205 background-color: white; 206 margin-bottom: 10px; 207 padding: 10px; 208 border-bottom: 1px solid #6cc6c4; 209 font-size: 0.9em; 210} 211 212.left-content li::before { 213 content: "●"; 214 color: #6cc6c4; 215 font-size: 0.8em; 216} 217 218.left-content ul li a { 219 margin-left: 5px; 220} 221 222.first-last { 223 border-bottom: 0px; 224} 225 226.top { 227 margin-bottom: 15px; 228} 229 230.right-content { 231 width: 73%; 232 float: right; 233} 234 235.right-content p { 236 width: auto; 237} 238 239#imformation { 240 width: 99.5%; 241 background-color: white; 242 padding: 0; 243} 244 245.imfor-dl { 246 margin-bottom: 50px; 247} 248 249dl { 250 padding: 5px; 251} 252 253dd { 254 width: 30%; 255 padding: 10px; 256 padding-left: 0px; 257 padding-bottom: 15px; 258 float: left; 259} 260 261dt { 262 border-bottom: 1px dashed #6cc6c4; 263 padding-bottom: 6px; 264 padding-top: 6px; 265} 266 267/*ここから質問と回答コーナー*/ 268#qa-wrapper { 269 text-align: center; 270 margin-top: 2.3em; 271} 272 273.qablock { 274 position: relative; 275 margin-bottom: 20px; 276 background: #eee9e6; 277 border: 1px solid #eee9e6; 278} 279 280.question_txt { 281 cursor: pointer; 282 padding: 5px; 283 margin: 10px !important; 284 border-bottom: 1px dashed #6f5436; 285} 286 287.qicon { 288 color: #6f5436; 289 font-weight: bold; 290 margin-right: 15px; 291} 292 293.answer_txt { 294 margin: 0px; 295 padding: 20px 15px; 296 width: 100%; 297 display: none; 298} 299 300.question_txt::after { 301 content: "▼" !important; 302 width: 43px; 303 height: 43px; 304 line-height: 43px; 305 top: 0; 306 left: 0; 307 margin-left: 5px; 308 margin-top: 0px; 309 color: #b4ada9; 310} 311 312.question_txt2::after { 313 content: "△" !important; 314 color: #b4ada9; 315} 316 317.qa { 318 background: #fff; 319 overflow: hidden; 320} 321 322.show { 323 display: block; 324} 325 326.page-top { 327 display: none; 328 position: fixed; 329 right: 10px; 330 bottom: 10px; 331} 332 333.open { 334 display: block; 335} 336 337/*ここからfooter*/ 338footer { 339 background-color: #6cc6c4; 340 border-radius: 5px; 341 color: white; 342} 343 344footer ul { 345 display: flex; 346} 347 348footer li { 349 justify-content: space-around; 350 margin-right: auto; 351 margin-left: auto; 352} 353

JavaScript

1//アクセスページのアコーディオン 2window.addEventListener("DOMContentLoaded", () => { 3 const qa = document.querySelectorAll(".question_txt"); 4 5 for (let i = 0; i < qa.length; i++) { 6 qa[i].addEventListener("click", Slide()); 7 } 8 function Slide() { 9 const toggle = document.querySelectorAll("#toggle"); 10 /*ここがエラーになってしまう */ 11 this.nextElementSibling.classList.toggle("show"); 12 this.classlist.toggle("question_txt2"); 13 const next_dd = this.nextSibling(toggle); 14 15 if (next_dd.style.height !== "0px") { 16 next_dd.style.height = "0px"; 17 next_dd.classlist.remove("question_txt2"); 18 } 19 } 20}); 21

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

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

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

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

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

kuma_kuma_

2020/10/04 12:00

大至急 企業、システムが判別できる文字はすぐ削除して別の文字に変更して下さい。
kuma_kuma_

2020/10/04 22:32

いや直してくださいよ。
ah6BD2gZo5GnjnT

2020/10/05 00:03

企業名の含まれているリンクが問題だと思ってそれを消したんですが違うんですかね
kuma_kuma_

2020/10/05 01:09

文章で色々かかれてるでしょ(<dd>タグの中)?それで検索したらどこのシステム(HP)か判断つきますよね? それに質問として内部処理について書かれることは「システムの情報漏えい」になります。 ここの内容は数時間もしない内にGoogleに拾われます。 質問者様が質問したサイトはここでこんな仕組みで動いている。と公表しているのと同じ。 さらにシステム内部の情報まで漏らしているので「悪意」がある人が知ったら HPの改変等行われかねません。 質問するなら「...のみの対応となります...」等を「xxxxxxxxx」とかにして下さい。 これお客様に知れたら大変なことになりますよ?
ah6BD2gZo5GnjnT

2020/10/05 02:31

これ全て、私が考案したダミーテキストなんですが、アウトなんですね。 丁寧にありがとう御座います。
kuma_kuma_

2020/10/05 02:33

(いやもう特定したけど...)
guest

回答1

0

ベストアンサー

まずHTMLコードの間違い。

html

1<section id =qanda> 2 3 <div id =qa-wrapper>

idの名前は引用符(" または ')で囲む。上記は下記のように修正。

html

1<section id="qanda"> 2 3 <div id="qa-wrapper">

id="toggle"が複数あるが、id名に重複は許されない。これは不要なので削除する。

JavaScriptコードの間違い。

js

1 qa[i].addEventListener("click", Slide());

Slide() の括弧は不要。()があると関数の戻り値を渡すことになる。

js

1 qa[i].addEventListener("click", Slide);

function Slide()内のコードは意味不明。
自分が書くなら下記のようにします。

js

1//アクセスページのアコーディオン 2 function Slide() { 3 for (let i = 0; i < qa.length; i++) { 4 if(this == qa[i]){ 5 qa[i].classList.toggle("question_txt2"); 6 }else{ 7 qa[i].classList.remove("question_txt2"); 8 } 9 } 10 }

CSSに下記を追加すれば、上記のコードで開閉できます。

css

1.question_txt2 + dd { 2 display: block; 3}

CodePenサンプル

投稿2020/10/04 14:25

編集2020/10/04 14:35
hatena19

総合スコア34075

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問