スプリットボタン Split Button

メインアクションとドロップダウンを組み合わせたボタン。主操作と副操作を一つにまとめる。

使用場面: 「保存」と「名前を付けて保存」のように、主操作に関連する副操作がある場面 採用例: Google Docs 保存ボタン, VS Code 実行ボタン

ライブデモ

ソースコード

<div class="demo-split-btn-wrapper">
  <div class="demo-split-btn">
    <button class="demo-split-btn-main">保存する</button>
    <button class="demo-split-btn-toggle" aria-label="その他の保存オプション" aria-expanded="false">
      <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="6 9 12 15 18 9"/></svg>
    </button>
  </div>
  <div class="demo-split-btn-menu">
    <button class="demo-split-btn-option">名前を付けて保存</button>
    <button class="demo-split-btn-option">テンプレートとして保存</button>
    <button class="demo-split-btn-option">下書きに保存</button>
  </div>
</div>
.demo-split-btn-wrapper { position: relative; display: inline-block; }
.demo-split-btn { display: inline-flex; border-radius: 8px; overflow: hidden; }
.demo-split-btn-main {
  padding: 10px 20px; border: none; background: var(--ui-primary);
  color: #fff; font-size: 14px; font-weight: 600; cursor: pointer;
  transition: opacity 0.2s;
}
.demo-split-btn-main:hover { opacity: 0.9; }
.demo-split-btn-toggle {
  padding: 10px 10px; border: none; cursor: pointer;
  background: color-mix(in srgb, var(--ui-primary) 85%, #000);
  color: #fff; display: flex; align-items: center;
  border-left: 1px solid rgba(255,255,255,0.2);
  transition: background 0.2s;
}
.demo-split-btn-toggle:hover { background: color-mix(in srgb, var(--ui-primary) 75%, #000); }
.demo-split-btn-menu {
  position: absolute; top: calc(100% + 4px); left: 0; min-width: 200px;
  background: #fff; border: 1px solid #e5e7eb; border-radius: 8px;
  box-shadow: 0 4px 16px rgba(0,0,0,0.1); padding: 4px;
  display: none; z-index: 10;
}
.demo-split-btn-menu.open { display: block; }
.demo-split-btn-option {
  display: block; width: 100%; padding: 9px 14px; border: none;
  background: none; text-align: left; font-size: 13px; color: #333;
  cursor: pointer; border-radius: 6px; transition: background 0.15s;
}
.demo-split-btn-option:hover {
  background: color-mix(in srgb, var(--ui-primary) 10%, transparent);
  color: var(--ui-primary);
}
(function(){
  var toggle = document.querySelector('.demo-split-btn-toggle');
  var menu = document.querySelector('.demo-split-btn-menu');
  toggle.addEventListener('click', function(){
    var open = menu.classList.toggle('open');
    toggle.setAttribute('aria-expanded', open);
  });
  document.addEventListener('click', function(e){
    if (!e.target.closest('.demo-split-btn-wrapper')) {
      menu.classList.remove('open');
      toggle.setAttribute('aria-expanded', 'false');
    }
  });
  menu.querySelectorAll('.demo-split-btn-option').forEach(function(opt){
    opt.addEventListener('click', function(){
      menu.classList.remove('open');
      toggle.setAttribute('aria-expanded', 'false');
    });
  });
})();

AIプロンプト

Basic
スプリットボタンをHTML/CSS/JSで作ってください。メインの「保存」ボタンの横にドロップダウン矢印があり、クリックで追加の保存オプションが表示されます。
Custom
以下の仕様でスプリットボタンを実装してください。
- メインボタン「保存する」+ ドロップダウン矢印
- ドロップダウンに3つのオプション(名前を付けて保存、テンプレートとして保存、下書きに保存)
- プライマリカラー: #2563eb
- ホバーエフェクト付き
- ドロップダウンにアニメーション
- 外側クリックで閉じる
Advanced
アクセシビリティ対応のスプリットボタンを実装してください。
- aria-haspopup="true" と aria-expanded を設定
- role="menu" / role="menuitem" を使用
- 矢印キーでメニュー内を移動
- ESCキーでメニューを閉じてトグルにフォーカス
- メニュー展開時にフォーカスを最初の項目に移動
- キーボードでのみフォーカスリングを表示
- disabled状態のスタイルと動作