Snippets E-commmerce

Bootstrap 5 Product Listing with Filters

A product listing with a filter sidebar for category, brand and maximum price, plus sorting, wishlist hearts and add-to-cart buttons. Filters update the grid instantly.

Bootstrap 5 No jQuery Aug 2020 2.2K views

<section class="wdw-stage align-items-start align-items-lg-center"><div class="container" style="max-width:1180px">
<div class="d-flex flex-wrap align-items-end justify-content-between gap-3 mb-4">
<div><span class="wdw-eyebrow">Shop</span><h2 class="wdw-heading mb-0 mt-1">Computers & gear</h2></div>
<div class="d-flex align-items-center gap-2"><span class="wdw-muted small" id="plCount" aria-live="polite">6 products</span>
<label for="plSort" class="visually-hidden">Sort by</label><select id="plSort" class="form-select form-select-sm" style="width:auto;min-height:40px"><option value="feat">Featured</option><option value="low">Price: low to high</option><option value="high">Price: high to low</option></select></div></div>
<div class="row g-4">
<aside class="col-lg-3"><form class="wdw-card p-4 d-flex flex-column gap-4" id="plFilters" aria-label="Product filters">
<fieldset><legend class="wdw-eyebrow mb-2">Category</legend>
<div class="d-flex flex-wrap gap-2">
<input type="radio" class="btn-check" name="cat" id="cat-all" value="" checked><label class="btn btn-sm btn-outline-primary rounded-pill" for="cat-all">All</label>
<input type="radio" class="btn-check" name="cat" id="cat-Laptops" value="Laptops"><label class="btn btn-sm btn-outline-primary rounded-pill" for="cat-Laptops">Laptops</label>
<input type="radio" class="btn-check" name="cat" id="cat-Wearables" value="Wearables"><label class="btn btn-sm btn-outline-primary rounded-pill" for="cat-Wearables">Wearables</label>
<input type="radio" class="btn-check" name="cat" id="cat-Footwear" value="Footwear"><label class="btn btn-sm btn-outline-primary rounded-pill" for="cat-Footwear">Footwear</label>
<input type="radio" class="btn-check" name="cat" id="cat-Audio" value="Audio"><label class="btn btn-sm btn-outline-primary rounded-pill" for="cat-Audio">Audio</label>
<input type="radio" class="btn-check" name="cat" id="cat-Cameras" value="Cameras"><label class="btn btn-sm btn-outline-primary rounded-pill" for="cat-Cameras">Cameras</label>
</div></fieldset>
<fieldset><legend class="wdw-eyebrow mb-2">Brand</legend><div class="d-grid gap-2">
<div class="form-check d-flex justify-content-between ps-0"><div><input class="form-check-input ms-0 me-2" type="checkbox" name="brand" value="Acer" id="b-Acer"><label class="form-check-label" for="b-Acer">Acer</label></div><span class="wdw-muted small">1</span></div>
<div class="form-check d-flex justify-content-between ps-0"><div><input class="form-check-input ms-0 me-2" type="checkbox" name="brand" value="Asus" id="b-Asus"><label class="form-check-label" for="b-Asus">Asus</label></div><span class="wdw-muted small">1</span></div>
<div class="form-check d-flex justify-content-between ps-0"><div><input class="form-check-input ms-0 me-2" type="checkbox" name="brand" value="Dell" id="b-Dell"><label class="form-check-label" for="b-Dell">Dell</label></div><span class="wdw-muted small">1</span></div>
<div class="form-check d-flex justify-content-between ps-0"><div><input class="form-check-input ms-0 me-2" type="checkbox" name="brand" value="Hygen" id="b-Hygen"><label class="form-check-label" for="b-Hygen">Hygen</label></div><span class="wdw-muted small">1</span></div>
<div class="form-check d-flex justify-content-between ps-0"><div><input class="form-check-input ms-0 me-2" type="checkbox" name="brand" value="Polaroid" id="b-Polaroid"><label class="form-check-label" for="b-Polaroid">Polaroid</label></div><span class="wdw-muted small">1</span></div>
<div class="form-check d-flex justify-content-between ps-0"><div><input class="form-check-input ms-0 me-2" type="checkbox" name="brand" value="Nike" id="b-Nike"><label class="form-check-label" for="b-Nike">Nike</label></div><span class="wdw-muted small">1</span></div>
</div></fieldset>
<div><label for="plPrice" class="wdw-eyebrow d-flex justify-content-between mb-2"><span>Max price</span><span id="plPriceOut" class="text-body-emphasis">$2,000</span></label><input type="range" class="form-range" id="plPrice" min="100" max="2000" step="50" value="2000"></div>
<button type="reset" class="btn btn-outline-secondary rounded-pill" id="plReset">Reset filters</button>
</form></aside>
<div class="col-lg-9"><div class="row row-cols-1 row-cols-sm-2 row-cols-xl-3 g-4" id="plGrid">
<div class="col" data-cat="Footwear" data-brand="Nike" data-price="1999.99" data-order="0"><article class="wdw-card h-100 overflow-hidden wdw-product d-flex flex-column">
<div class="position-relative bg-body-tertiary"><img src="https://images.unsplash.com/photo-1542291026-7eec264c27ff?auto=format&fit=crop&w=600&q=75" alt="XRD Active Shoes" class="w-100 object-fit-cover d-block" style="height:200px" loading="lazy"><span class="badge rounded-pill bg-success position-absolute top-0 end-0 m-3">-25%</span></div>
<div class="p-3 p-md-4 d-flex flex-column flex-grow-1"><span class="wdw-muted small">Footwear · Nike</span><h3 class="h6 fw-bold mt-1 mb-2">XRD Active Shoes</h3><p class="fw-bold text-primary mb-3">$1,999.99</p>
<div class="d-flex gap-2 mt-auto"><button type="button" class="btn btn-primary btn-sm rounded-pill flex-grow-1" data-cart>Add to cart</button><button type="button" class="btn btn-outline-secondary btn-sm rounded-circle p-0 flex-none" style="width:36px" data-wish aria-pressed="false" aria-label="Save XRD Active Shoes to wishlist"><i class="bi bi-heart" aria-hidden="true"></i></button></div></div></article></div>
<div class="col" data-cat="Wearables" data-brand="Hygen" data-price="123.43" data-order="1"><article class="wdw-card h-100 overflow-hidden wdw-product d-flex flex-column">
<div class="position-relative bg-body-tertiary"><img src="https://images.unsplash.com/photo-1523275335684-37898b6baf30?auto=format&fit=crop&w=600&q=75" alt="Hygen Smart Watch" class="w-100 object-fit-cover d-block" style="height:200px" loading="lazy"><span class="badge rounded-pill bg-warning text-dark position-absolute top-0 end-0 m-3">Sale</span></div>
<div class="p-3 p-md-4 d-flex flex-column flex-grow-1"><span class="wdw-muted small">Wearables · Hygen</span><h3 class="h6 fw-bold mt-1 mb-2">Hygen Smart Watch</h3><p class="fw-bold text-primary mb-3">$123.43</p>
<div class="d-flex gap-2 mt-auto"><button type="button" class="btn btn-primary btn-sm rounded-pill flex-grow-1" data-cart>Add to cart</button><button type="button" class="btn btn-outline-secondary btn-sm rounded-circle p-0 flex-none" style="width:36px" data-wish aria-pressed="false" aria-label="Save Hygen Smart Watch to wishlist"><i class="bi bi-heart" aria-hidden="true"></i></button></div></div></article></div>
<div class="col" data-cat="Laptops" data-brand="Acer" data-price="1999.99" data-order="2"><article class="wdw-card h-100 overflow-hidden wdw-product d-flex flex-column">
<div class="position-relative bg-body-tertiary"><img src="https://images.unsplash.com/photo-1496181133206-80ce9b88a853?auto=format&fit=crop&w=600&q=75" alt="Acer Surface Book 2.5" class="w-100 object-fit-cover d-block" style="height:200px" loading="lazy"></div>
<div class="p-3 p-md-4 d-flex flex-column flex-grow-1"><span class="wdw-muted small">Laptops · Acer</span><h3 class="h6 fw-bold mt-1 mb-2">Acer Surface Book 2.5</h3><p class="fw-bold text-primary mb-3">$1,999.99</p>
<div class="d-flex gap-2 mt-auto"><button type="button" class="btn btn-primary btn-sm rounded-pill flex-grow-1" data-cart>Add to cart</button><button type="button" class="btn btn-outline-secondary btn-sm rounded-circle p-0 flex-none" style="width:36px" data-wish aria-pressed="false" aria-label="Save Acer Surface Book 2.5 to wishlist"><i class="bi bi-heart" aria-hidden="true"></i></button></div></div></article></div>
<div class="col" data-cat="Laptops" data-brand="Dell" data-price="1245.89" data-order="3"><article class="wdw-card h-100 overflow-hidden wdw-product d-flex flex-column">
<div class="position-relative bg-body-tertiary"><img src="https://images.unsplash.com/photo-1588872657578-7efd1f1555ed?auto=format&fit=crop&w=600&q=75" alt="Dell XPS Surface" class="w-100 object-fit-cover d-block" style="height:200px" loading="lazy"><span class="badge rounded-pill bg-success position-absolute top-0 end-0 m-3">-10%</span></div>
<div class="p-3 p-md-4 d-flex flex-column flex-grow-1"><span class="wdw-muted small">Laptops · Dell</span><h3 class="h6 fw-bold mt-1 mb-2">Dell XPS Surface</h3><p class="fw-bold text-primary mb-3">$1,245.89</p>
<div class="d-flex gap-2 mt-auto"><button type="button" class="btn btn-primary btn-sm rounded-pill flex-grow-1" data-cart>Add to cart</button><button type="button" class="btn btn-outline-secondary btn-sm rounded-circle p-0 flex-none" style="width:36px" data-wish aria-pressed="false" aria-label="Save Dell XPS Surface to wishlist"><i class="bi bi-heart" aria-hidden="true"></i></button></div></div></article></div>
<div class="col" data-cat="Audio" data-brand="Asus" data-price="249.0" data-order="4"><article class="wdw-card h-100 overflow-hidden wdw-product d-flex flex-column">
<div class="position-relative bg-body-tertiary"><img src="https://images.unsplash.com/photo-1505740420928-5e560c06d30e?auto=format&fit=crop&w=600&q=75" alt="Studio Headphones" class="w-100 object-fit-cover d-block" style="height:200px" loading="lazy"></div>
<div class="p-3 p-md-4 d-flex flex-column flex-grow-1"><span class="wdw-muted small">Audio · Asus</span><h3 class="h6 fw-bold mt-1 mb-2">Studio Headphones</h3><p class="fw-bold text-primary mb-3">$249.00</p>
<div class="d-flex gap-2 mt-auto"><button type="button" class="btn btn-primary btn-sm rounded-pill flex-grow-1" data-cart>Add to cart</button><button type="button" class="btn btn-outline-secondary btn-sm rounded-circle p-0 flex-none" style="width:36px" data-wish aria-pressed="false" aria-label="Save Studio Headphones to wishlist"><i class="bi bi-heart" aria-hidden="true"></i></button></div></div></article></div>
<div class="col" data-cat="Cameras" data-brand="Polaroid" data-price="899.0" data-order="5"><article class="wdw-card h-100 overflow-hidden wdw-product d-flex flex-column">
<div class="position-relative bg-body-tertiary"><img src="https://images.unsplash.com/photo-1526170375885-4d8ecf77b99f?auto=format&fit=crop&w=600&q=75" alt="Instant Camera" class="w-100 object-fit-cover d-block" style="height:200px" loading="lazy"><span class="badge rounded-pill bg-success position-absolute top-0 end-0 m-3">-5%</span></div>
<div class="p-3 p-md-4 d-flex flex-column flex-grow-1"><span class="wdw-muted small">Cameras · Polaroid</span><h3 class="h6 fw-bold mt-1 mb-2">Instant Camera</h3><p class="fw-bold text-primary mb-3">$899.00</p>
<div class="d-flex gap-2 mt-auto"><button type="button" class="btn btn-primary btn-sm rounded-pill flex-grow-1" data-cart>Add to cart</button><button type="button" class="btn btn-outline-secondary btn-sm rounded-circle p-0 flex-none" style="width:36px" data-wish aria-pressed="false" aria-label="Save Instant Camera to wishlist"><i class="bi bi-heart" aria-hidden="true"></i></button></div></div></article></div>
</div><div class="wdw-card p-5 text-center d-none" id="plEmpty"><h3 class="h5 fw-bold">No products match</h3><p class="wdw-muted mb-0">Try removing a filter or raising the price limit.</p></div></div></div></div></section>

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