Bootstrap Icons: 16 Examples + How to Install and Style Them

Bootstrap Icons runs fine on a site that never loads Bootstrap. The Bootstrap team publishes it under the MIT license as a separate package of 2,078 icons at version 1.13.2, shipped as SVG files, an SVG sprite and an icon font.

Below are 16 Bootstrap Icons examples you can copy, followed by a guide to installing, sizing, styling and fixing the icons.

By Bogdan Sandu ยท Updated October 29, 2026

Every example runs on Bootstrap 5.3.8 from the jsDelivr CDN. Add these tags to your page, then paste an example's HTML, CSS and JS.

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB" crossorigin="anonymous">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.2/font/bootstrap-icons.min.css" rel="stylesheet" integrity="sha384-nWN3KqaaVcbEsCjLSV+2jMjh62Iny/+mN3srM8TZeM8N6aj7eDl5wwYggjAJ4/sJ" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js" integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI" crossorigin="anonymous"></script>

Icon buttons and toolbars

Bootstrap Icons inside real buttons: labelled actions, icon-only controls with aria-label, toggles that swap the outline glyph for its -fill twin, and a media player on a dark stage.

Themed action buttons

  • bi bi-*
  • --bs-btn-* variables
  • tooltip
  • aria-label

Hover or focus an icon-only button.

Labelled buttons put the icon before the text with me-2 and hide it with aria-hidden, so the word names the control. The icon-only row gets aria-label plus a Bootstrap tooltip for sighted users. The custom class only re-themes the buttons through the --bs-btn-* variables.

View code
<div class="ico-actions card border-0 shadow-sm">
  <div class="card-body p-4">
    <h3 class="h6 mb-1">Invoice INV-2048</h3>
    <p class="text-body-secondary small mb-3">Harbor and Pine Studio, due 14 Nov</p>
    <div class="d-flex flex-wrap gap-2 mb-4">
      <button type="button" class="btn ico-btn-ink"><i class="bi bi-download me-2" aria-hidden="true"></i>Download PDF</button>
      <button type="button" class="btn ico-btn-soft"><i class="bi bi-send me-2" aria-hidden="true"></i>Send reminder</button>
      <button type="button" class="btn ico-btn-soft">Continue<i class="bi bi-arrow-right ms-2" aria-hidden="true"></i></button>
    </div>
    <div class="d-flex gap-2" role="group" aria-label="Invoice tools">
      <button type="button" class="btn ico-btn-square" aria-label="Edit invoice" data-bs-toggle="tooltip" data-bs-title="Edit"><i class="bi bi-pencil-square" aria-hidden="true"></i></button>
      <button type="button" class="btn ico-btn-square" aria-label="Duplicate invoice" data-bs-toggle="tooltip" data-bs-title="Duplicate"><i class="bi bi-copy" aria-hidden="true"></i></button>
      <button type="button" class="btn ico-btn-square" aria-label="Archive invoice" data-bs-toggle="tooltip" data-bs-title="Archive"><i class="bi bi-archive" aria-hidden="true"></i></button>
      <button type="button" class="btn ico-btn-square ico-btn-danger" aria-label="Delete invoice" data-bs-toggle="tooltip" data-bs-title="Delete"><i class="bi bi-trash3" aria-hidden="true"></i></button>
    </div>
  </div>
</div>

Icon-only editor toolbar

  • btn-toolbar
  • btn-group
  • data-bs-toggle="button"
  • btn-check

Click Bold or pick an alignment.

A btn-toolbar with role="toolbar" groups icon-only buttons, each named by aria-label. Bold, italic and underline use the Bootstrap button plugin (data-bs-toggle="button"), which flips .active and aria-pressed for you, and the alignment set is a btn-check radio group with visually-hidden labels.

View code
<div class="ico-editor card shadow-sm border-0">
  <div class="card-header bg-body border-0 pt-3">
    <div class="btn-toolbar gap-2" role="toolbar" aria-label="Text formatting">
      <div class="btn-group" role="group" aria-label="Style">
        <button type="button" class="btn btn-light ico-tool ico-bold" data-bs-toggle="button" aria-pressed="false" aria-label="Bold"><i class="bi bi-type-bold" aria-hidden="true"></i></button>
        <button type="button" class="btn btn-light ico-tool" data-bs-toggle="button" aria-pressed="false" aria-label="Italic"><i class="bi bi-type-italic" aria-hidden="true"></i></button>
        <button type="button" class="btn btn-light ico-tool" data-bs-toggle="button" aria-pressed="false" aria-label="Underline"><i class="bi bi-type-underline" aria-hidden="true"></i></button>
      </div>
      <div class="btn-group" role="group" aria-label="Alignment">
        <input type="radio" class="btn-check" name="ico-align" id="ico-align-left" autocomplete="off" checked>
        <label class="btn btn-light ico-tool" for="ico-align-left"><i class="bi bi-text-left" aria-hidden="true"></i><span class="visually-hidden">Align left</span></label>
        <input type="radio" class="btn-check" name="ico-align" id="ico-align-center" autocomplete="off">
        <label class="btn btn-light ico-tool" for="ico-align-center"><i class="bi bi-text-center" aria-hidden="true"></i><span class="visually-hidden">Align center</span></label>
        <input type="radio" class="btn-check" name="ico-align" id="ico-align-right" autocomplete="off">
        <label class="btn btn-light ico-tool" for="ico-align-right"><i class="bi bi-text-right" aria-hidden="true"></i><span class="visually-hidden">Align right</span></label>
      </div>
      <div class="btn-group" role="group" aria-label="Insert">
        <button type="button" class="btn btn-light ico-tool" aria-label="Insert link"><i class="bi bi-link-45deg" aria-hidden="true"></i></button>
        <button type="button" class="btn btn-light ico-tool" aria-label="Insert image"><i class="bi bi-image" aria-hidden="true"></i></button>
        <button type="button" class="btn btn-light ico-tool" aria-label="Bulleted list"><i class="bi bi-list-ul" aria-hidden="true"></i></button>
      </div>
    </div>
  </div>
  <div class="card-body">
    <p class="ico-draft mb-0">Our spring menu lands on Friday. Expect wild garlic, smoked trout and a rhubarb tart that already has a waiting list.</p>
  </div>
</div>

Favorite and save toggles

  • bi-heart / bi-heart-fill
  • aria-pressed
  • card
  • classList.replace

Click the heart or the bookmark.

The outline icon means off and its -fill twin means on. A few lines of JS flip aria-pressed and swap bi-heart for bi-heart-fill (and bi-bookmark for bi-bookmark-fill), while the button keeps a fixed aria-label so screen readers announce the pressed state.

View code
<article class="card ico-place border-0 shadow-sm">
  <div class="position-relative">
    <img src="canal-houses.webp" class="card-img-top" width="800" height="600" alt="Brick houses with wooden balconies along a canal, small boats moored at the water">
    <button type="button" class="btn ico-fav position-absolute top-0 end-0 m-3" aria-pressed="false" aria-label="Add to favorites" data-ico-off="bi-heart" data-ico-on="bi-heart-fill"><i class="bi bi-heart" aria-hidden="true"></i></button>
  </div>
  <div class="card-body d-flex justify-content-between align-items-start gap-3">
    <div>
      <h3 class="h6 mb-1">Canal loft with balcony</h3>
      <p class="small text-body-secondary mb-0"><i class="bi bi-geo-alt-fill me-1" aria-hidden="true"></i>Old Town, 2 guests</p>
      <p class="small mb-0 mt-1"><i class="bi bi-star-fill text-warning me-1" aria-hidden="true"></i>4.92<span class="text-body-secondary"> (318 reviews)</span></p>
    </div>
    <button type="button" class="btn ico-save" aria-pressed="false" aria-label="Save for later" data-ico-off="bi-bookmark" data-ico-on="bi-bookmark-fill"><i class="bi bi-bookmark" aria-hidden="true"></i></button>
  </div>
</article>

Media player controls

  • bi-play-fill / bi-pause-fill
  • data-bs-toggle="button"
  • progress
  • dark mode

Press play, shuffle or repeat.

The play button swaps bi-play-fill for bi-pause-fill and updates its aria-label, since play and pause are different actions. Shuffle and repeat are plain on/off toggles, so they use the Bootstrap button plugin and aria-pressed. The card follows data-bs-theme="dark" through the body color variables.

View code
<div class="card ico-player border-0">
  <div class="card-body p-4">
    <div class="d-flex align-items-center gap-3 mb-4">
      <img src="jellyfish.webp" class="ico-cover rounded-3" width="800" height="600" alt="Orange jellyfish drifting in deep blue water">
      <div class="min-w-0">
        <h3 class="h6 mb-1 text-truncate">Slow Current</h3>
        <p class="small text-body-secondary mb-0 text-truncate">Tidepool Radio, Episode 41</p>
      </div>
    </div>
    <div class="progress ico-track mb-2" role="progressbar" aria-label="Playback position" aria-valuenow="38" aria-valuemin="0" aria-valuemax="100">
      <div class="progress-bar" style="width: 38%"></div>
    </div>
    <div class="d-flex justify-content-between small text-body-secondary mb-3"><span>12:06</span><span>31:40</span></div>
    <div class="d-flex align-items-center justify-content-between">
      <button type="button" class="btn ico-ctl" data-bs-toggle="button" aria-pressed="false" aria-label="Shuffle"><i class="bi bi-shuffle" aria-hidden="true"></i></button>
      <button type="button" class="btn ico-ctl" aria-label="Previous episode"><i class="bi bi-skip-start-fill" aria-hidden="true"></i></button>
      <button type="button" class="btn ico-play" aria-label="Play"><i class="bi bi-play-fill" aria-hidden="true"></i></button>
      <button type="button" class="btn ico-ctl" aria-label="Next episode"><i class="bi bi-skip-end-fill" aria-hidden="true"></i></button>
      <button type="button" class="btn ico-ctl" data-bs-toggle="button" aria-pressed="false" aria-label="Repeat"><i class="bi bi-repeat" aria-hidden="true"></i></button>
    </div>
  </div>
</div>

Navigation with icons

Sidebars, tab bars and a notification bell. The icon stays decorative and the link or button carries the accessible name.

Collapsible app sidebar

  • nav-pills
  • flex-column
  • badge
  • aria-expanded

Click the collapse button at the top.

A vertical nav-pills menu with an icon before every label and a badge on Inbox. The toggle collapses it into an icon rail: the labels move into a visually-hidden style, so each link keeps its name, and aria-expanded reports the state. Colors come from the --bs-nav-pills-* and --bs-nav-link-* variables.

View code
<nav class="ico-side card border-0 shadow-sm" aria-label="Workspace">
  <div class="d-flex align-items-center justify-content-between px-3 pt-3 pb-2">
    <span class="ico-brand fw-semibold ico-label">Larkspur</span>
    <button type="button" class="btn ico-collapse" aria-expanded="true" aria-controls="ico-side-menu" aria-label="Collapse sidebar"><i class="bi bi-layout-sidebar-inset" aria-hidden="true"></i></button>
  </div>
  <ul class="nav nav-pills flex-column gap-1 p-2" id="ico-side-menu">
    <li class="nav-item"><a class="nav-link active" aria-current="page" href="#"><i class="bi bi-speedometer2" aria-hidden="true"></i><span class="ico-label">Dashboard</span></a></li>
    <li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-inbox" aria-hidden="true"></i><span class="ico-label">Inbox</span><span class="badge rounded-pill ms-auto ico-label">12<span class="visually-hidden"> unread</span></span></a></li>
    <li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-kanban" aria-hidden="true"></i><span class="ico-label">Projects</span></a></li>
    <li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-calendar3" aria-hidden="true"></i><span class="ico-label">Calendar</span></a></li>
    <li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-people" aria-hidden="true"></i><span class="ico-label">Team</span></a></li>
    <li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-bar-chart-line" aria-hidden="true"></i><span class="ico-label">Reports</span></a></li>
    <li class="nav-item mt-2 pt-2 border-top"><a class="nav-link" href="#"><i class="bi bi-gear" aria-hidden="true"></i><span class="ico-label">Settings</span></a></li>
  </ul>
</nav>

Mobile tab bar with filled active icon

  • nav nav-fill
  • aria-current
  • outline / -fill pairs

Tap another tab.

An app-style bottom bar built on nav-fill so the four tabs share the width. The active tab shows the -fill version of its icon and carries aria-current="page", the inactive tabs show the outline, which is the same convention iOS and Android tab bars follow. The JS only moves the active state.

View code
<div class="ico-phone">
  <div class="ico-screen">
    <p class="small text-body-secondary mb-1">Good morning, Ines</p>
    <h3 class="h5 mb-3">3 trails near you</h3>
    <div class="ico-skeleton mb-2"></div>
    <div class="ico-skeleton ico-skeleton-short"></div>
  </div>
  <nav class="ico-tabs" aria-label="Main">
    <ul class="nav nav-fill">
      <li class="nav-item"><a class="nav-link active" aria-current="page" href="#" data-ico="house"><i class="bi bi-house-fill" aria-hidden="true"></i><span>Home</span></a></li>
      <li class="nav-item"><a class="nav-link" href="#" data-ico="compass"><i class="bi bi-compass" aria-hidden="true"></i><span>Explore</span></a></li>
      <li class="nav-item"><a class="nav-link" href="#" data-ico="bookmark"><i class="bi bi-bookmark" aria-hidden="true"></i><span>Saved</span></a></li>
      <li class="nav-item"><a class="nav-link" href="#" data-ico="person"><i class="bi bi-person" aria-hidden="true"></i><span>Profile</span></a></li>
    </ul>
  </nav>
</div>

Notification bell with count

  • dropdown
  • badge
  • position-absolute
  • translate-middle
  • list-group

Open the bell, then mark all as read.

The bell is an icon-only dropdown toggle with aria-label, and the count is the Bootstrap positioned badge (position-absolute, top-0 start-100, translate-middle) with visually-hidden text. Mark all as read removes the badge and swaps bi-bell-fill for bi-bell, so the icon itself shows that nothing is waiting.

View code
<div class="ico-topbar card border-0 shadow-sm">
  <div class="card-body d-flex align-items-center justify-content-between py-2">
    <span class="fw-semibold">Pinecrest Admin</span>
    <div class="dropdown">
      <button type="button" class="btn ico-bell position-relative" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="false" aria-label="Notifications">
        <i class="bi bi-bell-fill" aria-hidden="true"></i>
        <span class="ico-count position-absolute top-0 start-100 translate-middle badge rounded-pill">3<span class="visually-hidden"> unread notifications</span></span>
      </button>
      <div class="dropdown-menu dropdown-menu-end p-0 ico-panel">
        <div class="d-flex justify-content-between align-items-center px-3 py-2 border-bottom">
          <strong class="small">Notifications</strong>
          <button type="button" class="btn btn-link btn-sm p-0 ico-read">Mark all as read</button>
        </div>
        <div class="list-group list-group-flush">
          <a href="#" class="list-group-item list-group-item-action d-flex gap-3 py-3 ico-unread"><i class="bi bi-cart-check text-success fs-5" aria-hidden="true"></i><span class="small"><strong>New order #5531</strong><br><span class="text-body-secondary">Two items, paid by card</span></span></a>
          <a href="#" class="list-group-item list-group-item-action d-flex gap-3 py-3 ico-unread"><i class="bi bi-chat-dots text-primary fs-5" aria-hidden="true"></i><span class="small"><strong>Maya replied</strong><br><span class="text-body-secondary">Sounds good, ship Monday</span></span></a>
          <a href="#" class="list-group-item list-group-item-action d-flex gap-3 py-3 ico-unread"><i class="bi bi-exclamation-triangle text-warning-emphasis fs-5" aria-hidden="true"></i><span class="small"><strong>Low stock</strong><br><span class="text-body-secondary">Linen apron, 4 left</span></span></a>
        </div>
      </div>
    </div>
  </div>
</div>

Cards, lists, alerts and forms

Icons doing everyday UI work: stat tiles, plan feature lists, alert status, input groups and a setup checklist.

Dashboard stat cards

  • row-cols-*
  • bg-*-subtle
  • text-*-emphasis
  • badge

Each KPI card pairs a tinted icon tile (bg-*-subtle with text-*-emphasis, both 5.3 color utilities that adapt to dark mode) with the figure and a trend badge. The trend icons repeat what the text says, so they stay aria-hidden. The only custom CSS is the square tile.

View code
<div class="ico-stats w-100">
  <div class="row row-cols-1 row-cols-sm-2 row-cols-md-4 g-3">
    <div class="col"><div class="card h-100 border-0 shadow-sm"><div class="card-body">
      <span class="ico-tile bg-primary-subtle text-primary-emphasis mb-3"><i class="bi bi-cash-stack" aria-hidden="true"></i></span>
      <p class="small text-body-secondary mb-1">Revenue</p>
      <p class="h4 mb-2">$48,210</p>
      <span class="badge bg-success-subtle text-success-emphasis"><i class="bi bi-arrow-up-right me-1" aria-hidden="true"></i>12.4% vs last month</span>
    </div></div></div>
    <div class="col"><div class="card h-100 border-0 shadow-sm"><div class="card-body">
      <span class="ico-tile bg-success-subtle text-success-emphasis mb-3"><i class="bi bi-people-fill" aria-hidden="true"></i></span>
      <p class="small text-body-secondary mb-1">New customers</p>
      <p class="h4 mb-2">1,284</p>
      <span class="badge bg-success-subtle text-success-emphasis"><i class="bi bi-arrow-up-right me-1" aria-hidden="true"></i>8.1% vs last month</span>
    </div></div></div>
    <div class="col"><div class="card h-100 border-0 shadow-sm"><div class="card-body">
      <span class="ico-tile bg-warning-subtle text-warning-emphasis mb-3"><i class="bi bi-arrow-counterclockwise" aria-hidden="true"></i></span>
      <p class="small text-body-secondary mb-1">Refunds</p>
      <p class="h4 mb-2">37</p>
      <span class="badge bg-danger-subtle text-danger-emphasis"><i class="bi bi-arrow-up-right me-1" aria-hidden="true"></i>3 more than last month</span>
    </div></div></div>
    <div class="col"><div class="card h-100 border-0 shadow-sm"><div class="card-body">
      <span class="ico-tile bg-info-subtle text-info-emphasis mb-3"><i class="bi bi-clock-history" aria-hidden="true"></i></span>
      <p class="small text-body-secondary mb-1">Avg. reply time</p>
      <p class="h4 mb-2">2h 14m</p>
      <span class="badge bg-success-subtle text-success-emphasis"><i class="bi bi-arrow-down-right me-1" aria-hidden="true"></i>18 min faster</span>
    </div></div></div>
  </div>
</div>

Plan cards with icon checklists

  • list-unstyled
  • d-flex gap-2
  • visually-hidden
  • --bs-card-* variables

Feature lists use bi-check2-circle for included items and bi-dash-circle for missing ones, each followed by visually-hidden Included or Not included text, because a color and a glyph alone do not tell a screen reader anything. The featured plan is re-themed through --bs-card-bg, --bs-card-color and --bs-card-border-color.

View code
<div class="row row-cols-1 row-cols-md-2 g-3 ico-plans w-100">
  <div class="col">
    <div class="card h-100 ico-plan">
      <div class="card-body p-4">
        <h3 class="h5 mb-1">Studio</h3>
        <p class="mb-3"><span class="h3">$12</span><span class="text-body-secondary"> per seat / month</span></p>
        <ul class="list-unstyled mb-4 ico-feats">
          <li><i class="bi bi-check2-circle ico-yes" aria-hidden="true"></i><span class="visually-hidden">Included:</span> 20 client projects</li>
          <li><i class="bi bi-check2-circle ico-yes" aria-hidden="true"></i><span class="visually-hidden">Included:</span> Shared asset library</li>
          <li><i class="bi bi-check2-circle ico-yes" aria-hidden="true"></i><span class="visually-hidden">Included:</span> Comment threads</li>
          <li class="ico-off"><i class="bi bi-dash-circle" aria-hidden="true"></i><span class="visually-hidden">Not included:</span> Custom domains</li>
          <li class="ico-off"><i class="bi bi-dash-circle" aria-hidden="true"></i><span class="visually-hidden">Not included:</span> SSO and audit log</li>
        </ul>
        <button type="button" class="btn btn-outline-dark w-100 py-2">Start free trial</button>
      </div>
    </div>
  </div>
  <div class="col">
    <div class="card h-100 ico-plan ico-plan-pro">
      <div class="card-body p-4">
        <h3 class="h5 mb-1">Agency <span class="badge ico-pop-badge align-middle ms-1"><i class="bi bi-star-fill me-1" aria-hidden="true"></i>Popular</span></h3>
        <p class="mb-3"><span class="h3">$29</span><span class="ico-muted"> per seat / month</span></p>
        <ul class="list-unstyled mb-4 ico-feats">
          <li><i class="bi bi-check2-circle ico-yes" aria-hidden="true"></i><span class="visually-hidden">Included:</span> Unlimited projects</li>
          <li><i class="bi bi-check2-circle ico-yes" aria-hidden="true"></i><span class="visually-hidden">Included:</span> Shared asset library</li>
          <li><i class="bi bi-check2-circle ico-yes" aria-hidden="true"></i><span class="visually-hidden">Included:</span> Comment threads</li>
          <li><i class="bi bi-check2-circle ico-yes" aria-hidden="true"></i><span class="visually-hidden">Included:</span> Custom domains</li>
          <li><i class="bi bi-check2-circle ico-yes" aria-hidden="true"></i><span class="visually-hidden">Included:</span> SSO and audit log</li>
        </ul>
        <button type="button" class="btn ico-btn-lime w-100 py-2">Choose Agency</button>
      </div>
    </div>
  </div>
</div>

Status alerts with icons

  • alert
  • alert-dismissible
  • d-flex
  • flex-shrink-0

Each alert variant gets its own glyph (check, info, warning, octagon) in a d-flex row, following the alert-with-icon pattern from the Bootstrap docs. The heading word carries the meaning, so the icon is aria-hidden and color is never the only signal. The last alert uses alert-dismissible with the standard btn-close.

View code
<div class="ico-alerts w-100">
  <div class="alert alert-success d-flex gap-3 align-items-start" role="status">
    <i class="bi bi-check-circle-fill flex-shrink-0 fs-5" aria-hidden="true"></i>
    <div><strong>Payment received.</strong> Invoice INV-2048 is marked as paid.</div>
  </div>
  <div class="alert alert-info d-flex gap-3 align-items-start" role="status">
    <i class="bi bi-info-circle-fill flex-shrink-0 fs-5" aria-hidden="true"></i>
    <div><strong>Scheduled maintenance.</strong> Exports pause on Sunday from 02:00 to 03:00 UTC.</div>
  </div>
  <div class="alert alert-warning d-flex gap-3 align-items-start" role="status">
    <i class="bi bi-exclamation-triangle-fill flex-shrink-0 fs-5" aria-hidden="true"></i>
    <div><strong>Card expires soon.</strong> Update billing details before 30 November.</div>
  </div>
  <div class="alert alert-danger alert-dismissible fade show d-flex gap-3 align-items-start mb-0" role="alert">
    <i class="bi bi-x-octagon-fill flex-shrink-0 fs-5" aria-hidden="true"></i>
    <div><strong>Sync failed.</strong> We could not reach the calendar. Try again in a minute.</div>
    <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
  </div>
</div>

Input groups with icons

  • input-group
  • input-group-text
  • form-label
  • aria-pressed

Click the eye button.

Icons sit in input-group-text addons, so Bootstrap keeps the border, radius and height aligned with the field, and every field still has a real label. The eye button toggles the password field and swaps bi-eye for bi-eye-slash, with aria-pressed and a fixed aria-label of Show password.

View code
<form class="ico-form card border-0 shadow-sm p-4" novalidate>
  <h3 class="h5 mb-3">Sign in to Fernway</h3>
  <label for="ico-email" class="form-label">Email</label>
  <div class="input-group mb-3">
    <span class="input-group-text"><i class="bi bi-envelope" aria-hidden="true"></i></span>
    <input type="email" class="form-control" id="ico-email" placeholder="name@example.com" autocomplete="email">
  </div>
  <label for="ico-pass" class="form-label">Password</label>
  <div class="input-group mb-3">
    <span class="input-group-text"><i class="bi bi-lock" aria-hidden="true"></i></span>
    <input type="password" class="form-control" id="ico-pass" value="lantern-orbit" autocomplete="current-password">
    <button type="button" class="btn btn-outline-secondary ico-reveal" aria-pressed="false" aria-label="Show password" aria-controls="ico-pass"><i class="bi bi-eye" aria-hidden="true"></i></button>
  </div>
  <label for="ico-amount" class="form-label">Monthly budget</label>
  <div class="input-group mb-4">
    <span class="input-group-text"><i class="bi bi-currency-dollar" aria-hidden="true"></i></span>
    <input type="number" class="form-control" id="ico-amount" value="1200" min="0">
    <span class="input-group-text">USD</span>
  </div>
  <button type="submit" class="btn ico-btn-forest w-100 py-2"><i class="bi bi-box-arrow-in-right me-2" aria-hidden="true"></i>Sign in</button>
</form>

Setup checklist with progress

  • list-group
  • progress
  • bi-circle / bi-check-circle-fill
  • aria-pressed

Click a task to mark it done.

Each task is a list-group button with aria-pressed. Done tasks swap bi-circle for bi-check-circle-fill and the progress bar width and aria-valuenow follow. It is the outline-versus-fill idea again, this time as a task state.

View code
<div class="card border-0 shadow-sm ico-setup">
  <div class="card-body p-4">
    <h3 class="h5 mb-1">Set up your shop</h3>
    <p class="small text-body-secondary mb-2"><span class="ico-done-count">2</span> of 5 steps done</p>
    <div class="progress mb-3 ico-setup-bar" role="progressbar" aria-label="Setup progress" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100">
      <div class="progress-bar" style="width: 40%"></div>
    </div>
    <div class="list-group ico-tasks">
      <button type="button" class="list-group-item list-group-item-action d-flex gap-3 align-items-center" aria-pressed="true"><i class="bi bi-check-circle-fill" aria-hidden="true"></i><span>Add your logo and colors</span></button>
      <button type="button" class="list-group-item list-group-item-action d-flex gap-3 align-items-center" aria-pressed="true"><i class="bi bi-check-circle-fill" aria-hidden="true"></i><span>Create your first product</span></button>
      <button type="button" class="list-group-item list-group-item-action d-flex gap-3 align-items-center ico-task-next" aria-pressed="false"><i class="bi bi-circle" aria-hidden="true"></i><span>Connect a payment provider</span></button>
      <button type="button" class="list-group-item list-group-item-action d-flex gap-3 align-items-center" aria-pressed="false"><i class="bi bi-circle" aria-hidden="true"></i><span>Set shipping zones</span></button>
      <button type="button" class="list-group-item list-group-item-action d-flex gap-3 align-items-center" aria-pressed="false"><i class="bi bi-circle" aria-hidden="true"></i><span>Publish the storefront</span></button>
    </div>
  </div>
</div>

Size, color, motion and inline SVG

How far the font classes go with font-size, color utilities and CSS variables, plus a reduced-motion safe spinner, layered two-tone icons and a pasted inline SVG.

Sizing and coloring

  • fs-1 to fs-6
  • text-* utilities
  • font-size
  • CSS custom properties

Font icons are text, so the fs-* utilities size them and the text-* utilities color them. The bottom row sets one custom property, --ico-accent, on the wrapper and every icon picks it up through color, which is how you theme a whole icon set with a single variable.

View code
<div class="card border-0 shadow-sm ico-kit">
  <div class="card-body p-4">
    <h3 class="h6 mb-3">Size with fs-6 to fs-1</h3>
    <div class="d-flex flex-wrap align-items-end gap-3 mb-4 text-body-emphasis">
      <i class="bi bi-lightning-charge-fill fs-6" aria-hidden="true"></i>
      <i class="bi bi-lightning-charge-fill fs-5" aria-hidden="true"></i>
      <i class="bi bi-lightning-charge-fill fs-4" aria-hidden="true"></i>
      <i class="bi bi-lightning-charge-fill fs-3" aria-hidden="true"></i>
      <i class="bi bi-lightning-charge-fill fs-2" aria-hidden="true"></i>
      <i class="bi bi-lightning-charge-fill fs-1" aria-hidden="true"></i>
      <i class="bi bi-lightning-charge-fill ico-huge" aria-hidden="true"></i>
    </div>
    <h3 class="h6 mb-3">Color with text-* utilities</h3>
    <div class="d-flex flex-wrap gap-3 fs-3 mb-4">
      <i class="bi bi-shield-check text-primary" aria-hidden="true"></i>
      <i class="bi bi-check-circle-fill text-success" aria-hidden="true"></i>
      <i class="bi bi-exclamation-triangle-fill text-warning-emphasis" aria-hidden="true"></i>
      <i class="bi bi-x-octagon-fill text-danger" aria-hidden="true"></i>
      <i class="bi bi-info-circle-fill text-info-emphasis" aria-hidden="true"></i>
      <i class="bi bi-moon-stars-fill text-body-secondary" aria-hidden="true"></i>
    </div>
    <h3 class="h6 mb-3">Theme with one variable</h3>
    <div class="d-flex flex-wrap gap-2">
      <div class="ico-swatch" style="--ico-accent: #c2410c"><i class="bi bi-palette-fill" aria-hidden="true"></i><i class="bi bi-brush-fill" aria-hidden="true"></i><i class="bi bi-vector-pen" aria-hidden="true"></i></div>
      <div class="ico-swatch" style="--ico-accent: #0f766e"><i class="bi bi-palette-fill" aria-hidden="true"></i><i class="bi bi-brush-fill" aria-hidden="true"></i><i class="bi bi-vector-pen" aria-hidden="true"></i></div>
      <div class="ico-swatch" style="--ico-accent: #6d28d9"><i class="bi bi-palette-fill" aria-hidden="true"></i><i class="bi bi-brush-fill" aria-hidden="true"></i><i class="bi bi-vector-pen" aria-hidden="true"></i></div>
    </div>
  </div>
</div>

Rotating sync icon

  • display: inline-block
  • @keyframes
  • prefers-reduced-motion
  • aria-live

Click Sync now.

The i element is inline, so it needs display: inline-block before a transform can rotate it. The spin keyframes only run inside prefers-reduced-motion: no-preference, the button is disabled while busy, and an aria-live status line announces the result. When the sync finishes, bi-arrow-repeat becomes bi-check2-circle.

View code
<div class="card border-0 shadow-sm ico-sync">
  <div class="card-body p-4 d-flex flex-column flex-sm-row gap-3 align-items-sm-center justify-content-between">
    <div class="d-flex gap-3 align-items-center">
      <span class="ico-sync-tile"><i class="bi bi-calendar2-check" aria-hidden="true"></i></span>
      <div>
        <h3 class="h6 mb-1">Team calendar</h3>
        <p class="small text-body-secondary mb-0 ico-sync-status" aria-live="polite">Last synced 2 hours ago</p>
      </div>
    </div>
    <button type="button" class="btn ico-sync-btn"><i class="bi bi-arrow-repeat me-2" aria-hidden="true"></i><span>Sync now</span></button>
  </div>
</div>

Layered two-tone icons

  • CSS grid stacking
  • position-absolute
  • bi-*-fill under outline
  • border-light

A font glyph takes one color, so two-tone icons here are two glyphs stacked in the same grid cell: a tinted -fill shape under its darker outline, or a solid shape under a white symbol. The status dot on the avatar is Bootstrap positioning (position-absolute, translate-middle, border-light) with visually-hidden text.

View code
<div class="card border-0 shadow-sm ico-layers">
  <div class="card-body p-4">
    <div class="d-flex flex-wrap gap-4 justify-content-center">
      <figure class="ico-cell">
        <span class="ico-stack ico-duo-blue" aria-hidden="true"><i class="bi bi-shield-fill"></i><i class="bi bi-shield-check"></i></span>
        <figcaption>Protected</figcaption>
      </figure>
      <figure class="ico-cell">
        <span class="ico-stack ico-duo-amber" aria-hidden="true"><i class="bi bi-lightbulb-fill"></i><i class="bi bi-lightbulb"></i></span>
        <figcaption>Ideas</figcaption>
      </figure>
      <figure class="ico-cell">
        <span class="ico-stack ico-badge-teal" aria-hidden="true"><i class="bi bi-square-fill"></i><i class="bi bi-cloud-arrow-up-fill ico-front"></i></span>
        <figcaption>Upload</figcaption>
      </figure>
      <figure class="ico-cell">
        <span class="ico-stack ico-badge-rose" aria-hidden="true"><i class="bi bi-circle-fill"></i><i class="bi bi-mic-mute-fill ico-front"></i></span>
        <figcaption>Muted</figcaption>
      </figure>
      <figure class="ico-cell">
        <span class="position-relative d-inline-block">
          <i class="bi bi-person-circle ico-avatar" aria-hidden="true"></i>
          <span class="position-absolute bottom-0 end-0 p-2 bg-success border border-3 border-light rounded-circle"><span class="visually-hidden">Online</span></span>
        </span>
        <figcaption>Status dot</figcaption>
      </figure>
    </div>
  </div>
</div>

Inline SVG on a dark stage

  • inline SVG
  • fill="currentColor"
  • data-bs-theme="dark"
  • toast markup

The rocket is the bi-rocket-takeoff SVG pasted from the icon page, with fill="currentColor" so it follows the text color, and one extra class on the flame path to color it separately, which the font cannot do. The xmlns attribute can be dropped for SVG inside HTML. The cloud row uses the font for comparison.

View code
<div class="card ico-deploy border-0">
  <div class="card-body p-4">
    <div class="d-flex gap-3 align-items-start mb-3">
      <svg class="ico-rocket flex-shrink-0" width="48" height="48" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true" focusable="false">
        <path d="M9.752 6.193c.599.6 1.73.437 2.528-.362s.96-1.932.362-2.531c-.599-.6-1.73-.438-2.528.361-.798.8-.96 1.933-.362 2.532"/>
        <path d="M15.811 3.312c-.363 1.534-1.334 3.626-3.64 6.218l-.24 2.408a2.56 2.56 0 0 1-.732 1.526L8.817 15.85a.51.51 0 0 1-.867-.434l.27-1.899c.04-.28-.013-.593-.131-.956a9 9 0 0 0-.249-.657l-.082-.202c-.815-.197-1.578-.662-2.191-1.277-.614-.615-1.079-1.379-1.275-2.195l-.203-.083a10 10 0 0 0-.655-.248c-.363-.119-.675-.172-.955-.132l-1.896.27A.51.51 0 0 1 .15 7.17l2.382-2.386c.41-.41.947-.67 1.524-.734h.006l2.4-.238C9.005 1.55 11.087.582 12.623.208c.89-.217 1.59-.232 2.08-.188.244.023.435.06.57.093q.1.026.16.045c.184.06.279.13.351.295l.029.073a3.5 3.5 0 0 1 .157.721c.055.485.051 1.178-.159 2.065m-4.828 7.475.04-.04-.107 1.081a1.54 1.54 0 0 1-.44.913l-1.298 1.3.054-.38c.072-.506-.034-.993-.172-1.418a9 9 0 0 0-.164-.45c.738-.065 1.462-.38 2.087-1.006M5.205 5c-.625.626-.94 1.351-1.004 2.09a9 9 0 0 0-.45-.164c-.424-.138-.91-.244-1.416-.172l-.38.054 1.3-1.3c.245-.246.566-.401.91-.44l1.08-.107zm9.406-3.961c-.38-.034-.967-.027-1.746.163-1.558.38-3.917 1.496-6.937 4.521-.62.62-.799 1.34-.687 2.051.107.676.483 1.362 1.048 1.928.564.565 1.25.941 1.924 1.049.71.112 1.429-.067 2.048-.688 3.079-3.083 4.192-5.444 4.556-6.987.183-.771.18-1.345.138-1.713a3 3 0 0 0-.045-.283 3 3 0 0 0-.3-.041Z"/>
        <path class="ico-flame" d="M7.009 12.139a7.6 7.6 0 0 1-1.804-1.352A7.6 7.6 0 0 1 3.794 8.86c-1.102.992-1.965 5.054-1.839 5.18.125.126 3.936-.896 5.054-1.902Z"/>
      </svg>
      <div>
        <h3 class="h5 mb-1">Deploy finished</h3>
        <p class="mb-0 ico-sub">storefront-web went live in 48 seconds.</p>
      </div>
    </div>
    <ul class="list-unstyled small mb-0 ico-steps">
      <li><i class="bi bi-check2 me-2" aria-hidden="true"></i>Build passed, 212 tests</li>
      <li><i class="bi bi-check2 me-2" aria-hidden="true"></i>Assets uploaded to edge cache</li>
      <li><i class="bi bi-cloud-check me-2" aria-hidden="true"></i>Health check green in 3 regions</li>
    </ul>
  </div>
</div>

What Are Bootstrap Icons?

The library comes out of the Bootstrap project but installs separately from the Bootstrap CSS and JavaScript bundle. A project that skips the Bootstrap framework can still use every icon.

Every icon is a flat SVG file drawn on a 16 by 16 pixel grid, with fill and no stroke, according to the twbs/icons README.

The package includes one SVG file per icon, which suits inline markup or the img tag. It also includes bootstrap-icons.svg, a sprite that packs every icon into a single file you reference with use. Then there’s the font side: WOFF and WOFF2 files plus CSS and Sass, all driven by bi classes.

The MIT license covers all of it. Commercial use, modification and redistribution are fine as long as the copyright and license notice stay with the copy.

The README lists @mdo as author, the GitHub handle of Bootstrap co-creator Mark Otto. It also says new icons are typically added only by him, though exceptions can be made.

For the record, icons.getbootstrap.com shows 2,078 icons at version 1.13.2 (October 2026), and the twbs/icons README confirms the MIT license and that 16 by 16 grid with flat fill and no stroke.

Icon counts differ from page to page. The README says over 2,000. PW Skills still cites over 1,300 beside a 1.7.2 CDN link, and Hyring says more than 1,900 beside a 1.11.3 link.

The gap comes from release age. Tutorials written against older versions understate what the library holds today.

How to Install Bootstrap Icons

You can pull the library in from the jsDelivr CDN, a release ZIP, npm or Composer. They all deliver the same files, so the choice depends on your build setup and has nothing to do with features.

CDN link and release download

The CDN route is one line in the head of the page.

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.2/font/bootstrap-icons.min.css">

Keep the version number in the URL. Without it, jsDelivr serves the newest release, and a later update changes what your page loads.

The release archive from GitHub holds the SVGs, fonts, sprite, license and README, per the install section of the icons.getbootstrap.com usage page. Unzip it into the project and link the local stylesheet. The fonts folder has to stay beside the CSS file.

npm and Composer

Bundler projects usually go with npm i bootstrap-icons. PHP projects can run composer require twbs/bootstrap-icons, since the package is published on Packagist.

Either one installs the full package, meaning individual SVGs, the sprite, icon fonts, CSS and Sass (twbs/icons README).

It breaks when your Sass compiler can’t resolve the font URLs inside the package. Set the font directory before the import and it goes away.

$bootstrap-icons-font-dir: "bootstrap-icons/font/fonts";
  @import "bootstrap-icons/font/bootstrap-icons";

The 1.13.0 release notes also record a docs update for relative path issues in Vite and Parcel.

For a prototype, the CDN link is plenty. Once the project is headed to production, I’d install through npm or Composer and serve the files from your own origin. That drops a third-party request and also satisfies the sprite’s same-origin rule.

Icon Font, Inline SVG, SVG Sprite or img Tag: Which Method to Use

Use inline SVG or the sprite when a page shows a handful of icons. Use the icon font when icons are scattered across many templates and you can’t edit the markup of each one.

MethodLoad costStrengthDrawback
Icon fontWhole set loadsOne link, one classSingle color per glyph
Inline SVGOnly icons usedcurrentColor styling, no extra requestMarkup repeats per use
SVG spriteOne file, every iconOne request, reusable with useSame origin only
img tagOne request per iconPlain, cacheable markupPage CSS color does not apply

Pasting an icon’s SVG markup into your HTML is the inline route. The paths sit right in the page, and currentColor picks up the surrounding text color.

What the icon font costs to load

jsDelivr’s package index for version 1.13.2 lists the minified stylesheet at 87,008 bytes and the WOFF2 file at 134,012 bytes.

That’s about 221 KB of files before transfer compression, and it loads whether the page shows 3 icons or 300. (WOFF2 is already compressed, so the CSS shrinks more in transit than the font does.)

Single files are far lighter. The index puts alarm.svg at 689 bytes and cup-hot.svg at 2,203 bytes.

The repository’s icon build script runs each SVG through SVGO, so the individual files already carry the benefits of SVG optimization.

The font is the quickest way to get started. It’s also the heaviest way to ship a page that uses five icons.

Where each method breaks

  • Every glyph in the icon font is one color, and if the font file fails to load, the icons disappear.
  • Inline SVG gets annoying when one icon changes, because you edit every copy of its markup.
  • The sprite should be served from the same origin as the page, since browser security restrictions can block external use references across domains, per the icons.getbootstrap.com sprite guide.
  • An SVG loaded through an img tag is treated as an image. It needs real alt text when it carries meaning and an empty alt when it’s decorative.

How to Add Bootstrap Icons to a Page

Load the stylesheet, then write an element with two classes: bi and bi- followed by the icon’s filename.

  1. Link bootstrap-icons.min.css in the head, from the CDN or from a local copy.
  2. Find the icon on icons.getbootstrap.com. The class is bi- plus the filename, so alarm becomes bi-alarm.
  3. Add the element, for example <i class="bi bi-alarm" aria-hidden="true"></i>
  4. Add spacing next to text with a Bootstrap utility such as me-2, or write a margin rule if Bootstrap is not loaded.
  5. Reload and confirm the glyph renders at the size of the surrounding text.

The bi class applies the shared icon-font styling, and the second class picks the glyph.

Some older tutorials show only bi-alarm without the base class. The current official usage page uses both, and the 1.11.4 release notes list a docs fix for font examples that were missing bi.

Inside a Bootstrap button, put the icon before the label and give it a margin.

<button type="button" class="btn btn-primary">
  <i class="bi bi-alarm me-2" aria-hidden="true"></i>Set alarm
    </button>

The same markup works in a nav link inside a Bootstrap navbar. An icon-only link needs its label on the link, for example aria-label="Search", and not on the icon.

Prefer the sprite? Then the same icon becomes an svg element with a use reference to a copy of the file on your own origin.

<svg class="bi" width="32" height="32" fill="currentColor" aria-hidden="true">
  <use href="/bootstrap-icons.svg#alarm"></use>
</svg>

With the font, all you write is one class. The sprite needs a copy of its file sitting on your server, which is also why the live examples on this page use the font and inline SVG: each one runs in a sandboxed frame with no file of its own to point use at.

How to Change Bootstrap Icon Size and Color

Set font-size to resize an icon and color to recolor it. The icon font and embedded SVGs both follow the surrounding text, so no icon-specific rule is needed.

.feature-icon {
  color: cornflowerblue;
  font-size: 2rem;
}

Size has a few controls. font-size scales font icons and any SVG sized at 1em, with rem units following the root and em units following the parent. Width and height attributes fix an SVG at a pixel size, and after that font-size stops affecting it. Bootstrap’s own utilities cover the rest, fs-1 through fs-6 for size and text-primary and its siblings for color.

Because the icon inherits text color, one hover rule on a button recolors the label and the icon together. A dark theme that changes the text color changes the icons too.

The color you pick still has to read against its background. The W3C’s WCAG 2.2 guidance for success criterion 1.4.11 sets a 3:1 color contrast ratio for graphics needed to understand content, and it exempts purely aesthetic ones.

The img route has a workaround, a CSS filter chain that approximates a target color. A CSS color filter generator works out the values, but the result is only an approximation, so inline SVG is the cleaner fix.

How to Make Bootstrap Icons Accessible

Hide decorative icons with aria-hidden="true" and put the accessible name on the control that holds the icon, not on the icon itself.

The Bootstrap Icons documentation draws the same line. Decorative icons stay hidden from assistive technology, and icon-only controls need a label. A meaningful standalone image needs a text alternative as well.

Icon next to visible text

The visible word already names the control, so the icon adds nothing for a screen reader.

<a href="/cart"><i class="bi bi-cart" aria-hidden="true"></i> Cart</a>

Visible text is the better choice wherever space allows, because it also helps users who don’t recognize an icon.

Icon-only controls

An aria-label on the button names it with no extra markup and no visible text. The other option is visually hidden text, a span with Bootstrap’s visually-hidden class, which stays available to screen readers.

<button type="button" aria-label="Mute">
  <i class="bi bi-volume-mute-fill" aria-hidden="true"></i>
</button>

<button type="button" class="btn btn-outline-secondary">
  <i class="bi bi-trash" aria-hidden="true"></i>
  <span class="visually-hidden">Delete</span>
</button>

The aria-label attribute comes from ARIA. A button with only an icon and no label has nothing to announce, which is the exact problem it solves.

Standalone SVG and img icons

A meaningful standalone SVG needs an accessible name. Through an img tag that means useful alt text, and a decorative img gets an empty alt.

Naming techniques for inline SVG, such as title elements, are covered in this guide to accessible SVG files.

Why Bootstrap Icons Are Not Showing

When icons go missing, the cause is usually a stylesheet or font file that returns an error, an icon newer than the pinned version, or a Content Security Policy that blocks the font.

The stylesheet or font file returns an error

You get empty space where the icon belongs. Open the Network tab and confirm the CSS and both font files return 200.

In the package, the CSS sits in font/ and the WOFF and WOFF2 files sit in font/fonts/, per jsDelivr’s package index for version 1.13.2. Move the CSS without the fonts folder and every glyph disappears.

The icon is newer than your pinned version

Release 1.12.0, titled The Bluesky Update, added one icon, Bluesky. A page pinned to 1.11.4 or older has no bi-bluesky, and the element renders empty.

On a CDN, raise the version number in the URL. With npm, update the package and rebuild.

A Content Security Policy blocks the font

MDN documents font-src as the directive that controls @font-face sources, falling back to default-src when absent. The icon font loads through @font-face, so a policy that omits the CDN origin blocks it.

Content-Security-Policy: style-src 'self' https://cdn.jsdelivr.net; font-src 'self' https://cdn.jsdelivr.net

Allow the CDN in both directives, or self-host the files and drop the third-party dependency.

Bootstrap Icons vs Font Awesome and Other Icon Sets

Stay with Bootstrap Icons when the project already runs Bootstrap and needs a free UI set. Switch when you need a larger library, adjustable weight, or a stroke style.

SetLicenseDeliveryDrawback
Font Awesome FreeCC BY 4.0 (icons), SIL OFL (fonts)Web font, SVGExtra styles require Pro
Material SymbolsApache 2.0Variable icon font, SVGDefault load includes every icon
HeroiconsMITSVG, React, VueNo new icons from contributors
Feather IconsMITSVG, sprite, JS replaceLine style only
Tabler IconsMITSVG, sprite, React, webfontPNG and PDF exports sit in a paid bundle

Where Bootstrap Icons falls short

  • Size is the obvious gap. Tabler Icons lists 6,257 icons on tabler.io.
  • Material Symbols exposes fill, weight, grade and optical size as variable font axes, per Google’s guide, and Bootstrap Icons has nothing like that.
  • Google’s guide puts the default Material Symbols font load, every icon, at 295 KB, and a three-icon subset at 1.7 KB through the icon_names parameter. Bootstrap Icons documents no matching option for its font, so trimming means inline SVG.
  • Font Awesome Free icons are CC BY 4.0, which requires attribution, and the extra styles sit behind Pro.
  • The Heroicons README accepts bug fixes only, with no new icons from contributors.

Google’s own guide gives two counts for Material Symbols, over 2,500 icons in the overview and 3,800+ in the subsetting section. Check the live library before quoting either.

Which set to pick

On a Bootstrap project that needs a free set of UI-sized icons, Bootstrap Icons is the obvious fit. A utility-class project is better served by Heroicons, from the makers of Tailwind CSS, which come with first-party React and Vue packages.

Material Symbols, subsetted, is the pick when you want variable weight or fill states. Tabler Icons makes sense if you need thousands of extra line icons.

Switching for style alone rarely pays off. Mixing two sets on one page adds a second payload and a second visual style.

Bootstrap Icons FAQ

Are Bootstrap Icons included when I install Bootstrap 5?

No. Bootstrap Icons installs as its own package, so loading the Bootstrap CSS bundle does not load the icon font.

Add the icon stylesheet or SVG files next to the framework.

How do I use Bootstrap Icons in React or Vue?

In React, install the community react-bootstrap-icons package and import each icon as a component.

In Vue, install bootstrap-icons and import bootstrap-icons/font/bootstrap-icons.css once in the entry file, then write bi classes as usual. The official documentation lists no first-party Vue component.

How can I find the right icon name?

Search on icons.getbootstrap.com. The box filters by name and by tags, so a synonym often works as well as the exact word.

The class is bi- plus the file name shown under each icon. Release 1.11.1 added a “gauge” tag to the speedometer icon, so tag coverage keeps growing.

What is the difference between filled and outline icons?

Filled icons carry a -fill suffix. bi-heart is the outline and bi-heart-fill is solid.

Swap one for the other to show a state change, such as liked and not liked.

Can I rotate or animate an icon?

Yes. The i element is inline by default, so give it display: inline-block before transform: rotate() takes effect.

Continuous motion needs a keyframes rule. For inline SVG, this guide on how to animate SVG with CSS covers the options.

Can one icon use more than one color?

Yes, with inline SVG. Give individual path elements their own classes and set a fill on each one.

A font glyph takes a single color, so per-path styling means switching the markup.

How do I put an icon inside an input field?

Wrap the field in a Bootstrap input-group. Place the icon in an input-group-text span beside the control.

The Bootstrap input classes keep the border and height aligned, and the icon needs aria-hidden="true" when a label already names the field.

Pinning and Trimming Bootstrap Icons as a Project Grows

Bootstrap Icons stays dependable as a project grows if you pin the version first, settle on a delivery method second, and cut unused icons last. Pin the exact version in the CDN URL or package file, stick to one delivery method per project, and remove any icon the pages never call.

Pinning comes first because it costs one edit and makes every later change reproducible. Trimming comes last because it needs the final list of icons in use.

The downside is manual upkeep. A pinned build gets no new icons or fixes until someone raises the version number, so that bump belongs on the checklist for each release.