開閉時にアイコンが回転するアコーディオンの作り方

アコーディオン
無料ツール
アコーディオンを自由に作成

見出し・内容・開閉方法・色・サイズ・アイコンなどを設定して、HTML・CSS・JavaScriptを自動生成できます。

アコーディオン作成ツールを使う
新しいタブで開きます

アコーディオンの開閉アイコンは、見出しをクリックしたときに回転させることができます。見出しを開くと内容が表示され、アイコンが指定した角度まで滑らかに回転します。もう一度クリックすると内容が非表示になり、アイコンも逆方向に回転して元の向きへ戻ります。

回転角度には90度や180度などがあり、90度は4分の1回転、180度は半回転を表します。例えば、下向きの矢印を右回りに90度回転させると左向きに、180度回転させると上向きになります。回転する角度によって、開いた状態のアイコンの向きが変わります。

回転速度によっても動きの印象が変わります。300ms(0.3秒)では軽快に回転し、400ms(0.4秒)では回転する様子を確認しやすくなります。今回のサンプルでは400msを使用し、アイコンが一定の時間をかけて滑らかに回転する動きを紹介します。

アコーディオンの開閉アイコンが90度と180度回転したときの向きを比較した図
90度回転と180度回転によるアイコンの向きの違い

アイコンの回転方向には、右回り(時計回り)と左回り(反時計回り)があります。右回りは時計の針と同じ方向、左回りはその反対方向に回転します。下向きの矢印を90度回転させる場合、右回りでは左向きに、左回りでは右向きになります。

180度回転では、右回りと左回りのどちらも最終的には上向きになりますが、回転途中の動きは異なります。開くときに右回りで回転したアイコンは、閉じるときには左回りで元の向きへ戻ります。左回りで開いた場合は、その逆の動きになります。

下向きの矢印を右回りと左回りに90度・180度回転させたときの向きを比較した図
右回り(時計回り)と左回り(反時計回り)の回転方向の違い

今回は、開閉アイコンが回転するアコーディオンを作成します。アイコンは矢印だけでなく、自作SVGなどにも変更でき、同じ仕組みで回転させることができます。各項目は個別に開閉でき、複数の項目を同時に開くことも可能です。

デモ

1つ目の内容が表示されます。
2つ目の内容が表示されます。
3つ目の内容が表示されます。

タブを切り替えて、右回り90度・左回り90度・右回り180度・左回り180度の動きを比較できます。見出しをクリックすると内容が開き、アイコンが指定した方向へ回転します。もう一度クリックすると元の向きに戻ります。

Q 他のアイコンを使いたい場合はどうするの?
A

無料のSVGアイコン作成ツールを使って、用途に合ったアイコンを作成できます。

コードをコピーして使おう!

以下のコードは、開閉アイコンが右回りに90度回転するアコーディオンです。回転方向や角度は、CSSのtransform: rotate(90deg);を変更することで調整できます。

<!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">

  <!-- JavaScriptファイル -->
  <script src="script.js" defer></script>

</head>
<body>

  <!-- アコーディオン全体 -->
  <div class="accordion-icon-rotation_wrap">

    <!-- 1つ目の項目 -->
    <div class="accordion-icon-rotation_item">

      <!-- 開閉ボタン -->
      <button class="accordion-icon-rotation_button" type="button" aria-expanded="false">

        <!-- 見出し -->
        <span class="accordion-icon-rotation_label">見出し1</span>

        <!-- 回転するSVGアイコン -->
        <span class="accordion-icon-rotation_icon" aria-hidden="true">
          <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
            <path d="m5 9 7 7 7-7"/>
          </svg>
        </span>

      </button>

      <!-- 開閉する内容 -->
      <div class="accordion-icon-rotation_content">
        <div class="accordion-icon-rotation_content-inner">1つ目の内容が表示されます。</div>
      </div>

    </div>

    <!-- 2つ目の項目 -->
    <div class="accordion-icon-rotation_item">

      <!-- 開閉ボタン -->
      <button class="accordion-icon-rotation_button" type="button" aria-expanded="false">

        <!-- 見出し -->
        <span class="accordion-icon-rotation_label">見出し2</span>

        <!-- 回転するSVGアイコン -->
        <span class="accordion-icon-rotation_icon" aria-hidden="true">
          <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
            <path d="m5 9 7 7 7-7"/>
          </svg>
        </span>

      </button>

      <!-- 開閉する内容 -->
      <div class="accordion-icon-rotation_content">
        <div class="accordion-icon-rotation_content-inner">2つ目の内容が表示されます。</div>
      </div>

    </div>

    <!-- 3つ目の項目 -->
    <div class="accordion-icon-rotation_item">

      <!-- 開閉ボタン -->
      <button class="accordion-icon-rotation_button" type="button" aria-expanded="false">

        <!-- 見出し -->
        <span class="accordion-icon-rotation_label">見出し3</span>

        <!-- 回転するSVGアイコン -->
        <span class="accordion-icon-rotation_icon" aria-hidden="true">
          <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
            <path d="m5 9 7 7 7-7"/>
          </svg>
        </span>

      </button>

      <!-- 開閉する内容 -->
      <div class="accordion-icon-rotation_content">
        <div class="accordion-icon-rotation_content-inner">3つ目の内容が表示されます。</div>
      </div>

    </div>

  </div>

</body>
</html>
コードについて 本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。 免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。

コードをコピーする場合 使用するコードのタブを選び、「このタブをコピー」をクリックすると、現在表示中のコードをコピーできます。 サンプル一式を取得する場合 HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
Q ダウンロードしたけど、これをネット上で動かすにはどうするの?
A

Googleアカウントがあれば、InfinityFreeで無料サーバーを作成して、ダウンロードしたサンプルをネット上で動かせます。

InfinityFreeを初めて利用する場合は①から、すでにサーバーを作成している場合は②へ進んでください。

ファイル構成と設置方法

このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLではアコーディオンの見出しや内容、回転するSVGアイコンを配置し、CSSでは横幅や余白、枠線、角丸などのデザインに加えて、アイコンの回転方向・角度・速度を設定します。JavaScriptでは見出しをクリックしたときの開閉動作を制御します。

配布するサンプルは、開いたときにアイコンが右回りに90度回転するタイプです。CSSの設定を変更することで、左回り90度・右回り180度・左回り180度にも切り替えられます。どの設定でも、項目を閉じるとアイコンは元の向きに戻ります。

sample/
  ├── index.html
  ├── style.css
  └── script.js

各ファイルの役割
index.htmlはアコーディオン全体を構成するファイルです。3つの項目が用意されており、それぞれに見出し、開いたときに表示する文章、下向きのSVGアイコンを配置しています。

style.cssはアコーディオンのデザインとアイコンの回転アニメーションを設定するファイルです。全体の横幅、項目の間隔、枠線、角丸、文字サイズ、アイコンの色や大きさを変更できます。また、transformで回転方向と角度を指定し、transitionで回転速度を調整します。

script.jsはアコーディオンの開閉動作を制御するファイルです。見出しをクリックすると、その項目のis-openクラスを付け外しします。CSSでは、このクラスの有無によって内容の表示・非表示とアイコンの回転を切り替えています。各項目は独立しているため、複数の項目を同時に開くこともできます。

設置方法・使い方
「サンプル一式をダウンロード」をクリックし、ZIPファイルを保存してください。ZIPを展開するとsampleフォルダが作成され、その中にindex.html・style.css・script.jsが入っています。

3つのファイルを同じ階層に配置した状態で、sample/index.htmlをブラウザで開いてください。index.htmlからstyle.cssとscript.jsを読み込むことで、アコーディオンのデザインと開閉機能が適用されます。

表示された見出しをクリックすると、対応する内容が開き、右側のSVGアイコンが右回りに90度回転します。もう一度クリックすると内容が閉じ、アイコンも逆方向に回転して元の向きに戻ります。ほかの項目を開いても、すでに開いている項目は閉じません。

回転方向と角度の変更方法
アイコンの回転方向と角度は、style.cssのtransform:rotate(90deg);で設定しています。配布サンプルでは右回り90度が初期設定です。

/* 開いたときのアイコンの回転 */
.accordion-icon-rotation_item.is-open .accordion-icon-rotation_icon {
  transform: rotate(90deg); /* 右回り90度 */
}

rotate()の数値を変更すると、アイコンが回転する方向と角度を調整できます。正の数値は右回り、負の数値は左回りです。次の4パターンから使用したい設定を選び、transformの1行を書き換えてください。

/* 右回り90度 */
transform: rotate(90deg);

/* 左回り90度 */
transform: rotate(-90deg);

/* 右回り180度 */
transform: rotate(180deg);

/* 左回り180度 */
transform: rotate(-180deg);

例えば、左回り90度に変更する場合は、transform:rotate(90deg);をtransform:rotate(-90deg);に書き換えます。4つの設定を同時に記述する必要はなく、使用する1行だけを指定します。

右回り180度と左回り180度は、回転が完了したときのアイコンの向きが同じです。ただし、回転中の動きは反対方向になります。閉じるときは、指定した方向とは逆向きに回転して元の状態に戻ります。

回転速度の変更方法
回転速度は、style.cssのtransitionで設定しています。

transition: transform 400ms ease;

400msは回転にかかる時間で、0.4秒を表します。例えば、200msにすると速く回転し、800msにするとゆっくり回転します。easeは、動き始めと終わりの速度を滑らかにする設定です。

開くときと閉じるときの両方に同じアニメーションが適用されるため、JavaScriptを変更する必要はありません。

カスタマイズできる内容
index.htmlでは、各項目の「見出し1」「見出し2」「見出し3」や、開いたときに表示する文章を変更できます。項目を増やしたい場合は、accordion-icon-rotation_itemを含む要素を複製し、見出しと内容を書き換えてください。項目を減らしたい場合は、不要な項目の要素を削除します。

SVGアイコンはindex.html内に直接記述されています。配布サンプルでは下向きの矢印を使用しており、開閉状態に応じて同じアイコンを回転させる仕組みです。別の形に変更したい場合は、SVGコードを差し替えることで変更できます。

style.cssでは、アコーディオン全体の横幅、項目間の余白、枠線の色や太さ、角丸、背景色、文字サイズ、SVGアイコンの色や大きさを変更できます。アイコンの色は.accordion-icon-rotation_iconにあるcolor:#2563eb;で調整できます。

script.jsでは、クリックした項目にis-openクラスを付け外ししています。回転方向・角度・速度の変更はCSSだけで行えるため、これらを調整する場合はJavaScriptを編集する必要はありません。

数値調整
style.css
max-width:700px;
アコーディオン全体の最大横幅です。値を大きくすると横に広がり、小さくするとコンパクトになります。

margin:0 0 12px;
各項目の下側余白です。12pxを大きくすると項目同士の間隔が広がり、小さくすると狭くなります。

border:1px solid #000000;
各項目を囲む枠線です。1pxを大きくすると枠線が太くなり、色の値を変更すると枠線の色が変わります。

border-radius:12px;
各項目の角丸です。値を大きくすると丸みが強くなり、0にすると四角いデザインになります。

gap:16px;
見出しとSVGアイコンの間隔です。値を大きくすると間隔が広がり、小さくすると狭くなります。

padding:16px 18px 16px;
見出しボタンの内側余白です。最初と最後の16pxが上下の余白、18pxが左右の余白です。値を大きくすると見出し部分が広くなります。

font-size:16px;
見出しと内容の文字サイズです。それぞれのCSS設定を変更することで、見出しと内容の文字サイズを個別に調整できます。

width:22px;
height:22px;
SVGアイコンの横幅と高さです。値を大きくするとアイコンが大きくなり、小さくするとコンパクトになります。

transform:rotate(90deg);
アイコンを開いたときの回転方向と角度です。正の数値にすると右回り、負の数値にすると左回りになります。90degは90度、180degは180度の回転を表します。

transition:transform 400ms ease;
アイコンの回転にかかる時間と動き方です。400msを小さくすると速く回転し、大きくするとゆっくり回転します。

height:18px;
.accordion-icon-rotation_content-inner::afterに設定されている内容の下側余白です。値を大きくすると文章の下の余白が広がり、小さくすると狭くなります。

レスポンシブ対応
このサンプルはレスポンシブ対応です。style.cssのwidth:100%;とmax-width:700px;によって、アコーディオン全体が親要素の横幅に合わせて表示されます。

また、画面幅640px以下ではメディアクエリによって、見出しとSVGアイコンの間隔をgap:12px;に変更しています。長い見出しは折り返され、SVGアイコンは縮小されないように設定されているため、スマートフォン・タブレット・PCで利用できます。


こちらもおすすめ


コメント