Snippets Blog

Bootstrap 5 Blog Layout with Hover Cards

A three-column blog grid of article cards with a cover photo, category badge, date, headline, excerpt, author and reading time, with a lift and image zoom on hover.

Bootstrap 5 No jQuery Apr 2020 2.1K views

<section class="wdw-stage">
  <div class="container" style="max-width:1120px">
    <div class="d-flex flex-wrap align-items-end justify-content-between gap-3 mb-3">
      <div>
        <span class="wdw-eyebrow">The journal</span>
        <h2 class="wdw-heading h2 mb-0">Latest from the blog</h2>
      </div>
      <a href="#" class="btn btn-outline-primary rounded-pill">View all posts</a>
    </div>
    <div class="d-flex flex-wrap gap-2 mb-4" role="group" aria-label="Filter posts by category" id="post-filters">
      <button type="button" class="btn btn-sm rounded-pill btn-primary" data-filter="all" aria-pressed="true">All</button>
      <button type="button" class="btn btn-sm rounded-pill btn-outline-primary" data-filter="Learning" aria-pressed="false">Learning</button>
      <button type="button" class="btn btn-sm rounded-pill btn-outline-primary" data-filter="Live music" aria-pressed="false">Live music</button>
      <button type="button" class="btn btn-sm rounded-pill btn-outline-primary" data-filter="Festivals" aria-pressed="false">Festivals</button>
      <button type="button" class="btn btn-sm rounded-pill btn-outline-primary" data-filter="Gear" aria-pressed="false">Gear</button>
    </div>
    <div class="row g-4" id="post-grid">
      <div class="col-lg-8" data-cat="Live music">
        <article class="post post-feature card h-100 border-0 wdw-card-sm overflow-hidden text-white">
          <img class="post-feature-img" src="https://images.unsplash.com/photo-1493225457124-a3eb161ffa5f?auto=format&fit=crop&w=1200&q=70" alt="Performer with a raised arm in stage smoke and lights" loading="lazy">
          <div class="scrim"></div>
          <time class="date-chip" datetime="2026-10-21">Oct 21, 2026</time>
          <div class="post-feature-body p-4 p-lg-5 d-flex flex-column justify-content-end">
            <span class="badge rounded-pill text-bg-light align-self-start mb-3">Live music</span>
            <h3 class="h3 fw-bold mb-2"><a href="#" class="stretched-link text-white text-decoration-none">How to pick a small venue that sounds great</a></h3>
            <p class="mb-3 opacity-75 line-clamp-2">Room shape, stage height and a decent sound engineer matter more than capacity. Here is the checklist we use before booking any room.</p>
            <div class="d-flex align-items-center justify-content-between small">
              <span class="fw-semibold">Mira Kapoor · 7 min read</span>
              <span class="more d-inline-flex align-items-center gap-1 fw-semibold">Read more <svg class="more-arrow" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
            </div>
          </div>
        </article>
      </div>
      <div class="col-md-6 col-lg-4" data-cat="Learning">
        <article class="post card h-100 border-0 wdw-card-sm overflow-hidden">
          <div class="position-relative">
            <div class="post-media ratio ratio-16x9">
            <img src="https://images.unsplash.com/photo-1510915361894-db8b60106cb1?auto=format&fit=crop&w=800&q=70" alt="Guitar player strumming an acoustic guitar" loading="lazy">
            </div>
            <time class="date-chip" datetime="2026-10-14">Oct 14, 2026</time>
          </div>
          <div class="card-body p-4 d-flex flex-column">
            <span class="badge rounded-pill bg-primary-subtle text-primary-emphasis align-self-start mb-3">Learning</span>
            <h3 class="h5 fw-bold mb-2"><a href="#" class="stretched-link text-body-emphasis text-decoration-none">Why learn guitar as an adult?</a></h3>
            <p class="wdw-muted line-clamp-3 mb-4">Starting late is an advantage: you know what you want to play and you practise with purpose.</p>
            <div class="d-flex align-items-center justify-content-between mt-auto pt-3 border-top">
              <div class="d-flex align-items-center gap-2">
                <span class="avatar" aria-hidden="true">VP</span>
                <span class="small fw-semibold">Vishvjeet Patel</span>
              </div>
              <span class="more text-primary d-inline-flex align-items-center gap-1 small fw-semibold">5 min read <svg class="more-arrow" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
            </div>
          </div>
        </article>
      </div>
      <div class="col-md-6 col-lg-4" data-cat="Festivals">
        <article class="post card h-100 border-0 wdw-card-sm overflow-hidden">
          <div class="position-relative">
            <div class="post-media ratio ratio-16x9">
            <img src="https://images.unsplash.com/photo-1470229722913-7c0e2dbbafd3?auto=format&fit=crop&w=800&q=70" alt="Crowd with raised hands at a festival" loading="lazy">
            </div>
            <time class="date-chip" datetime="2026-10-02">Oct 02, 2026</time>
          </div>
          <div class="card-body p-4 d-flex flex-column">
            <span class="badge rounded-pill bg-primary-subtle text-primary-emphasis align-self-start mb-3">Festivals</span>
            <h3 class="h5 fw-bold mb-2"><a href="#" class="stretched-link text-body-emphasis text-decoration-none">What festival crowds teach you about timing</a></h3>
            <p class="wdw-muted line-clamp-3 mb-4">Watch how a set builds and releases energy, then borrow the pacing for your own shows.</p>
            <div class="d-flex align-items-center justify-content-between mt-auto pt-3 border-top">
              <div class="d-flex align-items-center gap-2">
                <span class="avatar" aria-hidden="true">JW</span>
                <span class="small fw-semibold">Jonas Weber</span>
              </div>
              <span class="more text-primary d-inline-flex align-items-center gap-1 small fw-semibold">4 min read <svg class="more-arrow" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
            </div>
          </div>
        </article>
      </div>
      <div class="col-md-6 col-lg-4" data-cat="Gear">
        <article class="post card h-100 border-0 wdw-card-sm overflow-hidden">
          <div class="position-relative">
            <div class="post-media ratio ratio-16x9">
            <img src="https://images.unsplash.com/photo-1511671782779-c97d3d27a1d4?auto=format&fit=crop&w=800&q=70" alt="Condenser microphone in a home recording studio" loading="lazy">
            </div>
            <time class="date-chip" datetime="2026-09-24">Sep 24, 2026</time>
          </div>
          <div class="card-body p-4 d-flex flex-column">
            <span class="badge rounded-pill bg-primary-subtle text-primary-emphasis align-self-start mb-3">Gear</span>
            <h3 class="h5 fw-bold mb-2"><a href="#" class="stretched-link text-body-emphasis text-decoration-none">A home studio you can build in a weekend</a></h3>
            <p class="wdw-muted line-clamp-3 mb-4">One microphone, one interface and a few blankets get you further than a rack of gear you never learn.</p>
            <div class="d-flex align-items-center justify-content-between mt-auto pt-3 border-top">
              <div class="d-flex align-items-center gap-2">
                <span class="avatar" aria-hidden="true">AL</span>
                <span class="small fw-semibold">Ana Lopes</span>
              </div>
              <span class="more text-primary d-inline-flex align-items-center gap-1 small fw-semibold">6 min read <svg class="more-arrow" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
            </div>
          </div>
        </article>
      </div>
      <div class="col-md-6 col-lg-4" data-cat="Live music">
        <article class="post card h-100 border-0 wdw-card-sm overflow-hidden">
          <div class="position-relative">
            <div class="post-media ratio ratio-16x9">
            <img src="https://images.unsplash.com/photo-1514320291840-2e0a9bf2a9ae?auto=format&fit=crop&w=800&q=70" alt="Concert crowd facing a lit stage" loading="lazy">
            </div>
            <time class="date-chip" datetime="2026-09-12">Sep 12, 2026</time>
          </div>
          <div class="card-body p-4 d-flex flex-column">
            <span class="badge rounded-pill bg-primary-subtle text-primary-emphasis align-self-start mb-3">Live music</span>
            <h3 class="h5 fw-bold mb-2"><a href="#" class="stretched-link text-body-emphasis text-decoration-none">Three habits of bands that sell out locally</a></h3>
            <p class="wdw-muted line-clamp-3 mb-4">They announce early, share rehearsals and treat every support slot like a headline show.</p>
            <div class="d-flex align-items-center justify-content-between mt-auto pt-3 border-top">
              <div class="d-flex align-items-center gap-2">
                <span class="avatar" aria-hidden="true">JW</span>
                <span class="small fw-semibold">Jonas Weber</span>
              </div>
              <span class="more text-primary d-inline-flex align-items-center gap-1 small fw-semibold">5 min read <svg class="more-arrow" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
            </div>
          </div>
        </article>
      </div>
    </div>
  </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.