Bootstrap Footer: 16 Examples, From Minimal to Multi-Column

Open the Bootstrap 5.3 documentation (v5.3.8) and go looking for a footer. There isn't one. The docs index 24 components, and none of them is a footer, so you build it from container, grid, flex and utility classes.

Below are 16 Bootstrap footer examples you can copy, followed by a guide to grid layouts, sticky footers, dark mode, footer content and accessibility.

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>

Footer layouts with the grid

Four layouts most sites need: a multi-column link footer, a one-line footer, a centered footer with social links and the sticky footer pattern that holds the bar at the bottom of short pages.

SaaS footer with link columns

  • row gy-4
  • col-6 col-md-2
  • nav aria-label

A brand column with col-md-4 and four link groups with col-6 col-md-2 add up to 12, so the groups sit two per row on phones and five columns share the row from md up. Each group is a nav with its own aria-label, gy-4 keeps stacked columns apart, and a border-top strip holds the copyright and legal links.

View code
<footer class="bft-saas border-top bg-body-tertiary">
  <div class="container py-5">
    <div class="row gy-4">
      <div class="col-md-4">
        <a class="d-inline-flex align-items-center gap-2 fw-semibold fs-5 link-body-emphasis text-decoration-none" href="#">
          <svg width="28" height="28" viewBox="0 0 28 28" aria-hidden="true"><rect width="28" height="28" rx="7" fill="#4338ca"/><path d="M8 18V10l6 5 6-5v8" fill="none" stroke="#fff" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
          Mailroute
        </a>
        <p class="text-body-secondary small mt-3 mb-3 pe-md-4">Transactional email for product teams. Templates, logs and webhooks in one place.</p>
        <a class="bft-saas-status d-inline-flex align-items-center gap-2 small text-decoration-none" href="#">
          <span class="bft-saas-dot" aria-hidden="true"></span>All systems operational
        </a>
      </div>
      <nav class="col-6 col-md-2" aria-label="Product">
        <h2 class="h6 fw-semibold">Product</h2>
        <ul class="list-unstyled small mb-0">
          <li class="mb-2"><a class="link-secondary text-decoration-none" href="#">Features</a></li>
          <li class="mb-2"><a class="link-secondary text-decoration-none" href="#">Pricing</a></li>
          <li class="mb-2"><a class="link-secondary text-decoration-none" href="#">Templates</a></li>
          <li><a class="link-secondary text-decoration-none" href="#">Changelog</a></li>
        </ul>
      </nav>
      <nav class="col-6 col-md-2" aria-label="Developers">
        <h2 class="h6 fw-semibold">Developers</h2>
        <ul class="list-unstyled small mb-0">
          <li class="mb-2"><a class="link-secondary text-decoration-none" href="#">Docs</a></li>
          <li class="mb-2"><a class="link-secondary text-decoration-none" href="#">API</a></li>
          <li class="mb-2"><a class="link-secondary text-decoration-none" href="#">SDKs</a></li>
          <li><a class="link-secondary text-decoration-none" href="#">Status</a></li>
        </ul>
      </nav>
      <nav class="col-6 col-md-2" aria-label="Company">
        <h2 class="h6 fw-semibold">Company</h2>
        <ul class="list-unstyled small mb-0">
          <li class="mb-2"><a class="link-secondary text-decoration-none" href="#">About</a></li>
          <li class="mb-2"><a class="link-secondary text-decoration-none" href="#">Careers</a></li>
          <li class="mb-2"><a class="link-secondary text-decoration-none" href="#">Blog</a></li>
          <li><a class="link-secondary text-decoration-none" href="#">Press</a></li>
        </ul>
      </nav>
      <nav class="col-6 col-md-2" aria-label="Support">
        <h2 class="h6 fw-semibold">Support</h2>
        <ul class="list-unstyled small mb-0">
          <li class="mb-2"><a class="link-secondary text-decoration-none" href="#">Help</a></li>
          <li class="mb-2"><a class="link-secondary text-decoration-none" href="#">Contact</a></li>
          <li><a class="link-secondary text-decoration-none" href="#">Security</a></li>
        </ul>
      </nav>
    </div>
    <div class="d-flex flex-column flex-md-row justify-content-between gap-2 border-top pt-4 mt-5 small text-body-secondary">
      <p class="mb-0">&copy; 2026 Mailroute, Inc.</p>
      <nav aria-label="Legal">
        <ul class="list-inline mb-0">
          <li class="list-inline-item"><a class="link-secondary" href="#">Privacy</a></li>
          <li class="list-inline-item"><a class="link-secondary" href="#">Terms</a></li>
          <li class="list-inline-item"><a class="link-secondary" href="#">DPA</a></li>
        </ul>
      </nav>
    </div>
  </div>
</footer>

Minimal one-line footer

  • flex-md-row
  • justify-content-md-between
  • .nav

One flex row: flex-column stacks the copyright and the links on phones, flex-md-row and justify-content-md-between push them to opposite ends from md up. The links are a .nav inside a labelled nav element, and the custom CSS only tightens the nav-link padding through --bs-nav-link-padding-x.

View code
<footer class="bft-line border-top">
  <div class="container d-flex flex-column flex-md-row align-items-center justify-content-md-between gap-2 py-4">
    <a class="d-flex align-items-center gap-2 link-body-emphasis text-decoration-none" href="#">
      <svg width="22" height="22" viewBox="0 0 22 22" aria-hidden="true"><circle cx="11" cy="11" r="10" fill="none" stroke="currentColor" stroke-width="2"/><circle cx="11" cy="11" r="4" fill="#e11d48"/></svg>
      <span class="small">&copy; 2026 Orbit Studio</span>
    </a>
    <nav aria-label="Footer">
      <ul class="nav justify-content-center">
        <li class="nav-item"><a class="nav-link" href="#">Work</a></li>
        <li class="nav-item"><a class="nav-link" href="#">Services</a></li>
        <li class="nav-item"><a class="nav-link" href="#">Journal</a></li>
        <li class="nav-item"><a class="nav-link" href="#">Contact</a></li>
      </ul>
    </nav>
  </div>
</footer>

Centered footer with social links

  • text-center
  • btn rounded-circle
  • Bootstrap Icons

Everything is centered with text-center and justify-content-center, so the layout is the same at every width. The social links are 44px round buttons with generic Bootstrap Icons marked aria-hidden, and each anchor carries an aria-label so screen readers announce the destination instead of nothing.

View code
<footer class="bft-center text-center py-5">
  <div class="container">
    <p class="bft-center-brand mb-1">Fieldnotes</p>
    <p class="text-body-secondary mb-4">A weekly letter about slow travel and small towns.</p>
    <nav aria-label="Footer">
      <ul class="nav justify-content-center mb-4">
        <li class="nav-item"><a class="nav-link" href="#">Archive</a></li>
        <li class="nav-item"><a class="nav-link" href="#">Guides</a></li>
        <li class="nav-item"><a class="nav-link" href="#">About</a></li>
        <li class="nav-item"><a class="nav-link" href="#">Support us</a></li>
      </ul>
    </nav>
    <ul class="list-unstyled d-flex justify-content-center gap-2 mb-4">
      <li><a class="btn bft-center-icon rounded-circle" href="#" aria-label="RSS feed"><i class="bi bi-rss" aria-hidden="true"></i></a></li>
      <li><a class="btn bft-center-icon rounded-circle" href="#" aria-label="Email the editors"><i class="bi bi-envelope" aria-hidden="true"></i></a></li>
      <li><a class="btn bft-center-icon rounded-circle" href="#" aria-label="Reader forum"><i class="bi bi-chat-dots" aria-hidden="true"></i></a></li>
      <li><a class="btn bft-center-icon rounded-circle" href="#" aria-label="Photo journal"><i class="bi bi-camera" aria-hidden="true"></i></a></li>
      <li><a class="btn bft-center-icon rounded-circle" href="#" aria-label="Video channel"><i class="bi bi-play-btn" aria-hidden="true"></i></a></li>
    </ul>
    <p class="small text-body-secondary mb-0">&copy; 2026 Fieldnotes. Written in Lisbon and Ljubljana.</p>
  </div>
</footer>

Dark mode and CSS variables

Color modes and the 5.3 CSS variables restyle a footer without Sass: scope data-bs-theme to the footer, or override the body and link variables on one element.

Dark footer with data-bs-theme

  • data-bs-theme="dark"
  • bg-body-tertiary
  • link-body-emphasis

data-bs-theme="dark" on the footer element switches only the footer to the dark color mode, so bg-body-tertiary, text-body-secondary, border-secondary-subtle and link-body-emphasis all pick their dark values. No custom colors are needed; the CSS just sets link opacity for the muted state.

View code
<footer class="bft-dark bg-body-tertiary text-body py-5" data-bs-theme="dark">
  <div class="container">
    <div class="row gy-4">
      <div class="col-md-5">
        <p class="h5 mb-2">Northwind Labs</p>
        <p class="text-body-secondary small mb-0 pe-md-5">We build data tools for climate researchers. Open source at heart, hosted for teams that need it.</p>
      </div>
      <nav class="col-6 col-md-2" aria-label="Platform">
        <h2 class="h6 text-body-emphasis">Platform</h2>
        <ul class="list-unstyled small mb-0">
          <li class="mb-2"><a class="link-body-emphasis bft-dark-link" href="#">Datasets</a></li>
          <li class="mb-2"><a class="link-body-emphasis bft-dark-link" href="#">Notebooks</a></li>
          <li><a class="link-body-emphasis bft-dark-link" href="#">Pricing</a></li>
        </ul>
      </nav>
      <nav class="col-6 col-md-2" aria-label="Community">
        <h2 class="h6 text-body-emphasis">Community</h2>
        <ul class="list-unstyled small mb-0">
          <li class="mb-2"><a class="link-body-emphasis bft-dark-link" href="#">Forum</a></li>
          <li class="mb-2"><a class="link-body-emphasis bft-dark-link" href="#">Events</a></li>
          <li><a class="link-body-emphasis bft-dark-link" href="#">Grants</a></li>
        </ul>
      </nav>
      <div class="col-md-3">
        <h2 class="h6 text-body-emphasis">Office</h2>
        <p class="small text-body-secondary mb-0">Kanalgata 14<br>5015 Bergen, Norway</p>
      </div>
    </div>
    <div class="d-flex flex-column flex-md-row justify-content-between align-items-md-center gap-3 border-top border-secondary-subtle pt-4 mt-5">
      <p class="small text-body-secondary mb-0">&copy; 2026 Northwind Labs AS</p>
      <ul class="list-unstyled d-flex gap-3 mb-0 fs-5">
        <li><a class="link-body-emphasis bft-dark-link" href="#" aria-label="Code repository"><i class="bi bi-code-slash" aria-hidden="true"></i></a></li>
        <li><a class="link-body-emphasis bft-dark-link" href="#" aria-label="Community chat"><i class="bi bi-chat-square-text" aria-hidden="true"></i></a></li>
        <li><a class="link-body-emphasis bft-dark-link" href="#" aria-label="RSS feed"><i class="bi bi-rss" aria-hidden="true"></i></a></li>
      </ul>
    </div>
  </div>
</footer>

Footer themed with CSS variables

  • --bs-body-bg-rgb
  • --bs-emphasis-color-rgb
  • bg-body text-body

The markup uses only stock utilities (bg-body, text-body, text-body-secondary, link-body-emphasis, border-top). Redefining the body, emphasis, secondary and border variables on one prefixed class re-themes all of them at once, which is how far a single block of 5.3 variables can take a component.

View code
<footer class="bft-vars bg-body text-body py-5">
  <div class="container">
    <div class="row gy-4 align-items-start">
      <div class="col-md-6">
        <p class="bft-vars-brand mb-2">Moss &amp; Stone</p>
        <p class="text-body-secondary mb-0">Garden design for small city plots, courtyards and roof terraces.</p>
      </div>
      <nav class="col-6 col-md-3" aria-label="Studio">
        <h2 class="h6 text-body-emphasis">Studio</h2>
        <ul class="list-unstyled mb-0">
          <li class="mb-2"><a class="link-body-emphasis link-underline-opacity-0 link-underline-opacity-100-hover" href="#">Projects</a></li>
          <li class="mb-2"><a class="link-body-emphasis link-underline-opacity-0 link-underline-opacity-100-hover" href="#">Process</a></li>
          <li><a class="link-body-emphasis link-underline-opacity-0 link-underline-opacity-100-hover" href="#">Plant list</a></li>
        </ul>
      </nav>
      <nav class="col-6 col-md-3" aria-label="Visit">
        <h2 class="h6 text-body-emphasis">Visit</h2>
        <ul class="list-unstyled mb-0">
          <li class="mb-2"><a class="link-body-emphasis link-underline-opacity-0 link-underline-opacity-100-hover" href="#">Nursery</a></li>
          <li class="mb-2"><a class="link-body-emphasis link-underline-opacity-0 link-underline-opacity-100-hover" href="#">Workshops</a></li>
          <li><a class="link-body-emphasis link-underline-opacity-0 link-underline-opacity-100-hover" href="#">Contact</a></li>
        </ul>
      </nav>
    </div>
    <p class="small text-body-secondary border-top pt-4 mt-5 mb-0">&copy; 2026 Moss &amp; Stone Gardens. Same classes as a default footer, new variables.</p>
  </div>
</footer>

Footer with a call-to-action band

  • rounded-4
  • --bs-btn-*
  • row-cols-2 row-cols-md-4

A colored band with a heading and a button sits above the link grid, a common pattern on marketing sites. The link grid uses row-cols-2 row-cols-md-4 on the row instead of a class on every column, and the band button is recolored through its --bs-btn-* variables.

View code
<footer class="bft-cta py-5">
  <div class="container">
    <div class="bft-cta-band rounded-4 p-4 p-md-5 mb-5 d-flex flex-column flex-md-row align-items-md-center justify-content-between gap-3">
      <div>
        <h2 class="h4 mb-1">Ready to plan your first route?</h2>
        <p class="mb-0 bft-cta-sub">Free for up to three vehicles. No card needed.</p>
      </div>
      <a class="btn bft-cta-btn flex-shrink-0" href="#">Start planning</a>
    </div>
    <div class="row row-cols-2 row-cols-md-4 gy-4">
      <nav class="col" aria-label="Product">
        <h2 class="h6 bft-cta-head">Product</h2>
        <ul class="list-unstyled small mb-0">
          <li class="mb-2"><a class="bft-cta-link" href="#">Route planner</a></li>
          <li class="mb-2"><a class="bft-cta-link" href="#">Driver app</a></li>
          <li><a class="bft-cta-link" href="#">Pricing</a></li>
        </ul>
      </nav>
      <nav class="col" aria-label="Industries">
        <h2 class="h6 bft-cta-head">Industries</h2>
        <ul class="list-unstyled small mb-0">
          <li class="mb-2"><a class="bft-cta-link" href="#">Bakeries</a></li>
          <li class="mb-2"><a class="bft-cta-link" href="#">Florists</a></li>
          <li><a class="bft-cta-link" href="#">Couriers</a></li>
        </ul>
      </nav>
      <nav class="col" aria-label="Resources">
        <h2 class="h6 bft-cta-head">Resources</h2>
        <ul class="list-unstyled small mb-0">
          <li class="mb-2"><a class="bft-cta-link" href="#">Guides</a></li>
          <li class="mb-2"><a class="bft-cta-link" href="#">Webinars</a></li>
          <li><a class="bft-cta-link" href="#">Help</a></li>
        </ul>
      </nav>
      <nav class="col" aria-label="Company">
        <h2 class="h6 bft-cta-head">Company</h2>
        <ul class="list-unstyled small mb-0">
          <li class="mb-2"><a class="bft-cta-link" href="#">About</a></li>
          <li class="mb-2"><a class="bft-cta-link" href="#">Jobs</a></li>
          <li><a class="bft-cta-link" href="#">Privacy</a></li>
        </ul>
      </nav>
    </div>
    <p class="small bft-cta-copy mt-5 mb-0">&copy; 2026 Routewise Ltd.</p>
  </div>
</footer>

Footer with a color mode switch

  • btn-check
  • btn-group
  • data-bs-theme

Pick Light or Dark in the footer.

A btn-group of btn-check radios sets data-bs-theme on the footer, and every utility inside follows: bg-body-secondary, text-body-secondary, border and link-body-emphasis. On a real site the same script would set the attribute on the html element and save the choice.

View code
<footer class="bft-mode bg-body-secondary text-body border-top py-4" id="bft-mode-footer" data-bs-theme="light">
  <div class="container d-flex flex-column flex-md-row align-items-md-center justify-content-between gap-3">
    <div>
      <p class="fw-semibold mb-1">Quillpad</p>
      <nav aria-label="Footer">
        <ul class="list-inline small mb-0">
          <li class="list-inline-item"><a class="link-body-emphasis" href="#">Download</a></li>
          <li class="list-inline-item"><a class="link-body-emphasis" href="#">Shortcuts</a></li>
          <li class="list-inline-item"><a class="link-body-emphasis" href="#">Privacy</a></li>
        </ul>
      </nav>
    </div>
    <div class="d-flex align-items-center gap-2">
      <span class="small text-body-secondary" id="bft-mode-label">Theme</span>
      <div class="btn-group" role="group" aria-labelledby="bft-mode-label">
        <input type="radio" class="btn-check" name="bft-mode" id="bft-mode-light" value="light" autocomplete="off" checked>
        <label class="btn btn-outline-secondary bft-mode-btn" for="bft-mode-light"><i class="bi bi-sun me-1" aria-hidden="true"></i>Light</label>
        <input type="radio" class="btn-check" name="bft-mode" id="bft-mode-dark" value="dark" autocomplete="off">
        <label class="btn btn-outline-secondary bft-mode-btn" for="bft-mode-dark"><i class="bi bi-moon-stars me-1" aria-hidden="true"></i>Dark</label>
      </div>
    </div>
  </div>
</footer>

Forms, menus and buttons

Interactive pieces that end up in footers: a newsletter form with validation, a language dropup, a back-to-top button and app download buttons.

Newsletter footer with an input group

  • input-group has-validation
  • was-validated
  • visually-hidden

Click Subscribe with the field empty, then enter an email.

The email field and button share an input-group, with has-validation so the rounded corners survive the invalid-feedback message. The form uses novalidate, checkValidity() and was-validated for Bootstrap styled errors, and a role="status" line confirms the signup.

View code
<footer class="bft-news py-5">
  <div class="container">
    <div class="row gy-4 align-items-center">
      <div class="col-md-6">
        <h2 class="h4 mb-2">The Sunday Pantry</h2>
        <p class="mb-0 bft-news-sub">One seasonal recipe and a shopping list, every Sunday morning. Unsubscribe in one click.</p>
      </div>
      <div class="col-md-6">
        <form class="bft-news-form" id="bft-news-form" novalidate>
          <label for="bft-news-email" class="form-label small fw-semibold">Email address</label>
          <div class="input-group has-validation">
            <span class="input-group-text"><i class="bi bi-envelope" aria-hidden="true"></i></span>
            <input type="email" class="form-control" id="bft-news-email" placeholder="you@example.com" autocomplete="email" required aria-describedby="bft-news-error">
            <button class="btn bft-news-btn" type="submit">Subscribe</button>
            <div class="invalid-feedback" id="bft-news-error">Enter a valid email address.</div>
          </div>
          <p class="small mt-2 mb-0 bft-news-ok" id="bft-news-status" role="status"></p>
        </form>
      </div>
    </div>
    <div class="d-flex flex-column flex-md-row justify-content-between gap-2 small border-top pt-4 mt-5 bft-news-sub">
      <p class="mb-0">&copy; 2026 The Sunday Pantry</p>
      <p class="mb-0">We never share your address.</p>
    </div>
  </div>
</footer>

Language selector dropup

  • dropup
  • dropdown-menu-end
  • aria-current

Open the language menu and pick a language.

A footer sits at the bottom of the page, so the language menu uses .dropup to open upward and dropdown-menu-end to align with the right edge. The script moves the active class and aria-current to the chosen item and updates the button label; each item has a lang attribute so screen readers pronounce the language names correctly.

View code
<footer class="bft-lang border-top bg-body-tertiary">
  <div class="container py-5">
    <div class="row gy-4">
      <nav class="col-6 col-md-3" aria-label="Shop">
        <h2 class="h6">Shop</h2>
        <ul class="list-unstyled small mb-0">
          <li class="mb-2"><a class="link-secondary" href="#">Bikes</a></li>
          <li class="mb-2"><a class="link-secondary" href="#">Parts</a></li>
          <li><a class="link-secondary" href="#">Gift cards</a></li>
        </ul>
      </nav>
      <nav class="col-6 col-md-3" aria-label="Service">
        <h2 class="h6">Service</h2>
        <ul class="list-unstyled small mb-0">
          <li class="mb-2"><a class="link-secondary" href="#">Repairs</a></li>
          <li class="mb-2"><a class="link-secondary" href="#">Warranty</a></li>
          <li><a class="link-secondary" href="#">Returns</a></li>
        </ul>
      </nav>
    </div>
    <div class="d-flex flex-wrap justify-content-between align-items-center gap-3 border-top pt-4 mt-4">
      <p class="small text-body-secondary mb-0">&copy; 2026 Velo Atelier</p>
      <div class="dropup">
        <button class="btn btn-outline-secondary dropdown-toggle bft-lang-btn" type="button" id="bft-lang-btn" data-bs-toggle="dropdown" aria-expanded="false">
          <i class="bi bi-globe2 me-1" aria-hidden="true"></i><span class="visually-hidden">Language: </span><span id="bft-lang-current">English</span>
        </button>
        <ul class="dropdown-menu dropdown-menu-end bft-lang-menu" aria-labelledby="bft-lang-btn">
          <li><a class="dropdown-item active" href="#" lang="en" aria-current="true">English</a></li>
          <li><a class="dropdown-item" href="#" lang="de">Deutsch</a></li>
          <li><a class="dropdown-item" href="#" lang="fr">Fran&ccedil;ais</a></li>
          <li><a class="dropdown-item" href="#" lang="es">Espa&ntilde;ol</a></li>
          <li><a class="dropdown-item" href="#" lang="it">Italiano</a></li>
        </ul>
      </div>
    </div>
  </div>
</footer>

Footer with a back-to-top button

  • btn rounded-pill
  • scrollTo
  • prefers-reduced-motion

Scroll the box to the footer and click Back to top.

The scrollable box stands in for a long page. On a real page an anchor with href="#top" is enough, and Bootstrap already sets scroll-behavior: smooth unless the visitor prefers reduced motion. Here the button scrolls the box with scrollTo, skips the smooth scroll under reduced motion and moves focus to the heading so keyboard users land at the top too.

View code
<div class="bft-top">
  <div class="bft-top-scroll border rounded-3 overflow-auto" id="bft-top-scroll">
    <article class="p-3 p-md-4">
      <h2 class="h5" id="bft-top-heading" tabindex="-1">Packing list for a week on the coast road</h2>
      <p>Bring layers. Mornings on the coast start at nine degrees even in July, and the wind off the water makes it feel colder.</p>
      <p>A light shell, a fleece and one warm hat cover most days. Leave the heavy jacket at home unless you plan to camp.</p>
      <p>Cash still matters in the smaller villages, where the bakery and the ferry kiosk often take nothing else.</p>
      <p>Download offline maps before you leave the city. Signal drops for long stretches between the headlands.</p>
      <p class="mb-0">Fuel up whenever the gauge reads half. Stations close early and some only open on weekdays.</p>
    </article>
    <footer class="bft-top-footer d-flex flex-column flex-sm-row align-items-sm-center justify-content-between gap-3 px-3 px-md-4 py-4">
      <p class="small mb-0">&copy; 2026 Coastline Journal</p>
      <button type="button" class="btn bft-top-btn rounded-pill" id="bft-top-btn"><i class="bi bi-arrow-up me-1" aria-hidden="true"></i>Back to top</button>
    </footer>
  </div>
</div>

Footer with app download buttons

  • btn btn-dark
  • d-flex flex-wrap
  • text-start lh-sm

The download buttons are plain btn-dark anchors with a generic phone icon and a two-line label, so no store artwork is copied. flex-wrap lets them stack on narrow screens, and the rating line uses filled star icons with a visually-hidden text equivalent.

View code
<footer class="bft-app py-5">
  <div class="container">
    <div class="row gy-4 align-items-center">
      <div class="col-md-6">
        <h2 class="h4 mb-2">Take Trailmate offline</h2>
        <p class="bft-app-sub mb-3">Topo maps, elevation profiles and a breadcrumb trail that works without signal.</p>
        <p class="small mb-0 d-flex align-items-center gap-1">
          <span class="bft-app-stars" aria-hidden="true"><i class="bi bi-star-fill"></i><i class="bi bi-star-fill"></i><i class="bi bi-star-fill"></i><i class="bi bi-star-fill"></i><i class="bi bi-star-half"></i></span>
          <span class="visually-hidden">Rated 4.7 out of 5.</span>
          <span class="bft-app-sub">4.7 average from 18,200 hikers</span>
        </p>
      </div>
      <div class="col-md-6">
        <div class="d-flex flex-wrap gap-2 justify-content-md-end">
          <a class="btn btn-dark bft-app-btn d-inline-flex align-items-center gap-2 text-start lh-sm" href="#">
            <i class="bi bi-phone fs-4" aria-hidden="true"></i>
            <span><span class="d-block small opacity-75">Download for</span><span class="fw-semibold">iOS</span></span>
          </a>
          <a class="btn btn-dark bft-app-btn d-inline-flex align-items-center gap-2 text-start lh-sm" href="#">
            <i class="bi bi-phone-fill fs-4" aria-hidden="true"></i>
            <span><span class="d-block small opacity-75">Download for</span><span class="fw-semibold">Android</span></span>
          </a>
        </div>
      </div>
    </div>
    <div class="d-flex flex-column flex-md-row justify-content-between gap-2 small border-top pt-4 mt-5">
      <p class="mb-0 bft-app-sub">&copy; 2026 Trailmate Outdoors</p>
      <nav aria-label="Legal">
        <ul class="list-inline mb-0">
          <li class="list-inline-item"><a class="bft-app-link" href="#">Privacy</a></li>
          <li class="list-inline-item"><a class="bft-app-link" href="#">Terms</a></li>
          <li class="list-inline-item"><a class="bft-app-link" href="#">Safety</a></li>
        </ul>
      </nav>
    </div>
  </div>
</footer>

Stores, local businesses and legal rows

Footers that carry real information: payment and shipping notes for a shop, address and opening hours for a restaurant, link columns that fold on phones and a cookie settings row.

E-commerce footer with trust info

  • row-cols-md-3
  • badge text-bg-light
  • list-inline

A trust strip with shipping, returns and checkout notes uses row-cols-1 row-cols-md-3 and icon plus text pairs. The accepted payment methods are generic text badges, never brand logos, and the link columns follow the usual col-6 col-md-3 grid.

View code
<footer class="bft-shop">
  <div class="bft-shop-trust border-bottom">
    <div class="container py-4">
      <ul class="row row-cols-1 row-cols-md-3 gy-3 list-unstyled mb-0">
        <li class="col d-flex gap-3 align-items-start"><i class="bi bi-truck fs-3 bft-shop-icon" aria-hidden="true"></i><span><strong class="d-block">Free shipping over 60 EUR</strong><span class="small bft-shop-muted">Ships in 1 to 2 working days</span></span></li>
        <li class="col d-flex gap-3 align-items-start"><i class="bi bi-arrow-repeat fs-3 bft-shop-icon" aria-hidden="true"></i><span><strong class="d-block">30-day returns</strong><span class="small bft-shop-muted">Prepaid label in every box</span></span></li>
        <li class="col d-flex gap-3 align-items-start"><i class="bi bi-shield-lock fs-3 bft-shop-icon" aria-hidden="true"></i><span><strong class="d-block">Secure checkout</strong><span class="small bft-shop-muted">Encrypted card payments</span></span></li>
      </ul>
    </div>
  </div>
  <div class="container py-5">
    <div class="row gy-4">
      <nav class="col-6 col-md-3" aria-label="Shop">
        <h2 class="h6">Shop</h2>
        <ul class="list-unstyled small mb-0">
          <li class="mb-2"><a class="bft-shop-link" href="#">New in</a></li>
          <li class="mb-2"><a class="bft-shop-link" href="#">Ceramics</a></li>
          <li class="mb-2"><a class="bft-shop-link" href="#">Linen</a></li>
          <li><a class="bft-shop-link" href="#">Sale</a></li>
        </ul>
      </nav>
      <nav class="col-6 col-md-3" aria-label="Help">
        <h2 class="h6">Help</h2>
        <ul class="list-unstyled small mb-0">
          <li class="mb-2"><a class="bft-shop-link" href="#">Order status</a></li>
          <li class="mb-2"><a class="bft-shop-link" href="#">Shipping</a></li>
          <li class="mb-2"><a class="bft-shop-link" href="#">Returns</a></li>
          <li><a class="bft-shop-link" href="#">Care guide</a></li>
        </ul>
      </nav>
      <div class="col-md-6">
        <h2 class="h6">We accept</h2>
        <ul class="list-inline mb-3">
          <li class="list-inline-item mb-2"><span class="badge text-bg-light border bft-shop-pay">Credit card</span></li>
          <li class="list-inline-item mb-2"><span class="badge text-bg-light border bft-shop-pay">Debit card</span></li>
          <li class="list-inline-item mb-2"><span class="badge text-bg-light border bft-shop-pay">Bank transfer</span></li>
          <li class="list-inline-item mb-2"><span class="badge text-bg-light border bft-shop-pay">Pay later</span></li>
          <li class="list-inline-item mb-2"><span class="badge text-bg-light border bft-shop-pay">Gift card</span></li>
        </ul>
        <p class="small bft-shop-muted mb-0">Prices include VAT. Customer service answers Monday to Friday, 9:00 to 17:00 CET.</p>
      </div>
    </div>
    <p class="small bft-shop-muted border-top pt-4 mt-5 mb-0">&copy; 2026 Kiln &amp; Loom GmbH, Hamburg</p>
  </div>
</footer>

Restaurant footer with address and hours

  • <address>
  • row g-0 dl
  • col-md-4

Contact details live in an address element, which Bootstrap resets to normal style with a bottom margin. Opening hours are a description list laid out with row and col classes so days and times line up, and the three columns stack below md.

View code
<footer class="bft-food py-5">
  <div class="container">
    <div class="row gy-4">
      <div class="col-md-4">
        <p class="bft-food-brand mb-2">Osteria Lume</p>
        <p class="bft-food-muted small mb-0">Handmade pasta, natural wine and a wood oven that has not cooled down since 2011.</p>
      </div>
      <div class="col-md-4">
        <h2 class="h6 bft-food-head">Find us</h2>
        <address class="small mb-0">
          Via dei Calzaiuoli 21<br>
          50122 Florence, Italy<br>
          <a class="bft-food-link d-inline-block mt-2" href="#"><i class="bi bi-telephone me-1" aria-hidden="true"></i>+39 055 000 0000</a><br>
          <a class="bft-food-link d-inline-block mt-1" href="#"><i class="bi bi-envelope me-1" aria-hidden="true"></i>tavoli@osterialume.example</a>
        </address>
      </div>
      <div class="col-md-4">
        <h2 class="h6 bft-food-head">Opening hours</h2>
        <dl class="row g-0 small mb-0 bft-food-hours">
          <dt class="col-6 fw-normal">Monday</dt><dd class="col-6 text-end">Closed</dd>
          <dt class="col-6 fw-normal">Tue to Thu</dt><dd class="col-6 text-end">18:00 to 23:00</dd>
          <dt class="col-6 fw-normal">Fri and Sat</dt><dd class="col-6 text-end">12:00 to 23:30</dd>
          <dt class="col-6 fw-normal">Sunday</dt><dd class="col-6 text-end">12:00 to 16:00</dd>
        </dl>
      </div>
    </div>
    <div class="d-flex flex-column flex-md-row justify-content-between align-items-md-center gap-3 bft-food-rule pt-4 mt-5">
      <p class="small bft-food-muted mb-0">&copy; 2026 Osteria Lume</p>
      <a class="btn bft-food-btn" href="#">Book a table</a>
    </div>
  </div>
</footer>

Link columns that collapse on phones

  • collapse d-md-block
  • d-md-none
  • aria-expanded

On a phone, tap a section to open its links.

Each link list is a .collapse with d-md-block: below md the Collapse plugin opens and closes it, and from md up the important display utility keeps it open. The toggle button carries aria-expanded and aria-controls and hides from md up with d-md-none, where a plain heading takes its place.

View code
<footer class="bft-fold border-top bg-body-tertiary">
  <div class="container py-4 py-md-5">
    <div class="row">
      <nav class="col-md-4 bft-fold-col" aria-label="Products">
        <h2 class="h6 mb-0 mb-md-3">
          <button class="bft-fold-btn d-md-none" type="button" data-bs-toggle="collapse" data-bs-target="#bft-fold-products" aria-expanded="false" aria-controls="bft-fold-products">Products</button>
          <span class="d-none d-md-inline">Products</span>
        </h2>
        <div class="collapse d-md-block" id="bft-fold-products">
          <ul class="list-unstyled small pb-3 pb-md-0 mb-0">
            <li class="mb-2"><a class="link-secondary" href="#">Standing desks</a></li>
            <li class="mb-2"><a class="link-secondary" href="#">Chairs</a></li>
            <li><a class="link-secondary" href="#">Monitor arms</a></li>
          </ul>
        </div>
      </nav>
      <nav class="col-md-4 bft-fold-col" aria-label="Support">
        <h2 class="h6 mb-0 mb-md-3">
          <button class="bft-fold-btn d-md-none" type="button" data-bs-toggle="collapse" data-bs-target="#bft-fold-support" aria-expanded="false" aria-controls="bft-fold-support">Support</button>
          <span class="d-none d-md-inline">Support</span>
        </h2>
        <div class="collapse d-md-block" id="bft-fold-support">
          <ul class="list-unstyled small pb-3 pb-md-0 mb-0">
            <li class="mb-2"><a class="link-secondary" href="#">Assembly videos</a></li>
            <li class="mb-2"><a class="link-secondary" href="#">Spare parts</a></li>
            <li><a class="link-secondary" href="#">10-year warranty</a></li>
          </ul>
        </div>
      </nav>
      <nav class="col-md-4 bft-fold-col" aria-label="Company">
        <h2 class="h6 mb-0 mb-md-3">
          <button class="bft-fold-btn d-md-none" type="button" data-bs-toggle="collapse" data-bs-target="#bft-fold-company" aria-expanded="false" aria-controls="bft-fold-company">Company</button>
          <span class="d-none d-md-inline">Company</span>
        </h2>
        <div class="collapse d-md-block" id="bft-fold-company">
          <ul class="list-unstyled small pb-3 pb-md-0 mb-0">
            <li class="mb-2"><a class="link-secondary" href="#">Showrooms</a></li>
            <li class="mb-2"><a class="link-secondary" href="#">Sustainability</a></li>
            <li><a class="link-secondary" href="#">Careers</a></li>
          </ul>
        </div>
      </nav>
    </div>
    <p class="small text-body-secondary mt-4 mb-0">&copy; 2026 Upright Furniture Co.</p>
  </div>
</footer>

Does Bootstrap Have a Footer Component?

No. The 5.3 documentation lists 24 components, from Accordion to Tooltips, and Footer isn’t one of them. Spacing, layout and color all come from classes you pick yourself.

The docs do give you something to start from. The Examples section has a Footers page of copy-paste layouts with link rows, social icon rows and a newsletter form. There’s also a sticky footer template that holds the footer at the bottom of short pages, plus a second version of it built for a fixed top navbar.

Third-party template pages, MDBootstrap among them, say the official documentation has no footer component. They’re right about the component list. What they miss is a small version detail: the Bootstrap 5.0 Examples page has no Footers group, while the 5.1, 5.2 and 5.3 pages do.

Cards, modals and the rest of the Bootstrap components come with documented class names and markup. A footer doesn’t, which is why the next sections build one piece by piece.

How Do You Build a Basic Bootstrap Footer?

Start with a footer element, a container inside it, some vertical padding and a background or text color class. That’s the whole basic version.

  1. Load the Bootstrap 5.3 stylesheet. Bootstrap’s own CDN starter example pulls the compiled CSS from jsDelivr, so one link tag in the head does it.
  2. Add a footer element after the main content and give it bg-dark text-white.
  3. Place a .container inside it. Containers center their content and pad it horizontally, so text neither touches the screen edge nor stretches across a wide monitor.
  4. Add py-3 or py-4 to the footer. The container only pads the sides, so the vertical space has to come from a padding utility.
  5. Add text-center to center the line. For a two-sided footer, use d-flex justify-content-between instead.
  6. Put the copyright line in a paragraph with mb-0, otherwise the paragraph margin adds extra space under it.
<footer class="bg-dark text-white py-3">
  <div class="container text-center">
    <p class="mb-0">Copyright 2026 Company, Inc.</p>
  </div>
</footer>

The padding utilities come out of the $spacers Sass map through the utilities API. Per the Bootstrap spacing docs, py-3 equals one default $spacer (1rem) and py-4 works out to 1.5rem.

The default container tops out at 1320px from the xxl breakpoint. On a wide monitor the background still spans the viewport while the content stays in a centered column.

Use .container-fluid when the content should stretch too.

How Do You Lay Out a Multi-Column Footer With the Grid?

Put a row inside the footer container and give each column a breakpoint class such as col-md-3. Below that breakpoint the columns stack, and from the breakpoint up they sit side by side.

Every row divides into 12 template columns in Bootstrap’s twelve-column grid system, so four equal link groups take col-md-3 and three take col-md-4. It all runs on flexbox, which is why one set of col-md-* classes starts stacked and goes horizontal at md.

The md breakpoint begins at 768px. Bootstrap writes its breakpoints as min-width media queries, so the mobile-first approach is the default and the stacked layout needs no class at all.

A footer built from plain col classes is never responsive. Those columns stay side by side from the smallest phone up, which is why I’d leave them out of footers.

The row-columns shortcut sets the count on the row instead. row row-cols-1 row-cols-sm-2 row-cols-md-4 gives one column on phones, two from sm and four from md, per the Bootstrap grid docs.

The md container is 720px wide and the gutter is 1.5rem, which is 24px at the default root size. Divide that out and three columns (col-md-4) get 240px each, with 216px usable. Four columns (col-md-3) get 180px and 156px usable. Six (col-md-2) are down to 120px, and only 96px of that is usable.

Six columns at 96px break long link labels. Hold six-column footers back until lg (960px container, 136px usable) and treat four as the ceiling for tablets.

Stacked columns touch unless the row adds vertical gutters. Add gy-4 to the row, or g-4 for both directions, so link groups keep their spacing on phones.

How Do You Keep a Bootstrap Footer at the Bottom of the Page?

Use the flex column method for ordinary footers. fixed-bottom is for short bars that have to stay visible, and “sticky footer” gets used for both even though they behave differently.

Bootstrap’s Examples pages (5.0 through 5.3) describe the first one, a footer attached to the bottom of the viewport when page content is short. MDBootstrap’s footer docs mean something else by the term: a footer pinned to the bottom of the viewport with fixed-bottom, so it stays put while the user scrolls.

Flex column method

Bootstrap’s sticky footer example puts h-100 on the html element and d-flex flex-column h-100 on the body (the 5.2.3 and 5.3.8 sources match). Inside the body, main takes flex-shrink-0 and the footer takes mt-auto.

The auto margin takes the free space above the footer and pushes it down.

On a long page there is no free space, so the footer simply follows the content.

Fixed-bottom method

The Bootstrap 5.3 position helpers put a warning on fixed-bottom, telling you to understand the ramifications of fixed position since extra CSS may be needed.

In practice the footer leaves the document flow and sits over the last lines of content. The fix is bottom padding on the body that matches the footer’s rendered height. It suits short persistent bars such as consent notices and not much else.

The sticky-bottom helper is a different tool. Bootstrap’s docs say it applies only after you scroll past the element, so it does not pin a page footer.

Pick by what the footer has to do on a short page and on a scrolled one.

MethodFooter positionCovers contentBest for
Default flowRight after content, mid-screen on short pagesNoPages that always fill the screen
Flex column with mt-autoViewport bottom on short pages, after content on long onesNoMost site footers
fixed-bottomAlways at the viewport bottomYes, without body paddingShort persistent bars

Flex column wins for ordinary site footers. fixed-bottom turns a footer into a toolbar.

Why Is My Bootstrap Footer Not Sticking to the Bottom?

Nearly always one link in the flex column chain is missing, and each missing link gives its own symptom.

  • If the footer sits right under short content, html probably has no h-100. The body’s percentage height then has nothing to resolve against, and Bootstrap’s example sets it on both elements.
  • If mt-auto does nothing, the body isn’t d-flex flex-column. Auto margins only push a footer inside a flex container.
  • If the footer still hugs the content, check that it’s a direct child of the flex container. A wrapper div, such as the root element a JavaScript framework mounts the app in, becomes the flex item instead, so move the flex classes to that wrapper.
  • Last lines of content hidden usually means fixed-bottom with no bottom padding on the page.

The official example describes itself as a desktop browser solution. Check the footer on a phone before shipping.

The method also falls apart on pages whose body is already a CSS grid or a sidebar layout. The body can’t be a flex column there too, so give the footer its own row in that layout instead of relying on mt-auto.

How Do You Style a Bootstrap Footer: Colors, Spacing and Dark Mode?

Set the background with a bg-* class, the text color with text-* (or text-bg-*, which sets both), and scope a dark theme to the footer with data-bs-theme="dark".

The text-bg-* helpers arrived in v5.2. One class sets a background and a contrasting text color, picked by Bootstrap’s Sass color-contrast() function. Color modes came later, in v5.3.0. Put data-bs-theme on the html element and it applies to the whole project, put it on a footer and it stays scoped to that element.

For alignment, text-center text-md-start centers text on phones and left-aligns it from md up. On a flex footer row, gap-3 spaces the children without margin classes on each one.

Link color needs its own decision. Bootstrap’s colored links docs say link-body-emphasis is the only colored link that adapts to color modes (v5.3.8), while AdminLTE’s footer guide (August 2026) lists link-secondary among the classes that re-map under data-bs-theme="dark".

The v5.3.8 source sides with the docs: link-secondary reads the --bs-secondary-rgb theme color, which the dark mode block does not redefine. Use link-body-emphasis or text-body-secondary for footer links that must follow a theme switch, and keep link-secondary for footers that stay in one mode.

Prefer link-* classes over text-* on anchors, because only the link classes carry :hover and :focus states. The light variants such as link-light belong on dark backgrounds only.

The color-contrast() function has no CSS-native equivalent, so overriding theme colors through CSS variables can break the pairing that text-bg-* computed. Recompile the Sass when the brand color changes a theme color, and check any CSS-variable override by hand against the color contrast thresholds.

<footer class="bg-dark text-light py-4" data-bs-theme="dark">
  <div class="container d-flex flex-column flex-md-row justify-content-md-between gap-3 text-center text-md-start">
    <p class="mb-0">Copyright 2026 Company, Inc.</p>
    <a class="link-light" href="#">Privacy</a>
  </div>
</footer>

What Should Go Inside a Bootstrap Footer?

Most footers only need two of the usual pieces: link lists, social icons, a newsletter form, a copyright line and contact details. Add the rest when a visitor would actually look for them at the bottom of the page.

Link lists

Render each group of links as a ul with list-unstyled and put a short heading over it.

Labels work best at one word. Add mb-2 to each li for vertical rhythm, and keep the lists a similar length so the columns finish at about the same height.

Bootstrap’s own Footers example sticks to one-word labels (Home, Features, Pricing, FAQs, About), which keeps narrow columns from wrapping.

Social icons

Bootstrap Icons (v1.13.2) ships as SVGs, an SVG sprite or a web font, and installs with npm i bootstrap-icons. Font Awesome Free is the usual alternative.

Either set slots into a footer the same way: one anchor per network with the icon inside, grouped in a flex row with gap-3. The Bootstrap icons guide covers installation in more detail.

Bootstrap Icons is maintained by the Bootstrap team, so the icons match the framework’s look, and it works with or without Bootstrap’s CSS. The catch is the web-font build, which loads the full set. Use single SVGs when the footer needs only a handful of icons.

Font Awesome Free is a free download packaged as SVG, JS and web font files. The licensing is split, with icons under CC BY 4.0, fonts under SIL OFL 1.1 and code under MIT, and attribution is required (the files carry embedded attribution comments). Pro styles need a paid commercial license.

Pick Bootstrap Icons when the page already loads Bootstrap CSS. Reach for Font Awesome only when the design needs a glyph the other set lacks.

Brand icons are trademarks of their owners, and Font Awesome’s license asks that a logo represent only the company it belongs to. Link each icon to that company’s own profile.

Newsletter form

You can build the field yourself or paste a provider’s embed code.

Bootstrap’s form classes handle the field and the button, a form-control input and a btn in a flex row.

<form class="d-flex gap-2" action="#" method="post">
  <label for="footer-email" class="visually-hidden">Email address</label>
  <input type="email" class="form-control" id="footer-email" required>
  <button class="btn btn-primary flex-shrink-0" type="submit">Subscribe</button>
</form>

The action must point at your email provider. AdminLTE’s newsletter example adds flex-shrink-0 to the button so it holds its width on narrow screens.

Mailchimp’s help docs flag a few problems with embeds. Embedded forms inherit the site’s stylesheet, so Bootstrap’s rules can change how the form looks compared with Mailchimp’s preview. Deleting a required field from the embed code makes the form submit with errors. And since the embed code carries its own form tag, it can’t sit inside another form element.

Copyright line and contact details

Keep the copyright line small and last.

Put it in a bottom strip with the Privacy and Terms links, separated from the navigation by a border.

MDN’s footer reference places author information in an address element inside the footer, which suits contact details. Make phone numbers and emails tappable with tel: and mailto: links, as AdminLTE’s contact footer does.

How Do You Make a Bootstrap Footer Accessible?

Bootstrap’s accessibility docs say the result depends on the author’s markup, styling and scripting, so the framework won’t do this for you. In a footer it comes down to the landmark, accessible names, text contrast and target size.

On the landmark, a footer outside article, aside, main, nav and section maps to the contentinfo landmark, and a nested one becomes generic (MDN). Keep one contentinfo landmark per page and label each one if there are several.

Every icon-only link needs an accessible name. Every nav in the footer (“Footer”, “Legal”) needs its own label too, so landmark lists can tell them apart.

For contrast, WCAG 2.2 criterion 1.4.3 asks for 4.5:1 on normal text (W3C). Bootstrap’s docs warn that some default palette pairings fall below that, particularly on light backgrounds.

Target size is criterion 2.5.8, which asks for targets of at least 24 by 24 CSS pixels, or enough space around smaller ones. Links inside a sentence are exempt, but a list of footer links is not.

An ARIA label on the anchor names an icon link, as in AdminLTE’s footer examples. Bootstrap’s own alternative is text inside a .visually-hidden span.

Brand-colored icons are a visual cue only, so the accessible name has to carry the meaning. Add role="contentinfo" to the footer only if you must support Safari before version 13, where VoiceOver did not expose the landmark (MDN).

Gray-on-dark pairs fail more easily than they look, so measure each one. For link lists, add padding or spacing to each item until every link has the size or the room the criterion needs.

Run the finished footer through a web accessibility checklist as well, since the footer is one landmark among several on a page.

Which Bootstrap Footer Template Should You Use?

Hand-build a footer that needs one row or a few columns. Copy a template only for patterns you wouldn’t write quickly, such as a mega footer with a call-to-action band.

SourceWhat you getCatch
Bootstrap Footers examples (5.3)Official copy-paste layouts in Bootstrap’s own classesSmall set of layouts
AdminLTE (18 examples, Aug 2026)Bootstrap 5.3 utility markup, no custom stylesheet (a few inline styles)Needs 5.3 for bg-body-* tokens; assumes Bootstrap Icons
Colorlib (22 templates, Sept 2026)Downloadable plain HTML and CSS footersNo Bootstrap files included; download asks for an email address
MDBootstrapLarge set of styled footersTied to the MDB kit, not core Bootstrap alone

Names mislead here. Colorlib’s 2025 roundup carried Bootstrap in its title, and its September 28, 2026 edition says those footers were rebuilt as plain HTML and CSS that run alone or inside a Bootstrap 4, 5 or 6 project.

Before pasting anything, check the Bootstrap version, since the bg-body-* tokens need 5.3. Icon classes such as bi bi-* need the icon library loaded. The sticky pattern differs too. AdminLTE’s example puts d-flex flex-column min-vh-100 on the body, while Bootstrap’s own example sets h-100 on html and body, so test either one on your layout. AdminLTE’s guide also says most snippets skip accessibility details, so check labels and contrast yourself.

A utility-built footer adds no files, because the classes already ship in Bootstrap’s stylesheet. Colorlib lists its newest newsletter footer at a 663 KB download, and since its footers carry their own CSS they behave like any other set of CSS footers.

Start from the official Footers snippets. If they lack the pattern you need, AdminLTE is the next stop. Colorlib or MDB only make sense when you want that vendor’s styling or kit.

Bootstrap Footer FAQ

Does a Bootstrap 5 footer need jQuery?

No. Bootstrap 5.0.0 dropped jQuery and rewrote its plugins in plain JavaScript, so a footer needs no jQuery even when it uses the Collapse plugin for mobile link accordions (Bootstrap migration docs).

What changes when a footer moves from Bootstrap 4 to Bootstrap 5?

Mostly renames. The ml- and mr- prefixes became ms- and me-, text-left became text-start, and float-right became float-end.

Also, sr-only became visually-hidden, form-group was dropped, and JavaScript data attributes gained a bs prefix, per Bootstrap’s migration guide.

How do you show the current year in a copyright line?

With JavaScript. new Date().getFullYear() returns the current year as an integer in local time (MDN).

Write it into a span inside the copyright paragraph, or render the year server-side so it appears without a script.

How do you add a back-to-top link to a footer?

Use an anchor with href=”#top”. HTML treats #top as the top of the document when no element carries that id (WHATWG), and Bootstrap applies smooth scrolling unless the visitor prefers reduced motion.

AdminLTE’s guide adds scroll-behavior: smooth by hand, although Bootstrap’s accessibility docs say Bootstrap already enables it. Label an icon-only link with aria-label.

Does the sticky footer work with a fixed top navbar?

Yes. Bootstrap ships a separate sticky footer navbar example for it, which adds padding-top: 60px to the main container so the fixed navbar doesn’t cover the page content (5.3 example).

Keeping One Bootstrap Footer Consistent Across Pages

Put the footer markup in one shared partial and have every page template include it.

Copying the footer into each file turns a new legal link or a contrast fix into a site-wide find and replace.

Extract the footer into one partial first. Set the landmark and theme attribute there, then test contrast and link spacing once instead of per page.

One shared file also means one mistake reaches every page, so review each edit before deploying. Layouts that differ, such as an admin area and a marketing site, need one partial each.

Bootstrap’s docs defer the color mode rebuild of theme colors to v6. The first Bootstrap 6 alpha (6.0.0-alpha.1) shipped on October 8, 2026 and renames responsive classes such as col-md-3 to md:col-3, so the partial needs a recheck when v6 reaches a stable release (verified against v5.3.8, the current stable release, on October 28, 2026).

The header follows the same pattern, and the Bootstrap navbar belongs in a shared partial beside the footer.