立体的な開閉ボタン付きアコーディオンを作る方法
立体的な開閉ボタン付きアコーディオンを作る方法を紹介します。このサンプルでは、HTML・CSS・JavaScriptを使用し、見出しの右側に配置した「+」「-」の開閉ボタンへ厚みと影を付け、押し込まれたり浮き上がったりするような立体感を表現します。アコーディオン本体はシンプルな開閉動作にして、開閉ボタンのデザインと動きを主役にした構成です。
見出しをクリックすると対応する内容が表示され、右側の開閉ボタンは「+」から「-」へ切り替わります。閉じている状態ではボタンが手前へ浮いたように見え、開いた状態では少し押し込まれた位置へ移動するため、クリックした感覚を視覚的に伝えられます。FAQ、商品説明、お問い合わせページ、会員サイトのヘルプ、管理画面の設定項目など、複数の情報を整理して表示する場面に利用できます。
見出しや本文はHTMLから変更でき、CSSではボタンの大きさ、色、角丸、影、厚み、移動量、アニメーション時間などを調整できます。JavaScriptではアコーディオンの開閉状態と「+」「-」の表示を切り替えます。画面幅に合わせて余白やボタンサイズも調整するため、スマートフォン・タブレット・PCで利用しやすく、通常のアコーディオンへ立体的な開閉ボタンを加えたい場合に活用できます。
免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
コードをコピーして使おう!
<!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="raised-accordion-button_wrap">
<!-- タイトル -->
<div class="raised-accordion-button_title">
立体的な開閉ボタン付きアコーディオン
</div>
<!-- 説明文 -->
<p class="raised-accordion-button_text">
立体的なボタンはそのままに、「+」の縦線だけが動いて「-」へ切り替わります。
</p>
<!-- アコーディオン一覧 -->
<div class="raised-accordion-button_list">
<!-- 1つ目の項目 -->
<div class="raised-accordion-button_item">
<!-- 開閉ボタン -->
<button
class="raised-accordion-button_heading"
type="button"
aria-expanded="false">
<span>アコーディオンとは?</span>
<!-- 立体的な+/-アイコン -->
<span
class="raised-accordion-button_icon"
aria-hidden="true">
</span>
</button>
<!-- 開閉する内容 -->
<div class="raised-accordion-button_content">
<div class="raised-accordion-button_content-inner">
<p class="raised-accordion-button_content-text">
アコーディオンは、見出しをクリックして必要な内容だけを表示できるUIです。
</p>
</div>
</div>
</div>
<!-- 2つ目の項目 -->
<div class="raised-accordion-button_item">
<!-- 開閉ボタン -->
<button
class="raised-accordion-button_heading"
type="button"
aria-expanded="false">
<span>どんな場面で使う?</span>
<!-- 立体的な+/-アイコン -->
<span
class="raised-accordion-button_icon"
aria-hidden="true">
</span>
</button>
<!-- 開閉する内容 -->
<div class="raised-accordion-button_content">
<div class="raised-accordion-button_content-inner">
<p class="raised-accordion-button_content-text">
FAQ、商品説明、お問い合わせページ、管理画面などで利用できます。
</p>
</div>
</div>
</div>
<!-- 3つ目の項目 -->
<div class="raised-accordion-button_item">
<!-- 開閉ボタン -->
<button
class="raised-accordion-button_heading"
type="button"
aria-expanded="false">
<span>ボタンの特徴は?</span>
<!-- 立体的な+/-アイコン -->
<span
class="raised-accordion-button_icon"
aria-hidden="true">
</span>
</button>
<!-- 開閉する内容 -->
<div class="raised-accordion-button_content">
<div class="raised-accordion-button_content-inner">
<p class="raised-accordion-button_content-text">
ボタン本体は厚みと影で立体的に見せ、中央の線だけを動かして開閉状態を表現しています。
</p>
</div>
</div>
</div>
</div>
</div>
<!-- JavaScriptファイル -->
<script src="script.js"></script>
</body>
</html>
サンプル一式を取得する場合 HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
ファイル構成と設置方法
このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLではアコーディオンの見出し、本文、立体的な開閉ボタンを配置し、CSSでは「+」「-」ボタンの厚みや影、色の反転、開閉アニメーション、レスポンシブ表示を設定します。JavaScriptではクリックされた項目へis-openクラスを付け外しし、アコーディオンの開閉状態とaria-expandedの値を切り替えます。
sample/
├── index.html
├── style.css
└── script.js
各ファイルの役割
index.htmlはアコーディオン全体を構成するファイルです。タイトル、説明文、各見出し、開閉後に表示する本文を変更できます。右側の開閉アイコンは文字として「+」「-」を配置せず、空のspan要素へCSSの疑似要素を重ねて表示します。
style.cssはアコーディオン全体と立体的な開閉ボタンのデザインを設定するファイルです。ボタンの大きさ、背景色、枠線、影、厚み、記号のサイズ、開いたときの色反転、押し込まれる位置、本文の開閉速度などを変更できます。
script.jsはアコーディオンの開閉処理を行うファイルです。見出しをクリックすると、その項目のis-openクラスを切り替え、同時にaria-expandedへ現在の開閉状態を反映します。
設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを同じ階層で配置します。3つのファイルを保存したあと、sample/index.htmlをブラウザで開いてください。各見出しをクリックすると対応する本文が開閉し、右側の立体的なボタンは「+」から「-」へ切り替わります。開いた状態ではボタン本体が白から青、記号が青から白へ反転し、下方向へ移動して押し込まれたように表示されます。
カスタマイズできる内容
index.htmlでは「立体的な開閉ボタン付きアコーディオン」のタイトル、説明文、各項目の見出し、開閉後に表示する本文を変更できます。項目を追加する場合は、raised-accordion-button_itemのまとまりを同じ構成で追加できます。
style.cssではアコーディオン全体の横幅、余白、背景色、角丸のほか、開閉ボタンの大きさ、枠線、背景色、影、厚み、+/-の線の長さや太さを変更できます。閉じた状態では白いボタンと青い記号、開いた状態では青いボタンと白い記号になるため、それぞれの色も個別に調整できます。また、開閉ボタンの移動量や本文の開閉時間も変更できます。
script.jsではクリックされた項目ごとにis-openクラスを切り替える処理を行っています。現在のコードでは複数の項目を同時に開くことができます。
数値調整
style.css
max-width:700px;
アコーディオン全体の最大横幅です。値を大きくすると横に広がり、小さくするとコンパクトになります。
padding:32px;
アコーディオン全体の内側余白です。値を大きくすると内容と外枠の間隔が広がります。
gap:16px;
各アコーディオン項目の間隔です。値を大きくすると項目同士の間隔が広がります。
min-height:70px;
見出しボタンの最小高さです。値を大きくすると各見出しが高くなります。
width:44px;・height:44px;
立体的な開閉ボタンの大きさです。2つの値を同じように変更すると円形を保ったままサイズを調整できます。
box-shadow:0 7px 0 #bfdbfe, ...
閉じた状態のボタン下側に見える厚みです。7pxを大きくすると厚みが増え、立体感が強くなります。
transform:translateY(-3px);
閉じた状態のボタンを3px上へ移動しています。絶対値を大きくすると、より浮き上がって見えます。
width:18px;・height:3px;
+/-を構成する線の長さと太さです。widthを大きくすると記号が横へ長くなり、heightを大きくすると線が太くなります。
rotate(90deg)
横線を90度回転させて+記号の縦線を作っています。開いた状態では0度へ回転しながら透明になり、中央の横線だけが残って「-」になります。
box-shadow:0 3px 0 #1d4ed8, ...
開いた状態のボタン下側の厚みです。閉じた状態の7pxより小さくすることで、ボタンが押し込まれたように見える構成です。
transform:translateY(2px);
開いた状態のボタンを2px下へ移動します。値を大きくすると押し込み量が大きくなります。
transition:grid-template-rows .4s ease;
本文を開閉するアニメーション時間です。0.4秒で変化します。値を大きくするとゆっくり、小さくすると速く開閉します。
transition:transform .35s ease;
+記号の縦線が回転する時間です。0.35秒で変化します。値を大きくするとゆっくり、小さくすると速く切り替わります。
レスポンシブ対応
このサンプルはレスポンシブ対応です。style.cssのwidth:100%とmax-width:700pxによって、画面幅に合わせてアコーディオン全体が縮小されます。さらに640px以下では全体のpaddingを24px 18px、見出しの最小高さを64px、開閉ボタンを40pxへ変更し、狭い画面でも収まりやすくしています。スマートフォン・タブレット・PCで利用できます。
コメント