このページの中身

タブ切替

ナビ / パターン集トップ

同じ場所で内容を切り替える。JavaScript が要る部品なので、キー操作まで含めて貼る

プレビュー#

この枠の中は出発点のCSSの上で動いています。下のコードは、そちらを先に貼ってから足してください。

コピーする#

上のプレビューでつまみを動かし、「生成する」で調整を反映したコードを作ってからコピーしてください。下の欄は生成の元になる型で、直接コピーするものではありません。

<div class="tabs" data-tabs>
  <div class="tabs__list" role="tablist" aria-label="表示切替">
    <button type="button" role="tab" id="tab-a" aria-selected="true" aria-controls="panel-a">概要</button>
    <button type="button" role="tab" id="tab-b" aria-selected="false" aria-controls="panel-b" tabindex="-1">詳細</button>
  </div>
  <div class="tabs__panel" role="tabpanel" id="panel-a" aria-labelledby="tab-a" tabindex="0">概要の内容</div>
  <div class="tabs__panel" role="tabpanel" id="panel-b" aria-labelledby="tab-b" tabindex="0" hidden>詳細の内容</div>
</div>

<script>
// タブは JavaScript が要る部品。これが無いと2枚目は永久に開かない
document.querySelectorAll("[data-tabs]").forEach(function (root) {
  var tabs = Array.prototype.slice.call(root.querySelectorAll('[role="tab"]'));

  function select(tab) {
    tabs.forEach(function (t) {
      var on = t === tab;
      t.setAttribute("aria-selected", String(on));
      t.tabIndex = on ? 0 : -1;   // roving tabindex。Tab は1回で帯を抜ける
      document.getElementById(t.getAttribute("aria-controls")).hidden = !on;
    });
    tab.focus();
  }

  tabs.forEach(function (tab) {
    tab.addEventListener("click", function () { select(tab); });
    tab.addEventListener("keydown", function (event) {
      var i = tabs.indexOf(tab), n = tabs.length, to;
      if (event.key === "ArrowRight") to = (i + 1) % n;
      else if (event.key === "ArrowLeft") to = (i - 1 + n) % n;
      else if (event.key === "Home") to = 0;
      else if (event.key === "End") to = n - 1;
      else return;
      event.preventDefault();   /* 矢印での画面スクロールを止める */
      select(tabs[to]);
    });
  });
});
</script>
.tabs__list {
  display: flex;
  gap: var(--space-2);
  border-block-end: 1px solid var(--color-border);
  margin-block-end: var(--space-4);
}
.tabs__list [role="tab"] {
  font: inherit;
  cursor: pointer;
  padding: var(--space-2) var(--space-4);
  border: 0;
  background: transparent;
  color: var(--color-text-muted);
  border-block-end: 2px solid transparent;
  margin-block-end: -1px;
}
.tabs__list [role="tab"][aria-selected="true"] {
  color: var(--color-text);
  border-block-end-color: var(--color-accent-text);
  font-weight: 700;
}
.tabs__panel {
  padding-block: var(--space-2);
}

確認する#

関連#

この資料は、Webサイトを作るときに引くためのものです。 何のために作ったか。作っているのは AK²Lab。