アコーディオンの処理で書いたjavascriptを流用して、以下パターンを作りたいです。
■アコーディオンを最初から開いた状態
htmlにis-activeというクラスをつけて、
最初から開いた状態にしたいです。
■アコーディオンを1つ開いたら、他が閉じる状態になる
htmlに--oneというクラスをつけて、
1つ開いたら、他が閉じる状態にしたいです。
今javascriptでできているの処理は通常のアコーディオンになります。
アコーディオンの中にアコーディオンがあるパターンやtriggerとpanelが同階層にない場合も想定してうまく動いています。
よくあるslideDownやslideUpのやり方ではなくmax-heightを使ったアコーディオンの処理としています。
通常のアコーディオンとバッティングしてしまい、
処理の分岐をどうしていいかわからなくなりました。
もし書き方がわかる方がいましたら、教えていただけますと幸いです。
通常のアコーディオンのHTML
html
1<div class="c-accordion js-accordion"> 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>
最初から開いた状態のアコーディオンのHTML
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>
1つ開いたら、他が閉じる状態のアコーディオンのHTML
html
1<div class="c-accordion js-accordion --one"> 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 --one"> 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} 38
####追記1
1点、実装中にうまくいかないことがありました。
スマホの際、ヘッダーのメニュー内にアコーディオンがあります。メニューを開いた後にアコーディオンを開き、メニューを閉じるとアコーディオンも開じるようにしたいです。開いたままですと、メニュー内の文字のアニメーションができなくなることが判明しました。
メニューを閉じた際にアコーディオンも閉じる処理を無理矢理書いたのですが、アコーディオンのjavascriptでの判定ですと閉じていないため、再度メニューを開いた際に2度クリックしないとアコーディオンが開かないのが現状となります。
html
1<header class="l-header" role="banner"> 2 <div class="l-header__inner"> 3 <div class="l-header__menu"> 4 <div class="l-header__menu-inner"> 5 <nav class="l-header__menu-nav"> 6 <ul class="l-header__menu-nav-list"> 7 <li class="l-header__menu-nav-item"> 8 <div class="c-accordion js-accordion"> 9 <button type="button" class="c-accordion__trigger js-accordion__trigger"> 10 <span class="c-headline-lv2">アコーディオンタイトル</span> 11 </button> 12 <div class="c-accordion__panel js-accordion__panel"> 13 <div class="c-accordion__content"> 14 <p>この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。</p> 15 </div> 16 </div> 17 </div> 18 <div class="c-accordion js-accordion"> 19 <button type="button" class="c-accordion__trigger js-accordion__trigger"> 20 <span class="c-headline-lv2">アコーディオンタイトル</span> 21 </button> 22 <div class="c-accordion__panel js-accordion__panel"> 23 <div class="c-accordion__content"> 24 <p>この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。</p> 25 </div> 26 </div> 27 </div> 28 </li> 29 </ul> 30 </nav> 31 </div> 32 </div> 33 <button type="button" class="l-header__hamburger"> 34 <span class="l-header__hamburger-inner"> 35 <span class="l-header__hamburger-bars"> 36 <span class="l-header__hamburger-bar"></span> 37 <span class="l-header__hamburger-bar"></span> 38 <span class="l-header__hamburger-bar"></span> 39 </span> 40 </span> 41 </button> 42 </div> 43</header>
javascript
1$(function () { 2 menu.onInit(); 3}); 4 5// ---------------------------------------- 6// メニュー 7// ---------------------------------------- 8const menu = { 9 onInit: function onInit() { 10 this.__Flag_open = false; 11 this.$menu = $(".l-header__menu"); 12 this.$button = $(".l-header__hamburger"); 13 $(document).on({ 14 click() { 15 if (!menu.__Flag_open) { 16 menu.open(); 17 } else { 18 menu.close(); 19 } 20 }, 21 }, '.l-header__hamburger'); 22 $(document).on({ 23 click() { 24 menu.close(); 25 }, 26 }, '.l-header__menu a[href]'); 27 }, 28 open: function open() { 29 const _this = this; 30 _this.__Flag_open = true; 31 }, 32 close: function close() { 33 const _this = this; 34 _this.__Flag_open = false; 35 //うまくいかない記述 36 $('.l-header__menu .js-accordion').removeClass('is-active'); 37 $('.l-header__menu .js-accordion').addClass('is-hidden'); 38 $('.l-header__menu .js-accordion__trigger').attr("aria-expanded", false); 39 $('.l-header__menu .js-accordion__panel').attr("aria-hidden", true); 40 $('.l-header__menu .js-accordion__panel').css({ 41 maxHeight: "", 42 }); 43 } 44} 45 46class Accordion { 47}
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。