「タブ」ブロックをJavaScript不要でステップ表示にカスタマイズする方法

Cocoonカスタマイズ集
この記事は約11分で読めます。
記事内に広告が含まれています。

はじめに

以下を実現します。

サービスの手順や作業の流れを解説する際、全体の工程を視覚的に伝える「プロセスステップ」表現はユーザーの理解を大きく助けます。

Cocoon標準の「タブ」ブロックも便利ですが、CSSの新機能(sibling-index()や:has())を活用すれば、JavaScriptを使わずにステップ表示へ簡単にカスタマイズできます。

この記事では、この方法について説明します。

完成イメージ

  • 注文
  • 決済
  • 最終確認
  • 購入完了
  • イベント一覧から希望する公演・日時を選択する。
  • 希望する席種(S席、A席、自由席など)や枚数を指定する。
  • 氏名、メールアドレス、電話番号などの連絡先を入力する。
  • 支払い方法(クレジットカード、コンビニ払い、スマホ決済など)を選択・入力する。
  • 席種、枚数、手数料、合計金額、入力情報を一画面で最終確認する。
  • 「購入を確定する」ボタンを押下する。
  • 画面に購入完了メッセージと「注文番号」を表示する。
  • システムから購入完了メール(自動配信)がユーザーに届く。

実装手順

以下の手順で実装します。

  • ラベル
    Gutenbergエディターでの設定

    「タブ」ブロックを配置します。

  • ラベル
    CSSを追加

    以下のコードをstyle.cssに追加します。

    .wp-block-cocoon-blocks-tab {
      /* アクティブ・進捗線の色 */
      --tab-color: #3b82f6;
      /* 非アクティブの線の色 */
      --tab-line-color: #e5e7eb;
    
      --tab-color-glow: color-mix(in srgb, var(--tab-color), transparent 80%);
      --tab-color-light: color-mix(in srgb, var(--tab-color), white 30%);
      --tab-marker-border: color-mix(in srgb, var(--tab-line-color), black 12%);
    
      .tab-label-group {
        counter-reset: step-counter;
        gap: 0;
        margin: 0 0 30px 0 !important;
        overflow: visible !important;
    
        > li {
          /* タブ位置 */
          --i: sibling-index();
    
          align-items: center;
          background:
            linear-gradient(var(--tab-line-color), var(--tab-line-color))
            0 15px / 100% 6px no-repeat !important;
          counter-increment: step-counter;
          display: flex;
          flex: 1 1 0;
          flex-direction: column;
          padding: 0 !important;
          position: relative;
          text-align: center;
    
          /* 最初: 自分の中心 → 右端 */
          &:first-of-type {
            background:
              linear-gradient(var(--tab-line-color), var(--tab-line-color))
              100% 15px / 50% 6px no-repeat !important;
          }
    
          /* 最後: 左端 → 自分の中心 */
          &:last-of-type {
            background:
              linear-gradient(var(--tab-line-color), var(--tab-line-color))
              0 15px / 50% 6px no-repeat !important;
          }
    
          /* li が1つだけの場合は線なし */
          &:only-of-type {
            background: none !important;
          }
    
          /* 進捗線 */
          &::after {
            background-image: linear-gradient(
              -45deg,
              var(--tab-color) 25%,
              var(--tab-color-light) 25%,
              var(--tab-color-light) 50%,
              var(--tab-color) 50%,
              var(--tab-color) 75%,
              var(--tab-color-light) 75%,
              var(--tab-color-light)
            );
            background-size: 20px 20px;
            border-radius: 3px;
            clip-path: inset(0 100% 0 0);
            content: "";
            height: 6px;
            position: absolute;
            right: 50%;
            top: 15px;
            transition: clip-path 0.3s ease-in-out;
            width: calc((var(--i) - 1) * 100%);
            z-index: 1;
          }
    
          /* アクティブ、またはアクティブより前は線を表示 */
          &.is-active::after,
          &:has(~ li.is-active)::after {
            clip-path: inset(0 0 0 0);
          }
    
          /* 数字サークル */
          &::before {
            line-height: 32px;
            background-color: #fff;
            border: 2px solid var(--tab-marker-border);
            border-radius: 50%;
            box-sizing: border-box;
            content: counter(step-counter);
            font-weight: bold;
            height: 36px;
            margin-bottom: 8px;
            transition: all 0.4s ease;
            width: 36px;
            z-index: 2;
          }
    
          /* アクティブ */
          &.is-active {
            color: var(--tab-color);
            font-weight: bold;
    
            &::before {
              background-color: var(--tab-color);
              border-color: var(--tab-color);
              box-shadow: 0 0 0 4px var(--tab-color-glow);
              color: #fff;
            }
          }
        }
      }
    }

さいごに

今回紹介した方法を使えば、JavaScriptや複雑な設定を一切使うことなく、Cocoonの標準「タブ」ブロックをステップ表示にカスタマイズできます。

sibling-index()や :has()といった最新のCSS機能を活用することで、タブの増減にも自動で追従し、コードの保守性も大幅に向上します。

タイトルとURLをコピーしました