立体的な選択肢が開くセレクトボックスを作る方法【HTML/CSS/JavaScript・サンプルコード付き】

セレクトボックス

立体的な選択肢が開くセレクトボックスを作る方法

立体的な選択肢が開くセレクトボックスを作る方法を紹介します。このサンプルでは、HTML・CSS・JavaScriptを使用し、フラットな見出し部分をクリックすると、その下に複数の選択肢が手前へ浮き出すような立体デザインで表示されます。通常のセレクトボックスとは異なり、開いた選択肢それぞれに厚みと影を付けることで、押せる項目であることが視覚的に分かりやすいデザインになっています。

「商品について」「サービスについて」「料金について」「その他」の4つの選択肢を表示し、クリックした項目を現在の選択内容として見出し部分へ反映します。選択された項目は青色へ切り替わり、その後に選択肢一覧が閉じます。見出し自体は立体化せず、開いた選択肢だけを立体的に見せるため、通常のフォームに取り入れながら選択部分だけを強調したい場合にも利用できます。

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="three-dimensional-select-box_wrap">

    <!-- タイトル -->
    <div class="three-dimensional-select-box_title">
      立体的な選択肢が開くセレクトボックス
    </div>

    <!-- 説明文 -->
    <p class="three-dimensional-select-box_text">
      見出しをクリックすると、選択肢が手前へ浮き出すように表示されます。
    </p>

    <!-- 選択エリア -->
    <div class="three-dimensional-select-box_field">

      <!-- 項目名 -->
      <div class="three-dimensional-select-box_label">
        お問い合わせ内容
      </div>

      <!-- 選択中の内容を表示する見出し -->
      <button
        class="three-dimensional-select-box_trigger"
        type="button"
        aria-expanded="false">

        <span class="three-dimensional-select-box_value">
          商品について
        </span>

        <!-- 開閉アイコン -->
        <span
          class="three-dimensional-select-box_arrow"
          aria-hidden="true">
        </span>

      </button>

      <!-- 選択肢一覧 -->
      <ul class="three-dimensional-select-box_options">

        <li class="three-dimensional-select-box_option">

          <button
            class="three-dimensional-select-box_option-button is-selected"
            type="button"
            data-value="商品について">
            商品について
          </button>

        </li>

        <li class="three-dimensional-select-box_option">

          <button
            class="three-dimensional-select-box_option-button"
            type="button"
            data-value="サービスについて">
            サービスについて
          </button>

        </li>

        <li class="three-dimensional-select-box_option">

          <button
            class="three-dimensional-select-box_option-button"
            type="button"
            data-value="料金について">
            料金について
          </button>

        </li>

        <li class="three-dimensional-select-box_option">

          <button
            class="three-dimensional-select-box_option-button"
            type="button"
            data-value="その他">
            その他
          </button>

        </li>

      </ul>

    </div>

  </div>

  <!-- JavaScriptファイルを読み込み -->
  <script src="script.js"></script>

</body>
</html>
コードをコピーする場合 使用するコードのタブを選び、「このタブをコピー」をクリックすると、現在表示中のコードをコピーできます。
サンプル一式を取得する場合 HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。

ファイル構成と設置方法

このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLではタイトル、説明文、選択中の内容を表示する見出し、4つの選択肢を配置します。CSSでは見出し部分をフラットに表示しながら、開いた選択肢だけを手前へ浮き出すように立体表示します。JavaScriptでは見出しの開閉、選択状態の切り替え、クリックした選択肢の文字を見出しへ反映する処理を行います。

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

各ファイルの役割
index.htmlはセレクトボックス全体を構成するファイルです。タイトル、説明文、「お問い合わせ内容」の項目名、選択中の内容を表示する見出し、「商品について」「サービスについて」「料金について」「その他」の4つの選択肢を編集できます。選択肢を追加したい場合は、three-dimensional-select-box_optionのまとまりを同じ構成で追加できます。

style.cssはセレクトボックスの見た目と立体表示を設定するファイルです。全体の横幅、余白、背景色、枠線、角丸のほか、選択肢同士の間隔、立体的な厚み、影、前後方向への移動距離、開閉アニメーションなどを変更できます。見出し部分はフラットなデザインのまま表示し、選択肢部分だけにtranslateZ()box-shadowを使って立体感を付けています。

script.jsは選択肢の開閉と選択処理を行うファイルです。見出しをクリックするとis-openクラスを切り替え、選択肢を表示・非表示にします。選択肢をクリックすると、それまでの選択状態を解除してクリックした項目へis-selectedクラスを付け、data-valueの内容を見出しへ反映します。その後、0.1秒待って選択肢を閉じます。

設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを同じ階層で配置します。3つのファイルを保存したあと、sample/index.htmlをブラウザで開いてください。最初は「商品について」が選択された状態で表示されます。見出し部分をクリックすると4つの選択肢が立体的に開き、任意の項目をクリックすると、その項目が青色の選択状態へ切り替わり、見出し部分の文字も選択した内容へ変更されます。

カスタマイズできる内容
index.htmlではタイトル、説明文、項目名、見出しに表示する初期値、各選択肢の文章とdata-valueを変更できます。表示する選択肢の件数や順番も、HTML内の各li要素を追加・削除・並び替えることで変更できます。

style.cssでは全体の最大横幅、内側余白、背景色、枠線、角丸、見出しの高さ、選択肢同士の間隔を変更できます。選択肢の背景色、枠線、角丸、下側の厚み、影、通常時・ホバー時・クリック時の前後方向への移動距離も調整できます。また、開いている間に確保する下側スペースや開閉アニメーション時間も変更できます。

script.jsでは選択肢をクリックしてから閉じるまでの待機時間を変更できます。現在はクリック後0.1秒で閉じる設定です。

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

max-width:460px;
見出しと選択肢を表示する選択エリアの最大横幅です。値を変更すると見出しと各選択肢の横幅が変わります。

perspective:900px;
立体表示の遠近感を設定しています。値を変更するとtranslateZ()による奥行きの見え方が変化します。

margin-bottom:280px;
選択肢を開いたときに下側へ確保するスペースです。値を大きくすると下側の余白が広がり、小さくすると狭くなります。

transition:margin-bottom .3s ease;
開閉時に下側余白が変化する時間です。0.3秒で変化します。値を大きくするとゆっくり、小さくすると速く変化します。

top:calc(100% + 10px);
見出しと選択肢一覧の間隔です。10pxを大きくすると見出しから離れ、小さくすると近づきます。

gap:10px;
各選択肢同士の間隔です。値を大きくすると間隔が広がり、小さくすると詰まります。640px以下ではgap:8px;へ変更されます。

transform:translateY(-14px) rotateX(-12deg);
閉じている状態の選択肢一覧の位置と角度です。開くとtranslateY(0) rotateX(0deg)へ変化します。

transition:opacity .3s ease, visibility .3s ease, transform .3s ease;
選択肢一覧が開閉するときのアニメーション時間です。0.3秒で変化します。

box-shadow:0 4px 0 #60a5fa,0 8px 12px rgba(37,99,235,.16);
通常状態の選択肢に付ける厚みと影です。最初の4pxを大きくすると下側の立体的な厚みが強くなります。

transform:translateZ(35px) translateY(0);
通常状態の選択肢を手前へ35px移動して表示します。35pxを大きくするとより手前へ浮き出します。

transform:translateZ(55px) translateY(-3px);
選択肢へマウスを乗せたときの位置です。通常状態よりさらに手前へ浮き、上方向へ3px移動します。

transform:translateZ(15px) translateY(3px);
選択肢を押しているときの位置です。手前への距離を15pxまで小さくし、下へ3px移動することで押し込まれたように見せています。

script.js
setTimeout(...,100);
100は100ミリ秒、0.1秒を表します。選択肢をクリックしてから一覧を閉じるまでの待機時間です。値を大きくすると選択状態を長く見せてから閉じ、小さくすると早く閉じます。

レスポンシブ対応
このサンプルはレスポンシブ対応です。style.cssでは全体と選択エリアにwidth:100%max-widthを設定し、画面幅に合わせて横幅が縮小するようにしています。また、640px以下では全体のpaddingを28px 18px 34pxへ変更し、見出しの文字サイズを15px、選択肢同士の間隔を8pxへ調整しています。スマートフォン・タブレット・PCで利用できます。


こちらもおすすめ


コメント