Snippets Table

Bootstrap 5 Table with Row and Column Hover Highlight

A weekly schedule table that highlights the hovered or focused cell's row and column, with colour-coded morning and afternoon shift badges.

Bootstrap 5 No jQuery Jun 2019 8.9K views

<section class="ht-section wdw-stage">
  <div class="container">
    <div class="mb-3"><span class="wdw-eyebrow mb-1">Schedule</span><h2 class="h3 wdw-heading mb-1">Weekly shift schedule</h2><p class="text-body-secondary small mb-0">Hover or focus a cell to highlight its row and column.</p></div>
    <div class="wdw-card overflow-hidden">
      <div class="d-flex align-items-center justify-content-between gap-2 px-3 px-lg-4 py-3 border-bottom">
        <div><div class="fw-bold" id="htWeek" aria-live="polite">Week 43</div><div class="small text-body-secondary" id="htRange">Oct 25 – Oct 31</div></div>
        <div class="d-flex gap-2">
          <button type="button" class="btn btn-outline-secondary btn-sm rounded-circle p-0 ht-nav" data-ht-step="-1" aria-label="Previous week"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m15 18-6-6 6-6"/></svg></button>
          <button type="button" class="btn btn-outline-secondary btn-sm rounded-circle p-0 ht-nav" data-ht-step="1" aria-label="Next week"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"/></svg></button>
        </div>
      </div>
      <div class="table-responsive">
        <table class="ht-table table table-borderless align-middle text-center mb-0" id="htTable">
          <thead><tr><th scope="col" class="text-start ps-3 ps-lg-4">Employee</th><th scope="col">Sun</th><th scope="col">Mon</th><th scope="col">Tue</th><th scope="col">Wed</th><th scope="col">Thu</th><th scope="col">Fri</th><th scope="col">Sat</th></tr></thead>
<tbody>
<tr><th scope="row" class="text-start ps-3 ps-lg-4 fw-semibold">Lawrence Scott</th><td tabindex="0"><span class="badge rounded-pill ht-shift ht-am">8:00 AM</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-am">8:00 AM</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-pm">5:00 PM</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-am">8:00 AM</span></td></tr>
<tr><th scope="row" class="text-start ps-3 ps-lg-4 fw-semibold">Jane Medina</th><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-pm">5:00 PM</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-pm">5:00 PM</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-am">9:00 AM</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td></tr>
<tr><th scope="row" class="text-start ps-3 ps-lg-4 fw-semibold">Billy Mitchell</th><td tabindex="0"><span class="badge rounded-pill ht-shift ht-am">9:00 AM</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-pm">2:00 PM</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-am">8:00 AM</span></td></tr>
<tr><th scope="row" class="text-start ps-3 ps-lg-4 fw-semibold">Beverly Reid</th><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-pm">5:00 PM</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-pm">5:00 PM</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-am">9:00 AM</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td></tr>
<tr><th scope="row" class="text-start ps-3 ps-lg-4 fw-semibold">Tiffany Wade</th><td tabindex="0"><span class="badge rounded-pill ht-shift ht-am">8:00 AM</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-am">8:00 AM</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-pm">5:00 PM</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-am">8:00 AM</span></td></tr>
<tr><th scope="row" class="text-start ps-3 ps-lg-4 fw-semibold">Sean Adams</th><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-pm">5:00 PM</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-pm">5:00 PM</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-am">9:00 AM</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td></tr>
<tr><th scope="row" class="text-start ps-3 ps-lg-4 fw-semibold">Rachel Simpson</th><td tabindex="0"><span class="badge rounded-pill ht-shift ht-am">9:00 AM</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-pm">2:00 PM</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-am">8:00 AM</span></td></tr>
<tr><th scope="row" class="text-start ps-3 ps-lg-4 fw-semibold">Mark Salazar</th><td tabindex="0"><span class="badge rounded-pill ht-shift ht-am">8:00 AM</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-am">8:00 AM</span></td><td tabindex="0"><span class="text-body-tertiary" aria-label="Off">–</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-pm">5:00 PM</span></td><td tabindex="0"><span class="badge rounded-pill ht-shift ht-am">8:00 AM</span></td></tr>
</tbody></table></div></div>
    <p class="small text-body-secondary text-center mt-2 mb-0 d-md-none">Swipe the table sideways to see every day</p></div></section>

Built on Bootstrap 5.3.8 with plain JavaScript — no jQuery. Supports light and dark mode via data-bs-theme.

Free to use in personal and commercial projects under the MIT license.