Deprecated: Constant E_STRICT is deprecated in /NF/home/kyoin0/shimizu/public_html/dokuwiki/inc/init.php on line 42
3 アコーディオンメニュー [コンピュータ基礎実習]
jyokyu:j14_exp3

3 アコーディオンメニュー

戻る

「アコーディオンメニュー」は、クリックなどに反応して、折りたたまれていたコンテンツが展開表示される仕組みです。

展開したり戻したりする際に伸び縮みする様子がアコーディオンの蛇腹部分に似ているせいか、そのように名付けられているようです。

具体的には以下のようなものです。
「クリックして詳細を確認する」の部分をクリックすると折りたたまれていた文章が展開表示されます。

これは、詳しい説明です。
なんとかかんとか!

詳しい情報などをアコーディオンの中に入れてしまえば、必要に応じて画面に表示できるので、ページのコンテンツをスッキリまとめる効果があります。

こちらの仕組みも、従来はプログラムなどを使わないと実現できませんでしたが、最新の環境では、なんと CSS だけで実現できます!

それでは作り方を見ていってみましょう。

作成手順

少々仕組みがややこしいので、詳しい手順を紹介していきます。

HTMLを用意する

まずHTMLを作ります。
とりあえずそれっぽい文章を書いておきます。

<h1>アコーディオンメニュー</h1> <p>クリックするとアコーディオンのようにコンテンツが伸縮します。</p>

アコーディオンメニュー

クリックするとアコーディオンのようにコンテンツが伸縮します。

この文章は自由なものでOKです。

チェックボックスを作る

次に、チェックボックスを作ります。
チェックボックスとは、「」 このようになものです。 クリックすると、チェックのON/OFFを切り替えられます。
後でデザインするために、とりあえずクラス名を付けておきます。ここでは acd-check としています。

<h1>アコーディオンメニュー</h1> <p>クリックするとアコーディオンのようにコンテンツが伸縮します。</p> <input type="checkbox" class="acd-check"> クリックして詳細を確認する

アコーディオンメニュー

クリックするとアコーディオンのようにコンテンツが伸縮します。

クリックして詳細を確認する

上の実行結果にある「□クリックして詳細を確認する」の「□」部分をクリックすると、チェックボックスをON/OFFできます。

こういった入力用のパーツ全般を「フォーム」と呼びます。この授業では今までほとんど扱ってきませんでしたが、通常の HTML で使用できる基本的なパーツです。
<input type="checkbox"> でチェックボックスを作ることができます。HTML では他にもいろんな入力用のパーツを作れるので、詳しくは「HTML フォーム」などで検索してみましょう。
今回はさらにクラス名 acd-check を付けています。

「えっ?完成例にチェックボックスなんてあったっけ?」と思った人、鋭いです。😄

今回の課題は、このチェックボックスのON/OFFの状態に合わせて CSS を切り替える構造になっているため、仕組みのうえでどうしても必要なチェックボックスとなっています。ですが見た目的には邪魔なので、後で CSS を使って見えない状態にします。なので今は気にしなくてOKです。とりあえず次に進みましょう。

ラベルを設定

小さなチェックボックスにマウスカーソルを合わせてクリックするのはやりにくいので、近くの文字をクリックしてもチェックボックスをON/OFFできるようにします。

そのためのクリック可能な文字を「ラベル」と呼びます。クリック対象部分を <label></label> で囲うことで実装できます。

今回の「ラベル」は、「クリックして詳細を確認する」という文字列とします。

<h1>アコーディオンメニュー</h1> <p>クリックするとアコーディオンのようにコンテンツが伸縮します。</p> <input type="checkbox" class="acd-check" id="acd01"> <label for="acd01" class="acd-label">クリックして詳細を確認する</label>

アコーディオンメニュー

クリックするとアコーディオンのようにコンテンツが伸縮します。

画面上で見た目の変化はありませんが、「クリックして詳細を確認する」という文字の部分をクリックしてもチェックボックスをON/OFF出来るようになっています(上の実行結果で試してみましょう)。 これがラベルの効果です。

どのラベルをクリックすると、どのチェックボックスが反応するかは、固有の id を付けることで管理します。上の例では acd01 という共通した id が、チェックボックスとラベルの両方に付けられている事が分かると思いますが、これらがお互いに関連付けられたラベルとチェックボックスということになります。

もしこのアコーディオン構造を複数ページ内に作りたい場合は、この idacd02 のように別のものに変えていけば良いでしょう。

アコーディオンのコンテンツを追加

伸び縮みして表示される内容を追加します。これは単に <div></div> で囲って記入するだけです。
後でデザインしやすいように、クラス名を付けておきます。ここでは acd-content としています。

<h1>アコーディオンメニュー</h1> <p>クリックするとアコーディオンのようにコンテンツが伸縮します。</p> <input type="checkbox" class="acd-check" id="acd01"> <label for="acd01" class="acd-label">クリックして詳細を確認する</label> <div class="acd-content"> これは、詳しい説明です。<br>なんとかかんとか!<br> </div>

アコーディオンメニュー

クリックするとアコーディオンのようにコンテンツが伸縮します。

これは、詳しい説明です。
なんとかかんとか!

<div> の中身は、通常の HTML を使って自由に何でも書けます。

現時点では、単に <div> の中身が表示されているだけで何も起きませんが、あとで CSS を使って折りたたまれるように加工します。

以上で HTML の準備は完了です。CSS の編集に移りましょう。

チェックボックスを消す

チェックボックスは CSS の都合上で配置していますが、見た目的には不要なので、CSS を使って見えなくします。

/* チェックボックスを非表示にする */ .acd-check{ display: none; }

アコーディオンメニュー

クリックするとアコーディオンのようにコンテンツが伸縮します。

これは、詳しい説明です。
なんとかかんとか!

チェックボックスが見えなくなりました! 存在はしていますが、画面上には映りません。今ONかOFFかも見えませんが、とりあえず見えない所で動いてはいます。

このように display: none; を指定することで、CSS では要素を隠すことができます。

コンテンツ部をデザインする

伸び縮みして表示される内容をそれっぽくデザインします。これはお好みのデザインをしてもらうと良いでしょう。

/* チェックボックスを非表示にする */ .acd-check{ display: none; } /* アコーディオン・コンテンツ部 */ .acd-content{ padding: 0 10px; margin-bottom:4px; border: solid 1px #cccccc; border-radius: 6px; box-shadow: 10px 10px 10px rgba(0,0,0,0.2); }

アコーディオンメニュー

クリックするとアコーディオンのようにコンテンツが伸縮します。

これは、詳しい説明です。
なんとかかんとか!

今回はこんな感じのデザインにしてみました。

コンテンツ部を折りたたむ

コンテンツ部が折りたたまれた状態を再現するために、せっかく作ったコンテンツ部を見えなくなるようにデザインします。
アコーディオン・コンテンツ部の設定に以下のように追加します。

/* チェックボックスを非表示にする */ .acd-check{ display: none; } /* アコーディオン・コンテンツ部 */ .acd-content{ padding: 0 10px; margin-bottom:4px; border: solid 1px #cccccc; border-radius: 6px; box-shadow: 10px 10px 10px rgba(0,0,0,0.2); /* 見えなくする設定 */ height: 0; opacity: 0; visibility: hidden; overflow: hidden; }

アコーディオンメニュー

クリックするとアコーディオンのようにコンテンツが伸縮します。

これは、詳しい説明です。
なんとかかんとか!

コンテンツの部分が綺麗さっぱり見えなくなりました。ちょっぴり悲しいですが、次で表示できるようにします!

ちなみに見えなくする設定を色々追加していますが、さまざまな端末を使った場合でも、それっぽく伸び縮みしているように見せるための措置です。
設定内容の詳細は次の通り。

  • 要素の高さ height をゼロにする。
  • 透明度opacity をゼロにして、完全透明にする。
  • 不可視属性を付与。visibility: hidden;
  • はみ出した部分は表示しない。overflow: hidden;

コンテンツ部を開かせる

いよいよここが今回の肝です。
チェックがON状態になった時に、コンテンツ部分が表示されるようにします。

/* チェックボックスを非表示にする */ .acd-check{ display: none; } /* アコーディオン・コンテンツ部 */ .acd-content{ padding: 0 10px; margin-bottom:4px; border: solid 1px #cccccc; border-radius: 6px; box-shadow: 10px 10px 10px rgba(0,0,0,0.2); /* 見えなくする設定 */ height: 0; opacity: 0; visibility: hidden; overflow: hidden; } /* コンテンツ部 開状態 */ .acd-check:checked + .acd-label + .acd-content { height: auto; opacity: 1; padding: 10px; visibility: visible; }

アコーディオンメニュー

クリックするとアコーディオンのようにコンテンツが伸縮します。

これは、詳しい説明です。
なんとかかんとか!

「クリックして詳細を確認する」の部分をクリックしてみましょう。
コンテンツ部が開いたり閉じたりするようになりました。 素晴らしい!

ちなみにセレクタ部分 .acd-check:checked + .acd-label + .acd-content に注目をすると、今回は特殊なセレクタを使用していることが分かるでしょう。
これはどういう意味なのでしょうか?

  • :checked
    要素がチェックされている場合に限り、設定が有効になることを意味します。

    このようにセレクタに付加して状況を限定したりできるオプションのことを「擬似クラス」と呼びます。

    以前にリンクの色を設定する練習問題で、a:visiteda:hover のようなセレクタを使用したことがありますが、その visitedhover も擬似クラスの仲間です。それぞれ「アクセスしたことがあるリンク」や「マウスカーソルが上に重なっている状態のリンク」に状況を限定するものですね。

    • これにより、チェックボックスがONになっているときだけ、「コンテンツ部 開状態」に記載した設定が有効になります。
    • 設定内容は、一つ前に行った「見えなくする設定」を全て打ち消す物となっています(=通常の表示状態に戻します)。
    • つまりチェックボックスがOFFのときは見えない状態ですが、ONになると後から書かれた設定の効果が上書きされ、見える状態になるというわけです。
  • +
    セレクタ上でプラス + という記号を使用すると「ある要素の直後に隣接している要素」を意味します。
    • これにより「acd-check クラスの隣りにある acd-label クラスの隣りにある acd-content 要素」をセレクタが指し示すようになります。要するに acd-content 部分のデザインに影響を与えたかったわけです。
    • この + の仕様上、HTML では、チェックボックスとラベルとコンテンツ部を連続で並べておく必要があります。
  • :checked+ を組み合わせることで「チェックボックスがONのときに、コンテンツ部のデザインを変更する」ことが可能になるわけです。

各セレクタの詳細について気になった場合は、以下を参考にすると良いでしょう。
checked - MDN
隣接兄弟結合子+ - MDN

なめらかに開閉させる

一応、コンテンツが表示されたり消えたりするアコーディオン構造ができましたが、一瞬でパカパカ開閉するため、見ている人にとっては何が起こっているのか分からないと感じるかも知れません。

たとえばコンテンツの内容がたくさん書かれていて、画面の大部分が一瞬で書き換わったりすると、ページの閲覧者に「別のページにアクセスしてしまったか?」と誤解されてしまうかもしれません。

そこで、開閉アニメーションがなめらかに行われるようにします。
設定は簡単で、transition プロパティを acd-content クラスに対して追加するだけです。
ちなみに過去にはCSS練習1の リンクの色を変える 課題で transition プロパティを使用したことがあります。

/* チェックボックスを非表示にする */ .acd-check{ display: none; } /* アコーディオン・コンテンツ部 */ .acd-content{ padding: 0 10px; margin-bottom:4px; border: solid 1px #cccccc; border-radius: 6px; box-shadow: 10px 10px 10px rgba(0,0,0,0.2); /* 見えなくする設定 */ height: 0; opacity: 0; visibility: hidden; overflow: hidden; transition: 0.2s; } /* コンテンツ部 開状態 */ .acd-check:checked + .acd-label + .acd-content { height: auto; opacity: 1; padding: 10px; visibility: visible; }

アコーディオンメニュー

クリックするとアコーディオンのようにコンテンツが伸縮します。

これは、詳しい説明です。
なんとかかんとか!

「クリックして詳細を確認する」の部分をクリックしてみましょう。表現が難しいですが「ぬるっと」伸び縮みするようになったかと思います。

これで、どの部分がアコーディオンで開閉しているのか、視覚的に分かりやすくなったかと思います。

この例では transition: 0.2s; で、0.2秒で開閉するよう設定しています。アニメーション速度はこのパラメーターを変えることで、より素早くしたり遅くしたり調整できます。

開閉状態を示すマークを追加

そもそも「クリックして詳細を確認する」の部分をクリックしなければいけないことが分かりにくいです。いちいち文字で説明するのも面倒ですね。

そこでここに「いかにも」な感じの特徴的なマークを設置して、アコーディオン構造があると分かりやすくします。
具体的には + マークを CSS を使って表示させます。

/* チェックボックスを非表示にする */ .acd-check{ display: none; } /* アコーディオン・コンテンツ部 */ .acd-content{ padding: 0 10px; margin-bottom:4px; border: solid 1px #cccccc; border-radius: 6px; box-shadow: 10px 10px 10px rgba(0,0,0,0.2); /* 見えなくする設定 */ height: 0; opacity: 0; visibility: hidden; overflow: hidden; transition: 0.2s; } /* コンテンツ部 開状態 */ .acd-check:checked + .acd-label + .acd-content { height: auto; opacity: 1; padding: 10px; visibility: visible; } /* 開閉状態を示すインジケーター */ /* CLOSE状態 */ .acd-label::before{ content: "+"; color: white; background-color: green; font-weight: bold; }

アコーディオンメニュー

クリックするとアコーディオンのようにコンテンツが伸縮します。

これは、詳しい説明です。
なんとかかんとか!

ラベルの前方 before マークが付きました。
このように CSS 側からの設定で、要素の周囲に新たな要素を追加することもできます。これら CSS で追加される要素のことを「疑似要素」と呼びます。
HTML 側は何も編集していないのに、ページに新しいものを表示させられるなんて不思議な感じですね。

疑似要素 - MDN

ちなみに content: "+"; で指定した文字が表示されるので、別のマークに変える事もできます。
例えば content: "開"; とすれば、「開」マークが表示されることでしょう。

疑似要素についての細かい話

before 等の疑似要素は、セレクタの後ろにコロン2つ :: を付けて書き足しますが、コロン1つ : でも良いようです。

本来は :checked などの疑似セレクタはコロン1つ、::before などの疑似要素はコロン2つ、というルールなのですが、多くのウェブ開発者のみなさんも「ややこしい!」と思ったようで、現在はどちらもコロン1つで良いということになっています。

この資料では原則に従って ::before と表記していますが、コロン1つなのか2つなのか、ややこしければ :before でもOKです。

開閉に応じてマークを変える

コンテンツ部を閉じたときには別のマークが出るようにして、開閉状態が分かりやすいようにしましょう。
プラス・マイナスで切り替える感じが良さそうなので、- を表示させてみます。

/* チェックボックスを非表示にする */ .acd-check{ display: none; } /* アコーディオン・コンテンツ部 */ .acd-content{ padding: 0 10px; margin-bottom:4px; border: solid 1px #cccccc; border-radius: 6px; box-shadow: 10px 10px 10px rgba(0,0,0,0.2); /* 見えなくする設定 */ height: 0; opacity: 0; visibility: hidden; overflow: hidden; transition: 0.2s; } /* コンテンツ部 開状態 */ .acd-check:checked + .acd-label + .acd-content { height: auto; opacity: 1; padding: 10px; visibility: visible; } /* 開閉状態を示すインジケーター */ /* CLOSE状態 */ .acd-label::before{ content: "+"; color: white; background-color: green; font-weight: bold; } /* OPEN状態 */ .acd-check:checked + .acd-label::before{ content: '-'; background-color: red; }

アコーディオンメニュー

クリックするとアコーディオンのようにコンテンツが伸縮します。

これは、詳しい説明です。
なんとかかんとか!

「クリックして詳細を確認する」をクリックしてアコーディオンを開閉すると + - マークが切り替わるようになりました。
ここでも上で使用した :checked+ を使って「チェックボックスがONのとき、隣接する acd-label 要素のデザインを変更する」挙動を実現しています。

設定内容は content で表示される文字を書き換え、背景色を red に変えているだけです。

デザインを微調整する

マークがカクカクしているのが気になります。また、「クリックして詳細を確認する」という文字と密着しすぎているのが気になりますので、デザインを調整します。 このあたりは自己満足ですね。😅

/* チェックボックスを非表示にする */ .acd-check{ display: none; } /* アコーディオン・コンテンツ部 */ .acd-content{ padding: 0 10px; margin-bottom:4px; border: solid 1px #cccccc; border-radius: 6px; box-shadow: 10px 10px 10px rgba(0,0,0,0.2); /* 見えなくする設定 */ height: 0; opacity: 0; visibility: hidden; overflow: hidden; transition: 0.2s; } /* コンテンツ部 開状態 */ .acd-check:checked + .acd-label + .acd-content { height: auto; opacity: 1; padding: 10px; visibility: visible; } /* 開閉状態を示すインジケーター */ /* CLOSE状態 */ .acd-label::before{ content: "+"; color: white; background-color: green; font-weight: bold; /* 真円に近づける */ border-radius: 50%; /* 角を丸めて円にする */ font-size: 15px; /* 幅と高さを固定 */ line-height: 15px; width: 15px; height: 15px; text-align:center; vertical-align: middle; padding:0; /* 位置を微調整 */ display: inline-block; position: relative; top: -2px; /* 上に2ピクセルずらす */ margin-right: 5px; /* 右のラベルとの間隔を余白で調整 */ } /* OPEN状態 */ .acd-check:checked + .acd-label::before{ content: '-'; background-color: red; }

アコーディオンメニュー

クリックするとアコーディオンのようにコンテンツが伸縮します。

これは、詳しい説明です。
なんとかかんとか!

マークが丸くなり、よりそれっぽくなりました。
ラベルとの間隔を5ピクセル開けた margin-right: 5px; で、マークと文字の密着感もなくなったかと思います。

以上でアコーディオンメニューの完成です!

参考

アコーディオンメニューを複数配置する場合

同じページの中に複数のアコーディオンメニューを設置したい場合は、checkbox と label についている id を、それぞれ同一ページ内で重複しない固有のものに変更してください。

どのラベルがどのチェックボックスに対応しているかを識別するために必要なので、関連するチェックボックスとラベルの id は同じものに揃えておいてください。

とりあえずコピー・貼り付けした後、id だけ後から修正するのが楽かもしれません。

CSSの変更は不要です。

<p>アコーディオンメニューをいっぱい作ります!</p> <input type="checkbox" id="acd02" class="acd-check"><label for="acd02" class="acd-label">クリックして詳細を確認する</label> <div class="acd-content">1つめのアコーディオンです!</div> <input type="checkbox" id="acd03" class="acd-check"><label for="acd03" class="acd-label">クリックして詳細を確認する</label> <div class="acd-content">2つめのアコーディオンです!</div> <input type="checkbox" id="acd04" class="acd-check"><label for="acd04" class="acd-label">クリックして詳細を確認する</label> <div class="acd-content">3つめのアコーディオンです!</div>

アコーディオンメニューをいっぱい作ります!

1つめのアコーディオンです!
2つめのアコーディオンです!
3つめのアコーディオンです!

このように一度作ってしまえば、アコーディオンを複数作ることはとても簡単です。

参考にしてください。

戻る

jyokyu/j14_exp3.txt · 最終更新: 2023/12/27 10:34 by 127.0.0.1