Skip to main content Skip to docs navigation

側邊欄

放置頁面一邊的具層級性、垂直排列的導覽。


關於側邊欄元件

側邊欄為導覽用的元件,通常與頂部導覽搭配使用,適合當網站資訊架構較為複雜、層級較多時使用。側邊欄可以呈現一到三層級的選項,第一層級的選項最少五項。根據米勒定律 (Miller’s law) 一般人短期記憶中能容納的物體數量為七加減二,所以第一層級的選項也請儘量維持在九項以下。第二層級沒有特別規定,但若超過九項時,請審慎考慮網站的架構規劃。第三層級因為已到達直接呈現後點擊的用途,連結數量上並沒有一定限制。

使用規範

何時該使用側邊欄

  • 呈現一到三層級的導覽架構。 側邊欄至少一層且第一層級至少五項,層級數目則至多三層。
  • 呈現網站分區中的次層級導覽。 當網站有明顯分區且次層級較多時,善用側邊欄輔助頂部導覽列。
  • 有層級的常用服務之快速導覽。 當網站有明顯較常用的服務存在且多於五項又有層級架構時,利用側邊欄作為整個網站的快速導覽。

何時該考慮使用其他元件

  • 小網站。 當網站架構簡單、層級數少時,不需用到側邊欄。
  • 已有導覽存在。 當網站架構簡單,頂部導覽即可有效的引導使用者時,不需用到側邊欄。
  • 需要用文字標題以外的元素描述時。 當文字標題不足以描述使用者即將前往的頁面時,請考慮用其他元件,例如卡片。
  • 數量少的常用服務之快速導覽。 當有替常用服務做快速導覽的需求時,若層級簡單則不需用到側邊欄,可以考慮使用其他元件如卡片,橫向呈列常見服務。
  • 選項為僅供瀏覽但不可以點擊的資訊。 當列出的選項僅為瀏覽用但不為導覽用時,請勿使用導覽列。

側邊欄易用性

  • 文字標題簡短。 請保持文字標題簡短易懂,且在單行呈現文字標題。
  • 用狀態呈現目前選擇。 利用風格區別已選擇或未選擇的選項,通常使用狀態 (actvie state) 來區別。
  • 側邊欄內比較不常用的選擇放在比較下方。 使用者的注意力會從側邊欄的選項中從上至下瀏覽,因此為了幫助使用者方便且迅速的到達對的頁面,請將比較不常見的選擇放在欄位較為下方的位置。
  • 請勿用過於華麗的特效展開、收納導覽列。 導覽的用除在於幫助使用者找到對的頁面與內容,請勿將導覽列的風格或視覺做得過於花俏反而喧賓奪主,影響使用者的注意力。
  • 請勿在側邊欄呈現跟其他導覽列完全一樣的內容。 當側邊欄與頂部導覽列同時存在時,側邊欄的存在目的為輔助頂部導覽列,完全將頂部導覽列的內容全部複製到側邊欄。
  • 請勿為了填滿空間而使用側邊欄。 側邊欄的存在目的為導覽,當頁面很簡單乾淨時,切勿為了填滿空間而執意製作一個側邊導覽列。空白空間的存在可以幫助使用者將注意力放在對的地方。
  • 請勿只以圖標 (icon) 呈現側邊欄。 側邊欄的存在目的為導覽,且應能幫助使用者迅速地看到欲點擊選項。勿為省略文字標題,而只以圖標暗示。請勿讓使用者花額外時間猜測圖標背後代表的意義。

元件設計

基本側邊欄 Basic Sidebar

基本側邊欄由垂直排列的選單所構成,至多可以展開到第三層。

<div class="row d-flex justify-content-center">
  <div class="col-lg-6">
    <nav class="sidebar">
      <ul class="sidebar-body">
        <li>
          <button class="sidebar-button collapsed" data-bs-toggle="collapse" data-bs-target="#first-collapse" aria-expanded="true">
            可展開第一層標題
          </button>
          <div class="collapse" id="first-collapse">
            <ul class="sidebar-menu">
              <li>
                <button class="sidebar-button collapsed" data-bs-toggle="collapse" data-bs-target="#second-collapse" aria-expanded="true">可展開第二層標題
                </button>
                <div class="collapse" id="second-collapse">
                  <ul class="sidebar-menu">
                    <li><a href="#" class="sidebar-link">第三層連結內容</a></li>
                    <li><a href="#" class="sidebar-link">第三層連結內容</a></li>
                    <li><a href="#" class="sidebar-link">第三層連結內容</a></li>
                  </ul>
                </div>
              </li>
            </ul>
          </div>
        </li>
        <li>
          <button class="sidebar-button collapsed" data-bs-toggle="collapse" data-bs-target="#one-collapse" aria-expanded="true">
            可展開第一層標題
          </button>
          <div class="collapse" id="one-collapse">
            <ul class="sidebar-menu">
              <li>
                <button class="sidebar-button collapsed" data-bs-toggle="collapse" data-bs-target="#two-collapse" aria-expanded="true">可展開第二層標題
                </button>
                <div class="collapse" id="two-collapse">
                  <ul class="sidebar-menu">
                    <li><a href="#" class="sidebar-link">第三層連結內容</a></li>
                    <li><a href="#" class="sidebar-link">第三層連結內容</a></li>
                    <li><a href="#" class="sidebar-link">第三層連結內容</a></li>
                  </ul>
                </div>
              </li>
              <li>
                <button class="sidebar-button collapsed" data-bs-toggle="collapse" data-bs-target="#three-collapse" aria-expanded="true">可展開第二層標題
                </button>
                <div class="collapse" id="three-collapse">
                  <ul class="sidebar-menu">
                    <li><a href="#" class="sidebar-link">第三層連結內容</a></li>
                    <li><a href="#" class="sidebar-link">第三層連結內容</a></li>
                    <li><a href="#" class="sidebar-link">第三層連結內容</a></li>
                  </ul>
                </div>
              </li>
            </ul>
          </div>
        </li>
        <li>
          <button class="sidebar-button collapsed" data-bs-toggle="collapse" data-bs-target="#four-collapse" aria-expanded="true">
            可展開第一層標題
          </button>
          <div class="collapse" id="four-collapse">
            <ul class="sidebar-menu">
              <li>
                <button class="sidebar-button collapsed" data-bs-toggle="collapse" data-bs-target="#five-collapse" aria-expanded="true">可展開第二層標題
                </button>
                <div class="collapse" id="five-collapse">
                  <ul class="sidebar-menu">
                    <li><a href="#" class="sidebar-link">第三層連結內容</a></li>
                    <li><a href="#" class="sidebar-link">第三層連結內容</a></li>
                    <li><a href="#" class="sidebar-link">第三層連結內容</a></li>
                  </ul>
                </div>
              </li>
            </ul>
          </div>
        </li>
      </ul>
    </nav>
  </div>
</div>

<script>
for (const link of document.querySelectorAll(".sidebar-link")) {
  link.addEventListener("click", () => {
    for (const a of document.querySelectorAll(".sidebar-link")) {
      a.classList.remove("active")
    }
    link.classList.add("active")
  });
}
</script>

內容頁選單 Linked Items

內容頁選單右側沒有向下的箭頭,點擊後在側邊欄右側反映出相對應的頁面內容。

<div class="row d-flex justify-content-center">
  <div class="col-lg-6">
    <nav class="sidebar">
      <ul class="sidebar-body">
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
      </ul>
    </nav>
  </div>
</div>
<script>
for (const link of document.querySelectorAll(".sidebar-link")) {
  link.addEventListener("click", () => {
    for (const a of document.querySelectorAll(".sidebar-link")) {
      a.classList.remove("active")
    }
    link.classList.add("active")
  });
}
</script>

多層混用 Mixed Multilevels

選單可以是單層、兩層或三層,但最多不超過三層。

<div class="row d-flex justify-content-center">
  <div class="col-md-6">
    <nav class="sidebar">
      <ul class="sidebar-body">
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
        <li>
          <button class="sidebar-button collapsed" data-bs-toggle="collapse" data-bs-target="#multi-collapse" aria-expanded="true">
            可展開第一層標題
          </button>
          <div class="collapse" id="multi-collapse">
            <ul class="sidebar-menu">
              <li><a href="#" class="sidebar-link">第二層連結內容</a></li>
              <li><a href="#" class="sidebar-link">第二層連結內容</a></li>
              <li><a href="#" class="sidebar-link">第二層連結內容</a></li>
            </ul>
          </div>
        </li>
        <li>
          <button class="sidebar-button collapsed" data-bs-toggle="collapse" data-bs-target="#multi-collapse2" aria-expanded="true">
            可展開第一層標題
          </button>
          <div class="collapse" id="multi-collapse2">
            <ul class="sidebar-menu">
              <li><a href="#" class="sidebar-link">第二層連結內容</a></li>
              <li><a href="#" class="sidebar-link">第二層連結內容</a></li>
              <li><a href="#" class="sidebar-link">第二層連結內容</a></li>
              <li>
                <button class="sidebar-button collapsed" data-bs-toggle="collapse" data-bs-target="#multi-collapse3" aria-expanded="true">可展開第二層標題
                </button>
                <div class="collapse" id="multi-collapse3">
                  <ul class="sidebar-menu">
                    <li><a href="#" class="sidebar-link">第三層連結內容</a></li>
                    <li><a href="#" class="sidebar-link">第三層連結內容</a></li>
                  </ul>
                </div>
              </li>
            </ul>
          </div>
        </li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
      </ul>
    </nav>
  </div>
</div>
<script>
for (const link of document.querySelectorAll(".sidebar-link")) {
  link.addEventListener("click", () => {
    for (const a of document.querySelectorAll(".sidebar-link")) {
      a.classList.remove("active")
    }
    link.classList.add("active")
  });
}
</script>

分區 Grouping

選單可以分區顯示,以標題文字區隔。

<div class="row d-flex justify-content-center">
  <div class="col-lg-6">
    <nav class="sidebar">
      <ul class="sidebar-body">
        <li><span class="sidebar-subheader">側邊欄分區標題文字</span></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
        <li class="sidebar-divider"><hr></li>
        <li><span class="sidebar-subheader">側邊欄分區標題文字</span></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
      </ul>
    </nav>
  </div>
</div>
<script>
for (const link of document.querySelectorAll(".sidebar-link")) {
  link.addEventListener("click", () => {
    for (const a of document.querySelectorAll(".sidebar-link")) {
      a.classList.remove("active")
    }
    link.classList.add("active")
  });
}
</script>

圖示 Icon

可以用純文字,不需要圖示。

<div class="row d-flex justify-content-center">
  <div class="col-lg-6">
    <nav class="sidebar">
      <ul class="sidebar-body">
        <li><a href="#" class="sidebar-link"><i class="bi bi-signpost-split icon"></i>第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link"><i class="bi bi-signpost-split icon"></i>第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link"><i class="bi bi-signpost-split icon"></i>第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link"><i class="bi bi-signpost-split icon"></i>第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link"><i class="bi bi-signpost-split icon"></i>第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link"><i class="bi bi-signpost-split icon"></i>第一層連結內容</a></li>
      </ul>
    </nav>
  </div>
</div>
<script>
for (const link of document.querySelectorAll(".sidebar-link")) {
  link.addEventListener("click", () => {
    for (const a of document.querySelectorAll(".sidebar-link")) {
      a.classList.remove("active")
    }
    link.classList.add("active")
  });
}
</script>

徽章 Badge

可以用 badge 顯示某一連結項目的狀態。這樣的做法可以呈現出 stepper 的樣式。

<div class="row d-flex justify-content-center">
  <div class="col-lg-6">
    <nav class="sidebar">
      <ul class="sidebar-body">
        <li><a href="#" class="sidebar-link">第一層連結內容<span class="badge bg-positive-flat">已完成</span></a></li>
        <li><a href="#" class="sidebar-link">第一層連結內容<span class="badge bg-negative-flat badge-numerical">2</span></a></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
      </ul>
    </nav>
  </div>
</div>
<script>
for (const link of document.querySelectorAll(".sidebar-link")) {
  link.addEventListener("click", () => {
    for (const a of document.querySelectorAll(".sidebar-link")) {
      a.classList.remove("active")
    }
    link.classList.add("active")
  });
}
</script>

標題 Heading

在側邊欄上面加上標題文字

<div class="row d-flex justify-content-center">
  <div class="col-lg-6">
    <nav class="sidebar">
      <div class="sidebar-header">側邊欄標題文字</div>
      <ul class="sidebar-body">
        <li><span class="sidebar-subheader">側邊欄分區標題文字</span></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
        <li class="sidebar-divider"><hr></li>
        <li><span class="sidebar-subheader">側邊欄分區標題文字</span></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
        <li><a href="#" class="sidebar-link">第一層連結內容</a></li>
      </ul>
    </nav>
  </div>
</div>
<script>
for (const link of document.querySelectorAll(".sidebar-link")) {
  link.addEventListener("click", () => {
    for (const a of document.querySelectorAll(".sidebar-link")) {
      a.classList.remove("active")
    }
    link.classList.add("active")
  });
}
</script>

範例

關於側邊欄在響應式設計中的變形,以及側邊欄與頁首搭配時的見識使用方式,請詳見模板 (Navigation Starter)