ページを移動しても開閉状態を記憶するアコーディオンの作り方
ページを移動しても開閉状態を記憶するアコーディオンの作り方を紹介します。このサンプルでは、見出しをクリックしてアコーディオンを開閉すると、その状態をブラウザのlocalStorageへ保存します。通常のアコーディオンはページを再読み込みすると初期状態へ戻りますが、localStorageを利用することで、ページを再読み込みした場合や別のページへ移動してから戻った場合でも、最後の開閉状態を復元できます。
FAQ、設定画面、商品説明、マニュアル、管理画面など、利用者が一度開いた項目を次回も同じ状態で表示したい場面に利用できます。各アコーディオンの状態は個別に保存されるため、1つ目を開いたまま2つ目を閉じるといった状態もそのまま記憶できます。ページを離れてから再び表示した場合は、localStorageに保存されている情報をJavaScriptで読み込み、それぞれの項目を保存時と同じ開閉状態へ戻します。
localStorageには保存期限が設定されていないため、一定時間が経過しただけで開閉状態が自動的に削除されることはありません。基本的には、利用者がブラウザのサイトデータを削除するか、JavaScriptでlocalStorageの保存データを削除するまで状態が残ります。ただし、ブラウザの設定や利用環境によって保存データが削除される場合があります。HTMLでは見出しや内容を変更でき、CSSでは横幅、余白、背景色、枠線、角丸などを調整できます。JavaScriptではアコーディオンの開閉とlocalStorageへの保存・復元を行います。
免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
各見出しをクリックすると開閉状態がlocalStorageへ保存されます。
各項目を開閉してからページを再読み込みしてください。最後に操作した開閉状態がそのまま復元されます。
コードをコピーして使おう!
<!DOCTYPE html>
<html lang="ja">
<head>
<!-- 文字コード -->
<meta charset="UTF-8">
<!-- スマートフォン対応 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- ページタイトル -->
<title>ページを移動しても開閉状態を記憶するアコーディオン</title>
<!-- CSSファイルを読み込み -->
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- アコーディオン全体 -->
<div class="remember-accordion-state_wrap">
<!-- タイトル -->
<div class="remember-accordion-state_title">
開閉状態を記憶するアコーディオン
</div>
<!-- 説明文 -->
<p class="remember-accordion-state_text">
各見出しをクリックすると開閉状態がlocalStorageへ保存されます。
</p>
<!-- アコーディオン項目1 -->
<div class="remember-accordion-state_item" data-accordion-key="item1">
<!-- 見出しボタン -->
<button class="remember-accordion-state_button" type="button">
アコーディオンとは?
</button>
<!-- 開閉する内容 -->
<div class="remember-accordion-state_content">
アコーディオンは、見出しをクリックして内容の表示・非表示を切り替えられるUIです。
</div>
</div>
<!-- アコーディオン項目2 -->
<div class="remember-accordion-state_item" data-accordion-key="item2">
<!-- 見出しボタン -->
<button class="remember-accordion-state_button" type="button">
どんな場面で使う?
</button>
<!-- 開閉する内容 -->
<div class="remember-accordion-state_content">
FAQ、商品説明、設定項目、お問い合わせページなど、情報を整理して表示したい場面で利用できます。
</div>
</div>
<!-- アコーディオン項目3 -->
<div class="remember-accordion-state_item" data-accordion-key="item3">
<!-- 見出しボタン -->
<button class="remember-accordion-state_button" type="button">
必要なファイルは?
</button>
<!-- 開閉する内容 -->
<div class="remember-accordion-state_content">
HTML、CSS、JavaScriptの3ファイルで作成できます。開閉状態の保存にはlocalStorageを使用します。
</div>
</div>
</div>
<!-- JavaScriptファイルを読み込み -->
<script src="script.js"></script>
</body>
</html>
サンプル一式を取得する場合 HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
Q ダウンロードしたけど、これをネット上で動かすにはどうするの?
Googleアカウントがあれば、InfinityFreeで無料サーバーを作成して、ダウンロードしたサンプルをネット上で動かせます。
InfinityFreeを初めて利用する場合は①から、すでにサーバーを作成している場合は②へ進んでください。
ファイル構成と設置方法
このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLでは3つのアコーディオン項目と見出しボタン、開閉する内容を作成します。CSSではアコーディオン全体の横幅や余白、枠線、角丸、開閉記号などを設定します。JavaScriptでは各項目を個別に開閉し、その状態をlocalStorageへ保存します。ページを移動したあとに戻った場合や再読み込みした場合でも、保存されている開閉状態を読み込んで復元します。
sample/
├── index.html
├── style.css
└── script.js
各ファイルの役割
index.htmlはアコーディオン全体を構成するファイルです。タイトル、説明文、各項目の見出し、開閉する内容を変更できます。各アコーディオン項目にはdata-accordion-keyを設定し、項目ごとに異なる保存キーを使用できるようにしています。
style.cssはアコーディオンのデザインを設定するファイルです。全体の横幅、余白、背景色、枠線、角丸、見出しボタンの文字サイズ、開閉記号の色やサイズ、内容部分の余白などを変更できます。is-openクラスが付いた項目だけ内容を表示し、開閉記号も「+」から「-」へ切り替えます。
script.jsはアコーディオンの開閉と状態保存を行うファイルです。ページ表示時にlocalStorageから各項目の保存状態を読み込み、openが保存されている項目へis-openクラスを追加します。見出しボタンをクリックすると開閉状態を切り替え、その結果をopenまたはclosedとしてlocalStorageへ保存します。
設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを配置します。3つのファイルを同じ階層へ保存したあと、sample/index.htmlをブラウザで開いてください。各見出しをクリックすると対応する内容が個別に開閉し、その状態がブラウザのlocalStorageへ保存されます。項目を開閉したあとにページを再読み込みしたり、別ページへ移動してから戻ったりすると、最後に保存された開閉状態が復元されます。
カスタマイズできる内容
index.htmlでは「開閉状態を記憶するアコーディオン」のタイトル、説明文、各見出し、開閉する文章を変更できます。アコーディオン項目を追加する場合は、既存項目と同じ構造で追加し、data-accordion-keyへ他の項目と重複しない値を指定してください。
style.cssではアコーディオン全体の最大横幅、余白、背景色、枠線、角丸、見出しボタンの文字サイズ、開閉記号の色や大きさ、内容部分の文字色や行間などを変更できます。JavaScriptではlocalStorageへ保存するキーの接頭辞rememberAccordionState-を変更することで、他の保存データと区別する名前へ変更できます。
数値調整
style.css
max-width:700px;
アコーディオン全体の最大横幅です。値を大きくすると横に広がり、小さくするとコンパクトになります。
margin:40px auto;
アコーディオン全体の上下余白です。40pxを大きくすると上下の間隔が広がり、小さくすると狭くなります。
padding:32px;
アコーディオン全体の内側余白です。値を大きくすると内容と枠線の間隔が広がります。
border-radius:18px;
アコーディオン全体の角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。
font-size:22px;
タイトルの文字サイズです。値を大きくするとタイトルが大きく表示されます。
margin:0 0 24px;
説明文の下側余白です。24pxを大きくすると最初のアコーディオン項目との間隔が広がります。
margin:0 0 12px;
各アコーディオン項目の下側余白です。12pxを大きくすると項目同士の間隔が広がり、小さくすると近づきます。
border-radius:12px;
各アコーディオン項目の角丸です。値を大きくすると丸みが強くなります。
padding:16px 18px;
見出しボタンの内側余白です。16pxは上下、18pxは左右の余白です。値を大きくするとボタンが大きくなります。
font-size:16px;
見出しボタンの文字サイズです。値を大きくすると見出し文字が大きくなります。
margin-left:16px;
見出し文字と開閉記号の間隔です。値を大きくすると両者の間隔が広がります。
font-size:22px;
「+」「-」の開閉記号の文字サイズです。値を大きくすると記号が大きくなります。
padding:0 18px 18px;
開閉する内容部分の内側余白です。左右18px、下側18pxを設定しています。値を大きくすると文章と枠線の間隔が広がります。
レスポンシブ対応
このサンプルはレスポンシブ対応です。style.cssのwidth:100%とmax-width:700pxにより、アコーディオン全体が画面幅に合わせて縮小されます。また、640px以下では全体の内側余白をpadding:24px 18px;へ変更して左右の余白を抑えているため、スマートフォン・タブレット・PCで利用できます。
コメント