Interaction design + animation fun with with Anime, Mo.js, and Tilt.js.
A Pen by Matt Rothenberg on CodePen.
Interaction design + animation fun with with Anime, Mo.js, and Tilt.js.
A Pen by Matt Rothenberg on CodePen.
<div class="player-controls"> | |
<button class="btn btn-small" id="btnReplay"> | |
<i class="material-icons">replay</i> | |
</button> | |
</div> | |
<main class="flex items-center justify-center"> | |
<div class="svg-wrap"> | |
<svg id="au-element" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 508.6 508.6"> | |
<defs> | |
<linearGradient id="goldGradient"> | |
<stop offset="0%" stop-color="#F5C21B"/> | |
<stop offset="100%" stop-color="#D17000"/> | |
</linearGradient> | |
</defs> | |
<path class="element-border" d="M10,498.7V10h488.7v488.7H10z"/> | |
<path class="element-name" d="M201.9,150.74,278,354.21H231.53L216.14,308.9H140.06l-16,45.31h-45L156,150.74Zm2.56,124.82L178.81,200.9h-.57l-26.5,74.66Z"/> | |
<path class="element-name" d="M391.12,354.21V333.69h-.85q-7.69,12.82-19.95,18.52a58.91,58.91,0,0,1-25.08,5.7q-16.24,0-26.64-4.27a38.41,38.41,0,0,1-16.39-12.11,47.35,47.35,0,0,1-8.41-19.09,118.63,118.63,0,0,1-2.42-24.94V206.88h40.47v83.21q0,18.24,5.7,27.21t20.23,9q16.52,0,23.94-9.83t7.41-32.34V206.88h40.47V354.21Z"/> | |
</svg> | |
</div> | |
</main> |
var body = $('body'); | |
var svgWrap = $('.svg-wrap'); | |
var btnReplay = $('#btnReplay'); | |
var starburst, tilt, lineMaker; | |
var animationTimeline = anime.timeline({ | |
begin: function() { | |
buildLinemaker(); | |
lineMaker.animateLinesIn(); | |
}, | |
complete: animateBody | |
}); | |
function buildStarburst() { | |
starburst = new mojs.Burst({ | |
radius: { 0: 400 }, | |
count: 35, | |
children: { | |
shape: 'circle', | |
points: 5, | |
fill: { '#F5C21B' : '#D17000' }, | |
angle: { 360: 0 }, | |
radius: 10, | |
duration: 1000, | |
delay: 'stagger( rand(0, 100) )' | |
} | |
}); | |
} | |
function buildLinemaker() { | |
lineMaker = new LineMaker({ | |
position: 'fixed', | |
lines: [ | |
{top: '15%', left: 0, width: '100%', height: 2, color: '#ddd', hidden: true}, | |
{top: '85%', left: 0, width: '100%', height: 2, color: '#ddd', hidden: true}, | |
{top: 0, left: '90%', width: 2, height: '100%', color: '#ddd', hidden: true}, | |
{top: 0, left: '10%', width: 2, height: '100%', color: '#ddd', hidden: true}, | |
{top: '15%', left: 0, width: '100%', height: 2, color: '#000', hidden: true, animation: { duration: 1000, easing: 'easeInOutExpo', delay: 0, direction: 'LeftRight' }}, | |
{top: '85%', left: 0, width: '100%', height: 2, color: '#000', hidden: true, animation: { duration: 1000, easing: 'easeInOutExpo', delay: 100, direction: 'RightLeft' }}, | |
{top: 0, left: '90%', width: 2, height: '100%', color: '#000', hidden: true, animation: { duration: 1000, easing: 'easeInOutExpo', delay: 200, direction: 'BottomTop' }}, | |
{top: 0, left: '10%', width: 2, height: '100%', color: '#000', hidden: true, animation: { duration: 1000, easing: 'easeInOutExpo', delay: 300, direction: 'TopBottom' }} | |
] | |
}); | |
} | |
function animateBody() { | |
body.addClass('animation-complete'); | |
buildStarburst(); | |
starburst.replay(); | |
enableTilt(); | |
} | |
animationTimeline | |
.add({ | |
targets: '.element-border', | |
strokeDashoffset: [anime.setDashoffset, 0], | |
easing: 'easeInOutCubic', | |
opacity: 1, | |
duration: 1400, | |
direction: 'alternate', | |
}) | |
.add({ | |
duration: 800, | |
targets: '#au-element .element-name', | |
easing: 'easeInOutCubic', | |
scale: .7, | |
opacity: 1, | |
translateY: -50 | |
}); | |
btnReplay.on('click', function() { | |
tilt.tilt.destroy.call(tilt); | |
lineMaker.removeLines(); | |
starburst.el.remove(); | |
body.removeClass('animation-complete'); | |
animationTimeline.restart(); | |
}); | |
function enableTilt() { | |
tilt = svgWrap.tilt({ | |
glare: true, | |
scale: 1.05, | |
maxGlare: .15 | |
}); | |
} |
<script src="https://unpkg.com/[email protected]/dest/tilt.jquery.min.js"></script> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> | |
<script src="https://cdn.rawgit.com/codrops/LineMaker/47fb4e4b/js/main.js"></script> | |
<script src="https://codepen.io/juliangarnier/pen/yMLaRG"></script> | |
<script src="https://cdn.jsdelivr.net/mojs/latest/mo.min.js"></script> |
$svg-size: 325px; | |
$gold-light: #F5C21B; | |
$gold-dark: #D17000; | |
body { | |
height: 100vh; | |
overflow: hidden; | |
position: relative; | |
transition: all .2s ease-out; | |
} | |
body.animation-complete { | |
background: #222; | |
.decolines .decoline { | |
background: $gold-light !important; | |
} | |
.player-controls .btn { | |
color: $gold-light; | |
} | |
.svg-wrap { | |
fill: #222; | |
box-shadow: 0 35px 50px 0px rgba(0, 0, 0, .20); | |
} | |
.element-border { | |
fill: #222; | |
stroke: url(#goldGradient); | |
} | |
.element-name { | |
fill: #F5C21B; | |
} | |
} | |
.player-controls { | |
position: absolute; | |
margin: 15px; | |
right: 0; | |
top: 0; | |
width: auto; | |
} | |
main { | |
height: 100vh; | |
} | |
.svg-wrap { | |
background: transparent; | |
height: $svg-size; | |
width: $svg-size; | |
transition: box-shadow .2s ease-out; | |
transform-style: preserve-3d; | |
z-index: 999; | |
} | |
svg { | |
height: $svg-size; | |
width: $svg-size; | |
transform-style: preserve-3d; | |
} | |
.element-border { | |
opacity: 0; | |
fill: none; | |
stroke: #000; | |
stroke-width: 20px; | |
stroke-linecap: square; | |
transition: fill .2s ease-out; | |
} | |
.element-name { | |
opacity: 0; | |
} | |
[data-name="mojs-shape"] { | |
z-index: 99; | |
} | |
.decolines .decoline { | |
opacity: .15 !important; | |
} |
<link href="https://cdn.rawgit.com/codrops/LineMaker/master/css/decolines.css" rel="stylesheet" /> | |
<link href="https://unpkg.com/[email protected]/css/ace.css" rel="stylesheet" /> |