<!-- SVG templates -->
<!-- Would have used <use> but it's tricky to style and trasition Shadow DOM elements -->
<svg class="svg--template loader">
<circle class="circle1" stroke="none" stroke-width="4" fill="none" r="25" cx="25" cy="25"/>
</svg>
<svg class="svg--template checkmark" viewBox="0 0 50 50">
<g class="checkmark1">
<path class="line1" d="M20.8,36l-4,4c-0.7,0.7-1.7,0.7-2.4,0L0.8,26.4c-0.7-0.7-0.7-1.7,0-2.4l4-4c0.7-0.7,1.7-0.7,2.4,0l13.6,13.6
C21.5,34.3,21.5,35.4,20.8,36z"/>
<path class="line2" d="M14.5,39.9l-4-4c-0.7-0.7-0.7-1.7,0-2.4L43.4,0.6c0.7-0.7,1.7-0.7,2.4,0l4,4c0.7,0.7,0.7,1.7,0,2.4L16.9,39.9
C16.3,40.6,15.2,40.6,14.5,39.9z"/>
</g>
</svg>
<svg class="svg--template" viewBox="0 0 304 305" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg">
<symbol id="shadow--logo-dribbble">
<path id="SVGID_1_" d="M152,298.2C73,298.2,8.7,234,8.7,155.1C8.7,76.2,73,12,152,12c79,0,143.3,64.2,143.3,143.1
C295.3,234,231,298.2,152,298.2L152,298.2z M272.8,174.7c-4.2-1.3-37.9-11.4-76.2-5.2c16,43.9,22.5,79.7,23.8,87.1
C247.8,238.1,267.4,208.7,272.8,174.7L272.8,174.7z M199.8,267.8c-1.8-10.7-8.9-48.1-26.1-92.7c-0.3,0.1-0.5,0.2-0.8,0.3
c-69,24-93.8,71.8-96,76.3c20.8,16.2,46.8,25.8,75.1,25.8C168.9,277.5,185.1,274.1,199.8,267.8L199.8,267.8z M61.1,237
c2.8-4.7,36.4-60.3,99.5-80.7c1.6-0.5,3.2-1,4.8-1.5c-3.1-6.9-6.4-13.9-9.9-20.7C94.3,152.4,35,151.7,29.7,151.6
c0,1.2-0.1,2.5-0.1,3.7C29.6,186.7,41.5,215.4,61.1,237L61.1,237z M32.2,130.3c5.5,0.1,55.9,0.3,113.1-14.9
c-20.3-36-42.1-66.3-45.4-70.7C65.7,60.8,40.1,92.3,32.2,130.3L32.2,130.3z M123.3,36.5c3.4,4.5,25.6,34.8,45.7,71.5
c43.5-16.3,61.9-41,64.1-44.1c-21.6-19.1-50-30.8-81.1-30.8C142.1,33.1,132.5,34.3,123.3,36.5L123.3,36.5z M246.7,78
c-2.6,3.5-23.1,29.7-68.3,48.2c2.8,5.8,5.6,11.7,8.1,17.7c0.9,2.1,1.8,4.2,2.6,6.3c40.7-5.1,81.2,3.1,85.2,3.9
C274.1,125.3,263.8,98.8,246.7,78L246.7,78z"/>
</symbol>
</svg>
<div class="side-note"><span>A pen by</span><a href='https://codepen.io/guywald/' target='_blank'>Guy Waldman</a></div>
<div id="browserAlert" style="display: none"><span></span></div>
<!-- --------------------------------------------------------------------------- -->
<header>
<svg id="logo-dribbble" viewBox="0 0 304 305" width="150" height="150">
<use xlink:href="#shadow--logo-dribbble"></use>
</svg>
<div class="header--text"><span>Inspired by: </span><a href="https://dribbble.com/shots/1426764-Submit-Button" target="_blank">Colin Garven</a></div>
</header>
<main>
<!-- button -->
<button class="btnSubmit">Submit</button>
</main>
// WEB FONT --------------------------------------------------------------
@import 'https://fonts.googleapis.com/css?family=Roboto:300,500,700'
// VARIABLES (customize if you want) ------------------------------------
$bgColor: #fafafa
$shadow: rgba(lighten($bgColor, 10%),.2)
$accentColor: #1ECD97
$secondaryColor: #C5C5C5
$btnWidth: 175px
$btnHeight: 50px // Firefox users - don't touch!
$borderRadius: 35px
$btnBorder: 2px
$loaderStroke: 3px
$dribbble: #ea4c89
// MAIN STYLES ---------------------------------------------------------
// body & header --------------------------------------------------------
body
display: flex
align-items: center
justify-content: center
flex-direction: column
height: 100vh
widht: 100vw
overflow: hidden
background: $bgColor
font-family: 'Roboto', sans-serif
font-weight: 400
font-size: 14px
font-smooth: auto
-webkit-font-smoothing: antialiased
header
position: absolute
top: 30px
width: calc(30px + 15em)
left: calc(50% - 15px - 7.5em)
display: flex
flex-flow: row nowrap
align-items: center
justify-content: space-around
margin-bottom: 1em
font-size: .8em
.header--text
letter-spacing: 1px
span
color: #777
font-weight: 300
margin-bottom: 0
a
display: inline-block
margin-top: 0
text-decoration: none
font-weight: 700
color: $dribbble
transition: color 300ms ease
&:hover
color: lighten($dribbble, 10%)
#logo-dribbble
width: 2em
height: auto
fill: $dribbble
transition: fill 300ms ease
&:hover
fill: lighten($dribbble, 10%)
// button ----------------------------------------------------------
button.btnSubmit
// reset
outline: none
border: none
cursor: default
transition: box-shadow 300ms ease
letter-spacing: 2px
box-shadow: 0px 0px $btnHeight/2 10px $shadow
user-select: none
position: relative
box-sizing: border-box
width: $btnWidth
height: $btnHeight
border-radius: $borderRadius
border: $btnBorder solid
border-color: $accentColor
background: none
color: $accentColor
transition: all 300ms ease-out
&:hover
cursor: pointer
font-size: 1.05em
border-color: transparent
background: $accentColor
color: $bgColor
&.clicked
pointer-events: none
animation: anim1 200ms cubic-bezier(0.2, 0, 0.8, 1), anim2 300ms cubic-bezier(0.6, 0, 0.7, 1) 300ms 1 forwards
&.done
display: flex
justify-content: center
align-items: center
width: $btnHeight
background: $accentColor // fallback
background: linear-gradient(0, $accentColor, lighten($accentColor, 5%))
border-width: 0
border-color: rgba($accentColor, 0)
color: rgba($accentColor, 0)
transition: all 1000ms ease
animation: anim4 300ms cubic-bezier(0.2, 0, 0.4, 1) forwards
// svg -------------------------------------------------------------
svg.svg--template
display: none
svg.loader
position: absolute
width: $btnHeight
height: $btnHeight
overflow: visible
svg
&.loader
position: absolute
left: -($btnBorder)
top: -($btnBorder)
width: $btnHeight
height: $btnHeight
&.checkmark
height: 1.2em
width: 100%
.circle1
stroke: $accentColor
stroke-width: $loaderStroke
r: ($btnHeight - $loaderStroke)/2
cx: ($btnHeight)/2
cy: ($btnHeight)/2
width: 100%
height: 100%
stroke-dasharray: $btnHeight*3.14
transform: rotate(-90deg)
transform-origin: 50% 50%
animation: animLoading 2500ms cubic-bezier(0.6, 0, 0, 1)
.checkmark1
fill: $bgColor
.line1
transform-origin: 100% 100%
.line2
transform-origin: 0% 100%
.line1, .line2
animation: growAndRotate 500ms cubic-bezier(0.4, 0, 0, 1)
// animations ------------------------------------------------------------
@keyframes anim1
0%
font-size: 1.05em
50%
font-size: 0.9em
100%
font-size: 1.05emj
@keyframes anim2
40%
border-radius: $borderRadius
20%, 100%
color: rgba($accentColor, 0)
100%
background: none
border-width: $btnBorder
border-color: $secondaryColor
border-radius: 50%
padding: 0
width: $btnHeight
@keyframes animLoading
0%
stroke-dashoffset: $btnHeight*3.14
100%
stroke-dashoffset: 0
@keyframes anim4
0%
border-radius: 50%
width: $btnHeight
40%
border-radius: $borderRadius
100%
width: $btnWidth
@keyframes growAndRotate
0%
opacity: 0
transform: scale(.4) rotate(-5deg)
30%, 100%
opacity: 1
100%
transform: scale(1) rotate(0)
// browser alert -------------------------------------------------
// (shows if user is on Edge/IE)
#browserAlert
z-index: 10
display: none
left: 0
top: 0
position: absolute
width: 100vw
height: 100vh
background: rgba(white, .8)
pointer-events: none
font-size: 2em
&.active
display: block
span
position: absolute
left: 50%
top: 50%
transform: translate(-50%, -50%)
// side note -----------------------------------------------------
.side-note
padding-top: 1em
position: absolute
display: flex
justify-content: flex-start
align-items: center
flex-direction: column
height: 10em
min-width: 20em
border-top: 2px solid darken($bgColor, 30%)
background: white
z-index: 10
transform: rotate(-45deg)
transform-origin: 100% 100%
right: -8.5em
bottom: 5em
font-weight: 300
font-size: .7em
color: darken($bgColor, 30%)
a
color: darken($bgColor, 50%)
margin-top: .3em
cursor: default
text-decoration: underline
color: inherit
font-weight: 500
transition: color 300ms ease
&:hover
color: darken($bgColor, 60%)
View Compiled
/*
TESTED SUCCESFFULY ON: Chrome 52 / Firefox 48
DON'T VIEW ON: Edge
*/
$(function() {
// check if browser is not supported
var $browserAlert = $('#browserAlert');
$browserAlert.hide();
$.ajax({
url: 'https://cdn.rawgit.com/arasatasaygin/is.js/master/is.min.js',
dataType: "script",
success: function() {
if (is.edge() || is.ie()) {
$browserAlert.find('span').text('View on Chrome/Firefox.');
$browserAlert.show();
$browserAlert.addClass('active');
}
}
});
var $btn = $("button.btnSubmit");
var $loaderTemplate = $("svg.loader");
var $checkmarkTemplate = $("svg.checkmark");
$btn.on('click', function() {
if ($(this).hasClass('clicked')) return;
$(this).addClass('clicked');
var self = $(this);
var timeout1 = 600,
timeout2 = 2500,
timeout3 = 3000;
setTimeout(function() {
self.append($loaderTemplate.clone());
self.find('svg').removeClass('svg--template');
self.find('svg').css('display', 'initial');
}, timeout1);
setTimeout(function() {
self.text('');
self.find('svg').remove();
self.append($checkmarkTemplate.clone());
self.find('svg').css('display', 'initial');
self.find('svg').removeClass('svg--template');
self.addClass('done');
}, timeout1 + timeout2);
setTimeout(function() {
self.find('svg').remove();
self.text('Submit');
self.removeClass('clicked');
self.removeClass('done');
}, timeout1 + timeout2 + timeout3);
});
});
This Pen doesn't use any external CSS resources.