Snippets Icons

Bootstrap 5 Weather Forecast Sidebar

A weather sidebar card with the current conditions and a five-day forecast list that switches between Celsius and Fahrenheit.

Bootstrap 5 No jQuery Dec 2019 3K views

<section class="wdw-stage">
  <div class="container" style="max-width:520px">
    <aside class="wdw-card overflow-hidden" aria-label="Weather forecast">
      <div class="wdw-aurora p-4 p-sm-5">
        <div class="d-flex justify-content-between align-items-start">
          <div>
            <h2 class="h4 fw-bold mb-0">New Delhi</h2>
            <small class="opacity-75">Sunday, 15 March</small>
          </div>
          <div class="d-flex align-items-center gap-3">
            <svg class="flex-shrink-0" width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 16.2A4.5 4.5 0 0 0 18 8h-1.3A7 7 0 1 0 4 14.3"/><path d="M8 19v2M12 19v2M16 19v2"/></svg>
            <div class="text-end">
              <span class="fs-1 fw-bold lh-1"><span id="wxNow" data-c="32">32</span>°</span>
              <div class="small opacity-75">Rainy</div>
            </div>
          </div>
        </div>
      </div>
      <div class="p-4 p-sm-5">
        <div class="d-flex justify-content-between align-items-center mb-3 gap-3">
          <h3 class="h6 fw-bold mb-0">5-day forecast</h3>
          <div class="d-flex gap-2" role="group" aria-label="Temperature unit">
            <input type="radio" class="btn-check" name="wxUnit" id="wxC" value="C" checked>
            <label class="btn btn-outline-primary rounded-pill px-3" for="wxC">°C</label>
            <input type="radio" class="btn-check" name="wxUnit" id="wxF" value="F">
            <label class="btn btn-outline-primary rounded-pill px-3" for="wxF">°F</label>
          </div>
        </div>
        <ul class="list-unstyled mb-0" id="wxList" aria-live="polite">
          <li class="fc-row" data-hi="31" data-lo="25"><span class="fc-day">Mon</span><svg class="text-primary flex-shrink-0" width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 16.2A4.5 4.5 0 0 0 18 8h-1.3A7 7 0 1 0 4 14.3"/><path d="M8 19v2M12 19v2M16 19v2"/></svg><span class="fc-cond text-truncate">Light rain</span><span class="fc-lo">25°</span><div class="fc-range progress" role="presentation"><div class="progress-bar" style="margin-left:19%;width:38%"></div></div><span class="fc-hi">31°</span></li>
          <li class="fc-row" data-hi="34" data-lo="26"><span class="fc-day">Tue</span><svg class="text-primary flex-shrink-0" width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"/></svg><span class="fc-cond text-truncate">Sunny</span><span class="fc-lo">26°</span><div class="fc-range progress" role="presentation"><div class="progress-bar" style="margin-left:25%;width:50%"></div></div><span class="fc-hi">34°</span></li>
          <li class="fc-row" data-hi="33" data-lo="25"><span class="fc-day">Wed</span><svg class="text-primary flex-shrink-0" width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M17.5 19H9a7 7 0 1 1 6.7-9h1.8a4.5 4.5 0 1 1 0 9z"/></svg><span class="fc-cond text-truncate">Partly cloudy</span><span class="fc-lo">25°</span><div class="fc-range progress" role="presentation"><div class="progress-bar" style="margin-left:19%;width:50%"></div></div><span class="fc-hi">33°</span></li>
          <li class="fc-row" data-hi="29" data-lo="24"><span class="fc-day">Thu</span><svg class="text-primary flex-shrink-0" width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M19 16.9A5 5 0 0 0 18 7h-1.26a8 8 0 1 0-11.62 9"/><path d="m13 11-4 6h6l-4 6"/></svg><span class="fc-cond text-truncate">Thunderstorms</span><span class="fc-lo">24°</span><div class="fc-range progress" role="presentation"><div class="progress-bar" style="margin-left:12%;width:31%"></div></div><span class="fc-hi">29°</span></li>
          <li class="fc-row" data-hi="35" data-lo="27"><span class="fc-day">Fri</span><svg class="text-primary flex-shrink-0" width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"/></svg><span class="fc-cond text-truncate">Sunny</span><span class="fc-lo">27°</span><div class="fc-range progress" role="presentation"><div class="progress-bar" style="margin-left:31%;width:50%"></div></div><span class="fc-hi">35°</span></li>
        </ul>
      </div>
    </aside>
  </div>
</section>

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