Snippets E-commmerce

Bootstrap 5 Product List with Sidebar Filters

An e-commerce product grid with a filter sidebar for room, colour and style that updates the list instantly and folds into a Filters button on mobile.

Bootstrap 5 Bootstrap 6 No jQuery Sep 2020 9.1K views

<section class="wdw-stage p-0 align-items-start">
<div class="w-100">
<nav class="navbar bg-body border-bottom"><div class="container-xxl"><a class="navbar-brand fw-bold" href="#">FORCEPAUSED</a>
<ul class="nav d-none d-md-flex"><li class="nav-item"><a class="nav-link" href="#">Women</a></li><li class="nav-item"><a class="nav-link" href="#">Men</a></li><li class="nav-item"><a class="nav-link active text-body-emphasis" href="#" aria-current="page">Home</a></li><li class="nav-item"><a class="nav-link" href="#">Sale</a></li></ul>
<button class="btn btn-outline-secondary rounded-pill btn-sm d-lg-none" type="button" data-bs-toggle="collapse" data-bs-target="#filters" aria-expanded="false" aria-controls="filters">Filters</button></div></nav>
<div class="container-xxl py-4"><div class="row g-4">
<aside class="col-lg-3 col-xl-2"><div class="collapse d-lg-block" id="filters"><div class="wdw-card-sm p-3 p-lg-4"><div class="mb-4"><h2 class="wdw-eyebrow mb-2">Room</h2><div class="list-group list-group-flush gap-1" id="f-cat"><button type="button" class="list-group-item list-group-item-action border-0 rounded-3 active" data-group="cat" data-value="all">All</button><button type="button" class="list-group-item list-group-item-action border-0 rounded-3 " data-group="cat" data-value="living">Living</button><button type="button" class="list-group-item list-group-item-action border-0 rounded-3 " data-group="cat" data-value="office">Office</button><button type="button" class="list-group-item list-group-item-action border-0 rounded-3 " data-group="cat" data-value="kitchen">Kitchen</button></div></div>
<div class="mb-4"><h2 class="wdw-eyebrow mb-2">Colour</h2><div class="d-flex gap-2 flex-wrap" id="f-color"><input type="radio" class="btn-check" name="color" id="c-all" value="all" autocomplete="off" checked><label class="wdw-swatch" for="c-all" title="Any" style="--c:conic-gradient(#ef4444,#f59e0b,#10b981,#3b82f6,#8b5cf6,#ef4444)"><span class="visually-hidden">Any</span></label><input type="radio" class="btn-check" name="color" id="c-green" value="green" autocomplete="off"><label class="wdw-swatch" for="c-green" title="Green" style="--c:#047857"><span class="visually-hidden">Green</span></label><input type="radio" class="btn-check" name="color" id="c-yellow" value="yellow" autocomplete="off"><label class="wdw-swatch" for="c-yellow" title="Yellow" style="--c:#eab308"><span class="visually-hidden">Yellow</span></label><input type="radio" class="btn-check" name="color" id="c-brown" value="brown" autocomplete="off"><label class="wdw-swatch" for="c-brown" title="Wood" style="--c:#92643a"><span class="visually-hidden">Wood</span></label><input type="radio" class="btn-check" name="color" id="c-blue" value="blue" autocomplete="off"><label class="wdw-swatch" for="c-blue" title="Blue" style="--c:#7dd3fc"><span class="visually-hidden">Blue</span></label><input type="radio" class="btn-check" name="color" id="c-neutral" value="neutral" autocomplete="off"><label class="wdw-swatch" for="c-neutral" title="Neutral" style="--c:#d6d3d1"><span class="visually-hidden">Neutral</span></label></div></div>
<div><h2 class="wdw-eyebrow mb-2">Style</h2><div class="d-flex gap-2 flex-wrap" id="f-style"><input type="radio" class="btn-check" name="style" id="s-all" value="all" autocomplete="off" checked><label class="btn btn-sm btn-outline-secondary rounded-pill" for="s-all">Any</label><input type="radio" class="btn-check" name="style" id="s-modern" value="modern" autocomplete="off"><label class="btn btn-sm btn-outline-secondary rounded-pill" for="s-modern">Modern</label><input type="radio" class="btn-check" name="style" id="s-classic" value="classic" autocomplete="off"><label class="btn btn-sm btn-outline-secondary rounded-pill" for="s-classic">Classic</label><input type="radio" class="btn-check" name="style" id="s-rustic" value="rustic" autocomplete="off"><label class="btn btn-sm btn-outline-secondary rounded-pill" for="s-rustic">Rustic</label></div></div></div></div></aside>
<main class="col-lg-9 col-xl-10"><div class="d-flex justify-content-between align-items-baseline mb-3"><h1 class="h4 wdw-heading mb-0">Home furniture</h1><span class="small wdw-muted" id="p-count" role="status"></span></div>
<div class="row g-3" id="p-grid"><div class="col-6 col-md-4 col-xl-3 wdw-prod" data-cat="kitchen" data-color="blue" data-style="modern">
<article class="card h-100 border-0 shadow-sm rounded-4 overflow-hidden">
<div class="ratio ratio-1x1"><img src="https://images.unsplash.com/photo-1503602642458-232111445657?auto=format&fit=crop&w=500&h=500&q=70" class="object-fit-cover" alt="Pale oak stool" loading="lazy"></div>
<div class="card-body p-3"><h2 class="h6 mb-1">Pale oak stool</h2><div class="d-flex justify-content-between align-items-center"><span class="fw-bold">$90</span><span class="small wdw-muted text-capitalize">kitchen</span></div></div>
</article></div>
<div class="col-6 col-md-4 col-xl-3 wdw-prod" data-cat="office" data-color="neutral" data-style="modern">
<article class="card h-100 border-0 shadow-sm rounded-4 overflow-hidden">
<div class="ratio ratio-1x1"><img src="https://images.unsplash.com/photo-1524758631624-e2822e304c36?auto=format&fit=crop&w=500&h=500&q=70" class="object-fit-cover" alt="Studio workspace" loading="lazy"></div>
<div class="card-body p-3"><h2 class="h6 mb-1">Studio workspace</h2><div class="d-flex justify-content-between align-items-center"><span class="fw-bold">$480</span><span class="small wdw-muted text-capitalize">office</span></div></div>
</article></div>
<div class="col-6 col-md-4 col-xl-3 wdw-prod" data-cat="living" data-color="green" data-style="classic">
<article class="card h-100 border-0 shadow-sm rounded-4 overflow-hidden">
<div class="ratio ratio-1x1"><img src="https://images.unsplash.com/photo-1555041469-a586c61ea9bc?auto=format&fit=crop&w=500&h=500&q=70" class="object-fit-cover" alt="Emerald velvet sofa" loading="lazy"></div>
<div class="card-body p-3"><h2 class="h6 mb-1">Emerald velvet sofa</h2><div class="d-flex justify-content-between align-items-center"><span class="fw-bold">$950</span><span class="small wdw-muted text-capitalize">living</span></div></div>
</article></div>
<div class="col-6 col-md-4 col-xl-3 wdw-prod" data-cat="living" data-color="neutral" data-style="rustic">
<article class="card h-100 border-0 shadow-sm rounded-4 overflow-hidden">
<div class="ratio ratio-1x1"><img src="https://images.unsplash.com/photo-1493809842364-78817add7ffb?auto=format&fit=crop&w=500&h=500&q=70" class="object-fit-cover" alt="Sunlit living room set" loading="lazy"></div>
<div class="card-body p-3"><h2 class="h6 mb-1">Sunlit living room set</h2><div class="d-flex justify-content-between align-items-center"><span class="fw-bold">$390</span><span class="small wdw-muted text-capitalize">living</span></div></div>
</article></div>
<div class="col-6 col-md-4 col-xl-3 wdw-prod" data-cat="living" data-color="neutral" data-style="modern">
<article class="card h-100 border-0 shadow-sm rounded-4 overflow-hidden">
<div class="ratio ratio-1x1"><img src="https://images.unsplash.com/photo-1493663284031-b7e3aefcae8e?auto=format&fit=crop&w=500&h=500&q=70" class="object-fit-cover" alt="Grey sofa with coffee table" loading="lazy"></div>
<div class="card-body p-3"><h2 class="h6 mb-1">Grey sofa with coffee table</h2><div class="d-flex justify-content-between align-items-center"><span class="fw-bold">$740</span><span class="small wdw-muted text-capitalize">living</span></div></div>
</article></div>
<div class="col-6 col-md-4 col-xl-3 wdw-prod" data-cat="living" data-color="brown" data-style="rustic">
<article class="card h-100 border-0 shadow-sm rounded-4 overflow-hidden">
<div class="ratio ratio-1x1"><img src="https://images.unsplash.com/photo-1556228453-efd6c1ff04f6?auto=format&fit=crop&w=500&h=500&q=70" class="object-fit-cover" alt="Boho lounge set" loading="lazy"></div>
<div class="card-body p-3"><h2 class="h6 mb-1">Boho lounge set</h2><div class="d-flex justify-content-between align-items-center"><span class="fw-bold">$860</span><span class="small wdw-muted text-capitalize">living</span></div></div>
</article></div>
<div class="col-6 col-md-4 col-xl-3 wdw-prod" data-cat="living" data-color="neutral" data-style="classic">
<article class="card h-100 border-0 shadow-sm rounded-4 overflow-hidden">
<div class="ratio ratio-1x1"><img src="https://images.unsplash.com/photo-1567538096630-e0c55bd6374c?auto=format&fit=crop&w=500&h=500&q=70" class="object-fit-cover" alt="Tufted armchair" loading="lazy"></div>
<div class="card-body p-3"><h2 class="h6 mb-1">Tufted armchair</h2><div class="d-flex justify-content-between align-items-center"><span class="fw-bold">$310</span><span class="small wdw-muted text-capitalize">living</span></div></div>
</article></div>
<div class="col-6 col-md-4 col-xl-3 wdw-prod" data-cat="office" data-color="yellow" data-style="modern">
<article class="card h-100 border-0 shadow-sm rounded-4 overflow-hidden">
<div class="ratio ratio-1x1"><img src="https://images.unsplash.com/photo-1586023492125-27b2c045efd7?auto=format&fit=crop&w=500&h=500&q=70" class="object-fit-cover" alt="Mustard accent chair" loading="lazy"></div>
<div class="card-body p-3"><h2 class="h6 mb-1">Mustard accent chair</h2><div class="d-flex justify-content-between align-items-center"><span class="fw-bold">$270</span><span class="small wdw-muted text-capitalize">office</span></div></div>
</article></div>
</div>
<p class="text-center wdw-muted py-5 d-none" id="p-empty">No products match these filters.</p></main>
</div></div></div></section>

Built on Bootstrap 6.0.0-alpha.1 (ES modules, no jQuery). Load Bootstrap through an import map and run the JavaScript as type="module" — the downloaded file is already set up that way. Alpha releases can still change class names.

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