Elastic Progress JQuery Tutorial

Today we’d like to share an interesting progress button effect with you. The effect is based on a very nice Dribbble shot called “Download” by xjw. The button starts as an icon with an arrow and once it’s clicked, it animates into a fun little wire and a label that indicates the download percentage.
Here you can learn to creates a button that turns into a progress bar with a elastic effect.

Take a look:


This project requires GSAP. You can use either TweenMax...
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.18.0/TweenMax.min.js"></script>
...or TweenLite, with EasePack and the CSS and attr plugins:
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.18.0/TweenLite.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.18.0/easing/EasePack.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.18.0/plugins/CSSPlugin.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.18.0/plugins/AttrPlugin.min.js"></script>
Then, include the elastic-progress.min.js file, located in the dist folder:
<script src="path/to/js/elastic-progress.min.js"></script>

How to implements

Create the element you want to turn into a button:
<div class="Upload" role="button" aria-label="Upload file"></div>
Note: We are using a div element with role="button" instead of a button element because, according to W3C recommendation, button elements should have no interactive elements as descendants.

Demo and Download full source code 

Then, via JS:

var element=document.querySelector('.Upload');
var progress=new ElasticProgress(element, { /*options*/ });

// or...

var progress=new ElasticProgress('.Upload', { /*options*/});

Or, in case you are using jQuery:


Setting Options

Options are set on the constructor, like this:
var progress=new ElasticProgress('.Upload', {
A complete list of options can be found below.

Calling Methods

The button doesn't do much by itself - controlling the opening, bar progress, etc. is in your charge.
var progress=new ElasticProgress('.Upload', {
  // ...
function theFunctionYouAreUsingToCheckProgress(){
  // ...

// with jQuery
  // ...

function theFunctionYouAreUsingToCheckProgress(){
  // ...
A complete list of methods can be found below.


  • arrowDirection string

Either 'up' or 'down'. Defaults to 'down'.


  • colorFg, colorBg string

Colors of the foreground (the arrow, the filled part of the progress bar) and the background (the circle, the empty part of the progress bar), respectively. Defaults are white and black.

  • highlightColor string

Color of the highlight outline. Defaults to #08F.

  • background string

Color of the overlay during the "pop" animation. Defaults to the background color of the body.


  • buttonSize number

Circumference of the button. Defaults to the height of the element.

  • width number

Width of the expanded progress bar. Defaults to the width of the element.

  • labelHeight number

Height of the label, in pixels. Defaults to 53.

  • barHeight number

Thickness of the progress bar. Defaults to 4.

  • barInset number

Inset of the filled part of the progress bar. Defaults to -0.5 Helps covering jagged edges.

  • bleedTop, bleedRight, bleedLeft and bleedBottom number

Margin to draw the graphics. If there's clipping during the animation, increase these values. Performance might take a hit for values too large. Defaults to 100, 50, 50 and 60 respectively.


  • fontFamily string

Font used for the label. Defaults to 'Helvetica Neue','Helvetica','Arial',sans-serif. This default is added to the value set, so there's no need to manually set these as fallback.

  • fontWeight string

Defaults to 'bold'.

  • textComplete, textFail and textCancel string

Texts that will be shown on these events. Defaults are 'Done', 'Failed' and 'Canceled'.


  • barStretch number

The maximum distance the bar will stretch. Defaults to 20.

  • jumpHeight number

How hight the arrow/label will jump. Defaults to 50.

  • barElasticOvershoot and barElasticPeriod number

Settings for the elastic animation. Defaults are 1.8 and 0.15, respectively.

  • labelWobbliness number

Setting for the animation of the label during progress. Defaults to 40.

  • arrowHangOnFail and arrowHangOnCancel boolean

Whether the arrow should 'fall' on these events or not. Default is true for both.


  • onClick function

Called when the user clicks the button only.

  • onOpen function

Called when the progress bar finishes the opening animation.

  • onChange function

Called when the bar value is changed.

  • onComplete function

Called when the bar is full.

  • onClose function

Called when the close animation is finished.

  • onFail function

Called when the fail animation starts.

  • onCancel function

Called when the cancel animation starts.


  • open()

Starts the opening animation (turns the button into a progress bar).

  • close()

Turns the progress bar back into a button.

  • setValue(valuenumber)

Sets the percentage loaded of the progress bar. From 0 to 1.

  • getValue() number

Returns the current value of the progress bar.

  • fail() and cancel()

Runs the fail and the cancel animations, respectively.

  • complete()

Runs the complete animation, regardless of the progress. You should probably call setValue(1) instead.

  • onClick(callbackfunction), onOpen(callbackfunction), onChange(callbackfunction), onComplete(callbackfunction), onClose(callbackfunction), onFail(callbackfunction) and onCancel(callbackfunction)

Aliases to the options of the same name.

We hope you enjoyed this progress button and find it useful!

Embed this post on your website Embed