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});
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。