Scroll-triggered Animated Column Chart With jQuery And CSS3

Scroll-triggered Animated Column Chart With jQuery And CSS3
File Size: 4.83 KB
Views Total:
Last Update:
Publish Date:
Official Website: Go to website
License: MIT
   

A tiny jQuery based animated percentage column chart that has the ability to animate the graphs when they scrolled into the viewport.

How to use it:

1. The html markup for the column chart.

<div class="graph-container">
  <div class="bar-overflow"> 
    <div class="graph-bar placebo-bar"> 
      <p>60<sup>%</sup></p> 
    </div>  
    <div class="graph-bar creon-bar">
      <p>40<sup>%</sup></p>
    </div>
  </div>       
  <div class="y-axis-units">
    <p class="unit-100">100</p>
    <p class="unit-80">80</p>
    <p class="unit-60">60</p>
    <p class="unit-40">40</p>
    <p class="unit-20">20</p>
    <p class="unit-0">0</p>
  </div>
</div>

2. The required CSS to style the column chart.

.graph-container {
  height: 219px;
  width: 450px;
  border: 1px solid #a0a0a0;
  border-right: none;
  border-top: none;
  position: relative;
  margin-left: auto;
  margin-right: auto;
}

.graph-container .graph-bar {
  position: absolute;
  width: 162px;
  padding-top: 15px;
  padding-left: 10px;
  bottom: -100%;
}

.graph-container .graph-bar p {
  font-family: 'HelveticaNeueW01-75Bold', Arial, Helvetica, sans-serif;
  color: #ffffff;
  text-align: center;
  font-size: 44px;
  display: none;
  position: relative;
  top: -25px;
}

.graph-container .graph-bar.placebo-bar {
  background: -webkit-gradient(radial, center center, 0, center center, 100%, color-stop(0%, #a4a4a4), color-stop(60%, #868686), color-stop(100%, #868686));
  background: -webkit-radial-gradient(center, circle cover, #a4a4a4 0%, #868686 60%, #868686 100%);
  background: -webkit-radial-gradient(center circle, #a4a4a4 0%, #868686 60%, #868686 100%);
  background: radial-gradient(circle at center, #a4a4a4 0%, #868686 60%, #868686 100%);
  background: #868686;
  background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY3g9IjUwJSIgY3k9IjUwJSIgcj0iNzUlIj4KICAgIDxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiNhNGE0YTQiIHN0b3Atb3BhY2l0eT0iMSIvPgogICAgPHN0b3Agb2Zmc2V0PSI2MCUiIHN0b3AtY29sb3I9IiM4Njg2ODYiIHN0b3Atb3BhY2l0eT0iMSIvPgogICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjODY4Njg2IiBzdG9wLW9wYWNpdHk9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyZWN0IHg9Ii01MCIgeT0iLTUwIiB3aWR0aD0iMTAxIiBoZWlnaHQ9IjEwMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
  left: 0;
  background-size: cover;
}

.graph-container .graph-bar.creon-bar {
  background: -webkit-gradient(radial, center center, 0, center center, 100%, color-stop(0%, #1996cb), color-stop(60%, #1575a0), color-stop(100%, #1575a0));
  background: -webkit-radial-gradient(center, circle cover, #1996cb 0%, #1575a0 60%, #1575a0 100%);
  background: -webkit-radial-gradient(center circle, #1996cb 0%, #1575a0 60%, #1575a0 100%);
  background: radial-gradient(circle at center, #1996cb 0%, #1575a0 60%, #1575a0 100%);
  background: #1575a0;
  background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY3g9IjUwJSIgY3k9IjUwJSIgcj0iNzUlIj4KICAgIDxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiMxODljZDMiIHN0b3Atb3BhY2l0eT0iMSIvPgogICAgPHN0b3Agb2Zmc2V0PSI2MCUiIHN0b3AtY29sb3I9IiMxNTc1YTAiIHN0b3Atb3BhY2l0eT0iMSIvPgogICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjMTU3NWEwIiBzdG9wLW9wYWNpdHk9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyZWN0IHg9Ii01MCIgeT0iLTUwIiB3aWR0aD0iMTAxIiBoZWlnaHQ9IjEwMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
  background-size: cover;
}

.bar-overflow {
  overflow: hidden;
  position: relative;
  width: 450px;
  height: 207px;
  bottom: -12px;
}

.graph-container .y-axis-label {
  transform: rotate(-90deg);
  -ms-transform: rotate(-90deg);
  -webkit-transform: rotate(-90deg);
  -moz-transform: rotate(-90deg);
  position: absolute;
  top: 45px;
  left: -62px;
}

.graph-container .y-axis-label p {
  font-size: 10px;
  color: #004d71;
}

.graph-container .y-axis-units {
  position: absolute;
  bottom: -2px;
  left: -21px;
  height: 242px;
  width: 0;
}

.graph-container .y-axis-units p {
  font-size: 10px;
  color: #868686;
  text-align: right;
  margin-bottom: 0;
  position: absolute;
  width: 18px;
}

.graph-container .y-axis-units p.unit-100 {
  top: -1px;
  left: -1px;
}

.graph-container .y-axis-units p.unit-80 { top: 23px; }

.graph-container .y-axis-units p.unit-60 { top: 46px; }

.graph-container .y-axis-units p.unit-40 { top: 69px; }

.graph-container .y-axis-units p.unit-20 { top: 91px; }

.graph-container .y-axis-units p.unit-0 { bottom: -6px; }

.graph-container .y-axis-units p.unit-0:after { top: 2px; }

.graph-container .y-axis-units p:after {
  content: "\00af";
  position: relative;
  right: -2px;
  font-size: 9px;
  top: 1px;
}

.graph-container .graph-bar.placebo-bar { left: 34px; }

.graph-container .graph-bar.creon-bar { left: 242px; }

.graph-container .y-axis-label {
  top: 85px;
  left: -79px;
}

.graph-container .y-axis-label p { font-size: 13px; }

.graph-container .y-axis-units {
  left: -29px;
  bottom: -4px;
  height: 242px;
}

.graph-container .y-axis-units p {
  font-size: 13px;
  width: 25px;
}

.graph-container .y-axis-units p.unit-100 {
  top: -1px;
  left: 0;
}

.graph-container .y-axis-units p.unit-80 { top: 43px; }

.graph-container .y-axis-units p.unit-60 { top: 85px; }

.graph-container .y-axis-units p.unit-40 { top: 128px; }

.graph-container .y-axis-units p.unit-20 { top: 170px; }

.graph-container .y-axis-units p.unit-0 { bottom: -7px; }

.graph-container .y-axis-units p.unit-0:after { top: 2px; }

3. Include the latest version of the jQuery library at the bottom of the webpage.

<script src="//code.jquery.com/jquery-3.2.0.min.js"></script> 

4. The core jQuery script to active the column chart.

var $win = $(window),
    $win_height = $(window).height(),
    windowPercentage = ($(window).height() * 1.4) // - multiple of viewport height - The higher this number the sooner triggered.

$win.on('scroll', scrollReveal);

function scrollReveal() {
    var scrolled = $win.scrollTop();
    $(".graph-bar").each(function() {
        var $this = $(this),
            offsetTop = $this.offset().top;
        if (scrolled + windowPercentage > offsetTop || $win_height > offsetTop) {
            var mql = window.matchMedia("screen and (min-width: 100px)") // Placeholder media query
            if (mql.matches) { // if media query matches
                var height1 = $(this).find("p").text(); // Getting the bar % from the text in the P
                var height2 = height1.substr(0, 2); // using only the first 2 chars
                var height3 = height2 * 2.07; // converting % to px - 206px is the height of the graph box - i.e. a 100% bar
            } else {
                var height1 = $(this).find("p").text(); // Getting the bar % from the text in the P
                var height2 = height1.substr(0, 2); // using only the first 2 chars
                var height3 = height2 * 1.15; // converting % to px - 206px is the height of the graph box - i.e. a 100% bar
            }
            $(this).css("height", height3);
            $(this).animate({
                'bottom': 0
            }, 1000, function() {
                $(this).find("p").fadeIn(800);
            });
        }
    });
}

scrollReveal();

This awesome jQuery plugin is developed by EricPorter. For more Advanced Usages, please check the demo page or visit the official website.