Snippets Animation

Bootstrap 5 Animated Donut Charts with Legend

Three animated donut charts for answered questions, each with a centred total and a legend of values and percentages that highlights the matching slice on hover or focus.

Bootstrap 5 No jQuery Feb 2020 3.1K views

<section class="wdw-stage">
  <div class="container" style="max-width:1080px">
    <div class="mb-4 mb-lg-5 text-center">
      <span class="wdw-eyebrow">Analytics</span>
      <h1 class="wdw-heading h2 mt-1 mb-0">Answered questions</h1>
    </div>
    <div class="row g-4 row-cols-1 row-cols-md-3">
      <div class="col">
        <figure class="wdw-card h-100 p-4 mb-0 dn-chart d-flex flex-column">
          <figcaption class="mb-3"><span class="wdw-eyebrow">Skill types</span><h2 class="h5 fw-bold mb-0">Micro-skills</h2></figcaption>
          <div class="dn-wrap mx-auto mb-3">
            <svg class="dn-svg" viewBox="0 0 120 120" role="img" aria-label="Micro-skills donut chart: Additive 642 (64%), Multiplicative 358 (36%)"><circle class="dn-track" cx="60" cy="60" r="46" fill="none" stroke-width="16"/></svg>
            <div class="dn-center"><div class="fs-3 fw-bold text-body-emphasis lh-1">1,000</div><div class="small text-body-secondary">answered</div></div>
          </div>
          <p class="dn-stat text-body-secondary text-center mb-3">Top answer: <strong class="text-body-emphasis">Additive</strong> at 64%</p>
          <ul class="list-unstyled mb-0 dn-legend" aria-label="Breakdown"><li class="dn-item d-flex align-items-center gap-2 py-2" data-value="642" data-i="0"><span class="dn-sw dn-c0" aria-hidden="true"></span><span class="flex-grow-1">Additive</span><span class="text-body-secondary small">64%</span><strong class="dn-val">642</strong></li><li class="dn-item d-flex align-items-center gap-2 py-2" data-value="358" data-i="1"><span class="dn-sw dn-c1" aria-hidden="true"></span><span class="flex-grow-1">Multiplicative</span><span class="text-body-secondary small">36%</span><strong class="dn-val">358</strong></li></ul>
        </figure>
      </div>
      <div class="col">
        <figure class="wdw-card h-100 p-4 mb-0 dn-chart d-flex flex-column">
          <figcaption class="mb-3"><span class="wdw-eyebrow">Layouts</span><h2 class="h5 fw-bold mb-0">Categories</h2></figcaption>
          <div class="dn-wrap mx-auto mb-3">
            <svg class="dn-svg" viewBox="0 0 120 120" role="img" aria-label="Categories donut chart: Horizontal 768 (77%), Vertical 232 (23%)"><circle class="dn-track" cx="60" cy="60" r="46" fill="none" stroke-width="16"/></svg>
            <div class="dn-center"><div class="fs-3 fw-bold text-body-emphasis lh-1">1,000</div><div class="small text-body-secondary">answered</div></div>
          </div>
          <p class="dn-stat text-body-secondary text-center mb-3">Top answer: <strong class="text-body-emphasis">Horizontal</strong> at 77%</p>
          <ul class="list-unstyled mb-0 dn-legend" aria-label="Breakdown"><li class="dn-item d-flex align-items-center gap-2 py-2" data-value="768" data-i="0"><span class="dn-sw dn-c0" aria-hidden="true"></span><span class="flex-grow-1">Horizontal</span><span class="text-body-secondary small">77%</span><strong class="dn-val">768</strong></li><li class="dn-item d-flex align-items-center gap-2 py-2" data-value="232" data-i="1"><span class="dn-sw dn-c1" aria-hidden="true"></span><span class="flex-grow-1">Vertical</span><span class="text-body-secondary small">23%</span><strong class="dn-val">232</strong></li></ul>
        </figure>
      </div>
      <div class="col">
        <figure class="wdw-card h-100 p-4 mb-0 dn-chart d-flex flex-column">
          <figcaption class="mb-3"><span class="wdw-eyebrow">Maths</span><h2 class="h5 fw-bold mb-0">Operations</h2></figcaption>
          <div class="dn-wrap mx-auto mb-3">
            <svg class="dn-svg" viewBox="0 0 120 120" role="img" aria-label="Operations donut chart: Addition 486 (49%), Subtraction 156 (16%), Multiplication 215 (22%), Division 143 (14%)"><circle class="dn-track" cx="60" cy="60" r="46" fill="none" stroke-width="16"/></svg>
            <div class="dn-center"><div class="fs-3 fw-bold text-body-emphasis lh-1">1,000</div><div class="small text-body-secondary">answered</div></div>
          </div>
          <p class="dn-stat text-body-secondary text-center mb-3">Top answer: <strong class="text-body-emphasis">Addition</strong> at 49%</p>
          <ul class="list-unstyled mb-0 dn-legend" aria-label="Breakdown"><li class="dn-item d-flex align-items-center gap-2 py-2" data-value="486" data-i="0"><span class="dn-sw dn-c0" aria-hidden="true"></span><span class="flex-grow-1">Addition</span><span class="text-body-secondary small">49%</span><strong class="dn-val">486</strong></li><li class="dn-item d-flex align-items-center gap-2 py-2" data-value="156" data-i="1"><span class="dn-sw dn-c1" aria-hidden="true"></span><span class="flex-grow-1">Subtraction</span><span class="text-body-secondary small">16%</span><strong class="dn-val">156</strong></li><li class="dn-item d-flex align-items-center gap-2 py-2" data-value="215" data-i="2"><span class="dn-sw dn-c2" aria-hidden="true"></span><span class="flex-grow-1">Multiplication</span><span class="text-body-secondary small">22%</span><strong class="dn-val">215</strong></li><li class="dn-item d-flex align-items-center gap-2 py-2" data-value="143" data-i="3"><span class="dn-sw dn-c3" aria-hidden="true"></span><span class="flex-grow-1">Division</span><span class="text-body-secondary small">14%</span><strong class="dn-val">143</strong></li></ul>
        </figure>
      </div>
    </div>
  </div>
</section>

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