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

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

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

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

JavaScript

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

Q&A

解決済

2回答

1924閲覧

アコーディオンの中の高さを再取得したい。

noel0718

総合スコア20

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

JavaScript

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

0グッド

0クリップ

投稿2021/09/19 07:27

編集2021/09/20 08:19

https://codepen.io/aaronbushnell/pen/eGVdzv/
上記のサイトを参考にslideDown・slideUpを使わないアコーディオンを作成しました。
アコーディオンの中の高さ取得で1点不具合があります。アコーディオンの中にアコーディオンがあるパターンがあるのですが
どちらも開いて、どちらも閉じて再度アコーディオンを開くとどちらの高さが残ったままとなり、
開く動きが早くなってしまいます。高さをリセットするような処理が必要になると思うのですが
どう処理をしていいかわかりません。リセットすることで動きが同じになるのではと思っています。

わかる方がいましたら、教えていただけますでしょうか。

html

1<div class="c-accordion js-accordion is-active"> 2 <button type="button" class="c-accordion__trigger js-accordion__trigger"> 3 <span class="c-headline-lv2">アコーディオンタイトル</span> 4 </button> 5 <div class="c-accordion__panel js-accordion__panel"> 6 <div class="c-accordion__content"> 7 <p>この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。</p> 8 </div> 9 </div> 10</div> 11<div class="c-accordion js-accordion"> 12 <button type="button" class="c-accordion__trigger js-accordion__trigger"> 13 <span>アコーディオンタイトル</span> 14 </button> 15 <div class="c-accordion__panel js-accordion__panel"> 16 <div class="c-accordion__content"> 17 <p>この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。</p> 18 </div> 19 <!--アコーディオンの中にアコーディオンがある場合--> 20 <div class="c-accordion js-accordion"> 21 <button type="button" class="c-accordion__trigger js-accordion__trigger"> 22 <span>アコーディオンタイトル</span> 23 </button> 24 <div class="c-accordion__panel js-accordion__panel"> 25 <div class="c-accordion__content"> 26 <p>この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。</p> 27 </div> 28 </div> 29 </div> 30 </div> 31</div>

css

1 2[class*="js-accordion"]:not([data-accordion-device="sp"]) .js-accordion__trigger { 3 cursor: pointer; 4} 5 6[class*="js-accordion"]:not([data-accordion-device="sp"]).is-hidden .js-accordion__panel { 7 position: absolute; 8 opacity: 0; 9 visibility: hidden; 10} 11 12[class*="js-accordion"]:not([data-accordion-device="sp"]) .js-accordion__panel { 13 overflow: hidden; 14 transition: 0.5s max-height; 15 will-change: max-height; 16} 17 18.c-accordion { 19 border: #ddd 1px solid; 20} 21 22.c-accordion + .c-accordion { 23 margin-top: -1px; 24} 25 26.c-accordion__trigger { 27 position: relative; 28 width: 100%; 29 padding: 15px 60px 15px 20px; 30 font-weight: bold; 31 background-color: #555; 32 color: #fefefe; 33} 34 35.c-accordion__content { 36 padding: 20px; 37}

javascript

1class Accordion { 2 constructor(element) { 3 this.element = element; 4 this.tabs = this.element.querySelector('.js-accordion__trigger'); 5 this.panels = this.element.querySelector('.js-accordion__panel'); 6 this.isOpen = false; 7 this.height = 0; 8 this.events(); 9 this.close(); 10 } 11 events() { 12 this.tabs.addEventListener('click', this.handleClick.bind(this)); 13 this.panels.addEventListener('transitionend', this.handleTransition.bind(this)); 14 } 15 handleClick() { 16 this.height = this.panels.scrollHeight; 17 console.log(this.height); 18 if (this.isOpen) { 19 this.close(); 20 } else { 21 this.open(); 22 } 23 } 24 open() { 25 this.isOpen = true; 26 this.element.classList.add('is-active'); 27 this.element.classList.remove('is-hidden'); 28 this.panels.style.maxHeight = `${0}px`; 29 this.tabs.setAttribute('aria-expanded', "true"); 30 this.panels.setAttribute('aria-hidden', "false"); 31 setTimeout(() => { 32 this.panels.style.maxHeight = `${this.height}px`; 33 }, 1); 34 } 35 close() { 36 this.isOpen = false; 37 this.element.classList.remove('is-active'); 38 this.panels.style.maxHeight = `${this.height}px`; 39 this.tabs.setAttribute('aria-expanded', "false"); 40 this.panels.setAttribute('aria-hidden', "true"); 41 setTimeout(() => { 42 this.panels.style.maxHeight = `${0}px`; 43 }, 1); 44 } 45 handleTransition() { 46 if (!this.isOpen) { 47 this.element.classList.add('is-hidden'); 48 } 49 this.panels.style.maxHeight = ''; 50 } 51} 52Array.from(document.querySelectorAll('.js-accordion:not(.js-accordion-one)')).forEach((el) => { 53 new Accordion(el, { 54 tabs: this.tabs, 55 panels: this.panels 56 }); 57});

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

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

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

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

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

guest

回答2

0

自己解決

下記とすることで解決しました。

javascript

1handleClick() { 2 if (this.isOpen) { 3 this.close(); 4 } else { 5 this.open(); 6 this.height = this.panels.scrollHeight; 7 console.log(this.height); 8 } 9}

投稿2021/09/21 08:40

noel0718

総合スコア20

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

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

0

他の箇所で不具合出るかもしれないですが、以下のようにするとどうですか?

js

1handleTransition() { 2 if (!this.isOpen) { 3 this.element.classList.add('is-hidden'); 4 }else{ 5 this.panels.style.maxHeight = ''; 6 } 7}

投稿2021/09/21 08:15

Lhankor_Mhy

総合スコア36134

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

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

noel0718

2021/09/21 08:23 編集

ありがとうございます。 以下で解決いたしました。 ```javascript handleClick() { if (this.isOpen) { this.close(); } else { this.open(); this.height = this.panels.scrollHeight; } } ```
Lhankor_Mhy

2021/09/21 08:28

ご解決されて何よりです。 自己解決の処理をお願いします。
noel0718

2021/09/21 08:41

記載しました。 こちらのコメントではコードの挿入ができないのですね・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問