← 動的パーツギャラリーへ戻る

パーツ番号 08-10-01 ・ JavaScript使用

移動するフォーカスリング付きボタン群

Tabキーで移動するたびに、紫のハイライトが滑らかに次のボタンへスライドします。WordPress管理バーやツールバーのキーボード操作性向上に使えます。

js

プレビュー

ソースコード

HTML

<div class="d08-10-01-group" role="group" aria-label="操作ボタン">
          <button class="d08-10-01-btn" type="button">新規</button>
          <button class="d08-10-01-btn" type="button">編集</button>
          <button class="d08-10-01-btn" type="button">共有</button>
          <button class="d08-10-01-btn" type="button">削除</button>
          <span class="d08-10-01-ring" aria-hidden="true"></span>
        </div>

CSS

.d08-10-01-group{position:relative;display:inline-flex;gap:8px;padding:6px;background:#f3f4f8;border-radius:14px}
        .d08-10-01-btn{position:relative;z-index:1;background:none;border:none;padding:10px 14px;font-size:13px;font-weight:600;color:#3a3d4a;border-radius:10px;cursor:pointer;outline:none;transition:color .2s}
        .d08-10-01-btn.is-active{color:#fff}
        .d08-10-01-ring{position:absolute;top:6px;left:6px;width:0;height:0;background:linear-gradient(135deg,#6a5cff,#8a7bff);border-radius:10px;box-shadow:0 4px 14px rgba(106,92,255,.35);transition:transform .28s cubic-bezier(.3,1,.4,1),width .28s,height .28s,opacity .2s;opacity:0;z-index:0;pointer-events:none}
        .d08-10-01-ring.is-show{opacity:1}

JavaScript

(function(){
        var group=document.querySelector('#item-08-10-01 .d08-10-01-group');if(!group)return;
        var ring=group.querySelector('.d08-10-01-ring');
        var btns=[].slice.call(group.querySelectorAll('.d08-10-01-btn'));
        function move(btn){
          ring.style.width=btn.offsetWidth+'px';
          ring.style.height=btn.offsetHeight+'px';
          ring.style.transform='translate('+btn.offsetLeft+'px,'+btn.offsetTop+'px)';
          ring.classList.add('is-show');
          btns.forEach(function(b){b.classList.toggle('is-active',b===btn);});
        }
        group.addEventListener('focusin',function(e){
          if(e.target.classList&&e.target.classList.contains('d08-10-01-btn'))move(e.target);
        });
        group.addEventListener('focusout',function(e){
          if(!group.contains(e.relatedTarget)){
            ring.classList.remove('is-show');
            btns.forEach(function(b){b.classList.remove('is-active');});
          }
        });
      })();

クラス名 .d08-10-01 は本ライブラリ内での識別用です。複数のパーツを同じページで使う場合は、重複しないよう名前を変更してください。