開閉アイコンが180度回転するアコーディオンを作る方法【HTML/CSS/JavaScript・サンプルコード付き】
アコーディオン
開閉アイコンが180度回転するアコーディオンを作る方法
開閉アイコンが180度回転するアコーディオンを作る方法を紹介します。このサンプルでは、HTML・CSS・JavaScriptを使用し、見出しをクリックすると右側の開閉アイコンが下向きから上向きへ180度回転しながら、対応する内容を表示・非表示に切り替えます。アイコンは文字記号を使用せずCSSの2本の線で作成するため、フォントによる位置のずれを抑えながら中央へ配置できます。
閉じている状態では開閉アイコンが下向きになり、項目を開くと同じ形を保ったまま180度回転して上向きになります。再度クリックすると逆方向へ戻り、内容も閉じます。それぞれの項目は個別に開閉できるため、FAQ、お問い合わせページの商品・サービス説明、ECサイトの商品詳細、会員サイトのヘルプ、管理画面の設定項目など、情報を整理して表示したい場面で利用できます。
HTMLではタイトル、説明文、各見出し、開閉する本文を変更できます。CSSではアコーディオンの横幅や余白、背景色、角丸のほか、開閉アイコンの大きさ、線の太さ、色、180度回転するアニメーション時間を調整できます。JavaScriptではクリックした項目の開閉状態を切り替えます。レスポンシブにも対応しているため、スマートフォン・タブレット・PCで利用できるアコーディオンとして活用できます。
コードについて
本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。
免責事項
本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
開閉アイコンが180度回転するアコーディオン
見出しをクリックすると、右側の開閉アイコンが180度回転します。
クリックした項目の内容を表示・非表示に切り替えられるUIです。
FAQ、商品説明、お問い合わせページ、管理画面などで利用できます。
CSSで作った開閉アイコンが、項目の開閉に合わせて下向きから上向きへ180度回転します。
各見出しをクリックすると内容が開閉し、右側の開閉アイコンが180度回転する動きを確認できます。
コードをコピーして使おう!
<!DOCTYPE html>
<html lang="ja">
<head>
<!-- 文字コード -->
<meta charset="UTF-8">
<!-- スマートフォン表示対応 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- ページタイトル -->
<title>開閉アイコンが180度回転するアコーディオン</title>
<!-- CSSファイルを読み込み -->
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- アコーディオン全体 -->
<div class="rotate-180-icon-accordion_wrap">
<!-- タイトル -->
<div class="rotate-180-icon-accordion_title">
開閉アイコンが180度回転するアコーディオン
</div>
<!-- 説明文 -->
<p class="rotate-180-icon-accordion_text">
見出しをクリックすると、右側の開閉アイコンが180度回転します。
</p>
<!-- 1つ目の項目 -->
<div class="rotate-180-icon-accordion_item">
<!-- 開閉ボタン -->
<button
class="rotate-180-icon-accordion_button"
type="button"
aria-expanded="false">
<span>アコーディオンとは?</span>
<!-- CSSで作る開閉アイコン -->
<span
class="rotate-180-icon-accordion_icon"
aria-hidden="true">
</span>
</button>
<!-- 開閉する内容 -->
<div class="rotate-180-icon-accordion_content">
<div class="rotate-180-icon-accordion_content-inner">
<p class="rotate-180-icon-accordion_content-text">
クリックした項目の内容を表示・非表示に切り替えられるUIです。
</p>
</div>
</div>
</div>
<!-- 2つ目の項目 -->
<div class="rotate-180-icon-accordion_item">
<!-- 開閉ボタン -->
<button
class="rotate-180-icon-accordion_button"
type="button"
aria-expanded="false">
<span>どんな場面で使う?</span>
<!-- CSSで作る開閉アイコン -->
<span
class="rotate-180-icon-accordion_icon"
aria-hidden="true">
</span>
</button>
<!-- 開閉する内容 -->
<div class="rotate-180-icon-accordion_content">
<div class="rotate-180-icon-accordion_content-inner">
<p class="rotate-180-icon-accordion_content-text">
FAQ、商品説明、お問い合わせページ、管理画面などで利用できます。
</p>
</div>
</div>
</div>
<!-- 3つ目の項目 -->
<div class="rotate-180-icon-accordion_item">
<!-- 開閉ボタン -->
<button
class="rotate-180-icon-accordion_button"
type="button"
aria-expanded="false">
<span>アイコンの特徴は?</span>
<!-- CSSで作る開閉アイコン -->
<span
class="rotate-180-icon-accordion_icon"
aria-hidden="true">
</span>
</button>
<!-- 開閉する内容 -->
<div class="rotate-180-icon-accordion_content">
<div class="rotate-180-icon-accordion_content-inner">
<p class="rotate-180-icon-accordion_content-text">
CSSで作った開閉アイコンが、項目の開閉に合わせて下向きから上向きへ180度回転します。
</p>
</div>
</div>
</div>
</div>
<!-- JavaScriptファイルを読み込み -->
<script src="script.js"></script>
</body>
</html>
/* ページ全体 */
body{
margin:0; /* ブラウザ標準の外側余白を削除 */
padding:40px 20px; /* 上下40px・左右20px。値を大きくすると画面端との間隔が広がる */
background:#ffffff; /* ページ全体の背景色 */
color:#111827; /* ページ全体の基本文字色 */
font-family:sans-serif; /* ページ全体で使用するフォント */
}
/* アコーディオン全体 */
.rotate-180-icon-accordion_wrap{
width:100%; /* 画面幅に合わせて横幅を縮小 */
max-width:700px; /* 最大横幅。値を大きくすると全体が横に広がる */
margin:40px auto; /* 上下40pxの余白を付けて左右中央へ配置 */
padding:32px; /* 内側の余白。値を大きくすると余白が広がる */
border:1px solid #e5e7eb; /* 全体を囲む枠線 */
border-radius:18px; /* 全体の角丸。値を大きくすると丸みが強くなる */
background:#f8fafc; /* アコーディオン全体の背景色 */
box-sizing:border-box; /* paddingとborderを横幅へ含める */
}
/* アコーディオン内の全要素 */
.rotate-180-icon-accordion_wrap *{
box-sizing:border-box; /* paddingとborderを要素サイズへ含める */
}
/* タイトル */
.rotate-180-icon-accordion_title{
margin:0 0 12px; /* 下側12pxの余白。値を大きくすると説明文との間隔が広がる */
font-size:22px; /* タイトルの文字サイズ。値を大きくすると文字が大きくなる */
font-weight:700; /* タイトルを太字にする */
line-height:1.5; /* タイトルの行間 */
text-align:center; /* タイトルを中央揃えにする */
}
/* 説明文 */
.rotate-180-icon-accordion_text{
margin:0 0 24px; /* 下側24pxの余白。値を大きくすると項目との間隔が広がる */
color:#4b5563; /* 説明文の文字色 */
font-size:16px; /* 説明文の文字サイズ */
line-height:1.8; /* 説明文の行間 */
text-align:center; /* 説明文を中央揃えにする */
}
/* アコーディオン項目 */
.rotate-180-icon-accordion_item{
margin:0 0 12px; /* 下側12pxの余白。値を大きくすると項目同士の間隔が広がる */
border:1px solid #e5e7eb; /* 項目を囲む枠線 */
border-radius:12px; /* 項目の角丸。値を大きくすると丸みが強くなる */
background:#ffffff; /* 項目の背景色 */
overflow:hidden; /* 開閉内容を項目の外へ表示しない */
}
/* 最後のアコーディオン項目 */
.rotate-180-icon-accordion_item:last-child{
margin-bottom:0; /* 最後の項目だけ下側余白を削除 */
}
/* 開閉ボタン */
.rotate-180-icon-accordion_button{
display:flex; /* 見出しと開閉アイコンを横並びにする */
align-items:center; /* 上下中央へ揃える */
justify-content:space-between; /* 見出しとアイコンを左右へ配置 */
width:100%; /* 項目の横幅いっぱいに表示 */
min-height:56px; /* 最小高さ。値を大きくするとボタンが高くなる */
padding:16px 18px; /* 上下16px・左右18pxの内側余白 */
border:none; /* ブラウザ標準のボタン枠線を削除 */
background:#ffffff; /* ボタンの背景色 */
color:#111827; /* 見出しの文字色 */
font:inherit; /* ページ全体と同じフォントを使用 */
font-size:16px; /* 見出しの文字サイズ */
font-weight:700; /* 見出しを太字にする */
line-height:1.5; /* 見出しの行間 */
text-align:left; /* 見出しを左揃えにする */
cursor:pointer; /* マウスを乗せたときにポインターを表示 */
}
/* キーボードフォーカス時 */
.rotate-180-icon-accordion_button:focus-visible{
outline:3px solid rgba(37,99,235,.22); /* フォーカス位置を示す3pxの枠線 */
outline-offset:-3px; /* 枠線を3px内側へ表示 */
}
/* 開閉アイコン */
.rotate-180-icon-accordion_icon{
position:relative; /* 2本の線を配置する基準 */
flex-shrink:0; /* アイコンが縮まないようにする */
width:22px; /* アイコン領域の横幅。値を大きくすると領域が広がる */
height:22px; /* アイコン領域の高さ。値を大きくすると領域が広がる */
margin-left:16px; /* 見出し文字との間隔。値を大きくすると離れる */
transition:transform .35s ease; /* 0.35秒で180度回転する */
}
/* 開閉アイコンを構成する2本の線 */
.rotate-180-icon-accordion_icon::before,
.rotate-180-icon-accordion_icon::after{
content:""; /* 疑似要素を表示する */
position:absolute; /* アイコン領域内へ配置 */
top:9px; /* 上から9pxの位置へ配置 */
width:12px; /* 線の長さ。値を大きくするとアイコンが大きくなる */
height:3px; /* 線の太さ。値を大きくすると太くなる */
border-radius:999px; /* 線の両端を丸くする */
background:#2563eb; /* 開閉アイコンの色 */
}
/* 開閉アイコンの左側の線 */
.rotate-180-icon-accordion_icon::before{
left:2px; /* 左から2pxの位置へ配置 */
transform:rotate(45deg); /* 45度傾けて下向きアイコンの左側を作る */
}
/* 開閉アイコンの右側の線 */
.rotate-180-icon-accordion_icon::after{
right:2px; /* 右から2pxの位置へ配置 */
transform:rotate(-45deg); /* -45度傾けて下向きアイコンの右側を作る */
}
/* 開いている状態の開閉アイコン */
.rotate-180-icon-accordion_item.is-open
.rotate-180-icon-accordion_icon{
transform:rotate(180deg); /* 180度回転して下向きから上向きへ変更 */
}
/* 開閉する内容 */
.rotate-180-icon-accordion_content{
display:grid; /* 高さを滑らかに切り替える */
grid-template-rows:0fr; /* 閉じた状態では高さを0にする */
transition:grid-template-rows .4s ease; /* 0.4秒で内容を開閉する */
}
/* 開いている内容 */
.rotate-180-icon-accordion_item.is-open
.rotate-180-icon-accordion_content{
grid-template-rows:1fr; /* 内容の高さまで広げる */
}
/* 開閉内容の内側 */
.rotate-180-icon-accordion_content-inner{
min-height:0; /* gridで高さ0まで縮小できるようにする */
overflow:hidden; /* 閉じている内容を非表示にする */
}
/* 開閉内容の文章 */
.rotate-180-icon-accordion_content-text{
margin:0; /* ブラウザ標準の外側余白を削除 */
padding:0 18px 18px; /* 左右18px・下18pxの内側余白 */
color:#4b5563; /* 本文の文字色 */
font-size:16px; /* 本文の文字サイズ */
line-height:1.8; /* 本文の行間 */
}
/* 画面幅640px以下 */
@media(max-width:640px){
/* アコーディオン全体 */
.rotate-180-icon-accordion_wrap{
padding:24px 18px; /* スマートフォンでは内側余白を小さくする */
}
/* 開閉ボタン */
.rotate-180-icon-accordion_button{
padding:14px; /* スマートフォンでは内側余白を小さくする */
}
/* 開閉内容の文章 */
.rotate-180-icon-accordion_content-text{
padding:0 14px 18px; /* スマートフォンでは左右余白を小さくする */
}
}
/* すべての開閉ボタンを取得 */
const rotate180IconAccordionButtons=
document.querySelectorAll(
".rotate-180-icon-accordion_button"
);
/* 各開閉ボタンへクリック処理を設定 */
rotate180IconAccordionButtons.forEach(function(button){
/* 開閉ボタンをクリックした時 */
button.addEventListener("click",function(){
/* クリックしたボタンが属する項目を取得 */
const item=button.closest(
".rotate-180-icon-accordion_item"
);
/* is-openクラスを切り替えて現在の開閉状態を取得 */
const isOpen=item.classList.toggle(
"is-open"
);
/* 現在の開閉状態をaria-expandedへ反映 */
button.setAttribute(
"aria-expanded",
String(isOpen)
);
});
});
コードをコピーする場合
使用するコードのタブを選び、「このタブをコピー」をクリックすると、現在表示中のコードをコピーできます。
サンプル一式を取得する場合
HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
ファイル構成と設置方法
このサンプルでは、HTML・CSS・JavaScriptをそれぞれ別ファイルに分けて使用します。index.html、style.css、script.js を同じフォルダに配置してください。
sample/
├── index.html
├── style.css
└── script.js
index.html をブラウザで開くと、見出しをクリックした時に右側のアイコンが180度回転します。回転速度を変更したい場合は、style.css 内の transition の秒数を調整してください。
開閉アイコンが180度回転するアコーディオンを作る方法【HTML/CSS/JavaScript・サンプルコード付き】
コメント