Card swipe animation based on this Dribbble: https://dribbble.com/shots/1721120-Keynote-animation-recreation
Created
January 27, 2022 23:24
-
-
Save NOUIY/41acb45ba88ff9ce52d798f6a41436c3 to your computer and use it in GitHub Desktop.
Card Swipe Animation Material Design
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
%main{:rel => 'main'} | |
%ul{:role => 'presentation'} | |
-(1..4).each do | |
%li | |
%button | |
%p.credit | |
Designed by | |
%a{:href => 'https://dribbble.com/bendunn'}Ben Dunn | |
and coded by | |
%a{:href => 'https://codepen.io/Moiety/'}Zoë Bijl |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// based on this Dribbble: https://dribbble.com/shots/1721120-Keynote-animation-recreation |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Some vars | |
$animation-duration: 2.5s; | |
$background-color: #5978fb; | |
$window-top: #3c3e99; | |
$window-bar: #4c54a4; | |
$window-content: #fff; | |
$window-background: #474baf; | |
$button-color: #dee0e4; | |
$button-size: 32px; | |
$window-width: 190px; | |
$window-height: 320px; | |
$header-height: 45px; | |
$article-height: ($window-height - $header-height); | |
main { | |
// we need to reserve some space fot this to work. | |
position: relative; | |
width: ($window-width * 3); | |
height: $window-height; | |
} | |
// Card | |
ul { | |
position: absolute; | |
top: 50%; | |
left: 50%; | |
margin: 0; | |
padding: 0; | |
list-style: none; | |
width: $window-width; | |
height: $window-height; | |
background-color: $window-background; | |
transform: translate(-50%, -50%); | |
will-change: transform, opacity, right; | |
> * { | |
position: absolute; | |
} | |
} | |
li { | |
top: $header-height; | |
right: 0; | |
width: $window-width; | |
height: $article-height; | |
box-shadow: 0 2px 4px rgba(50,50,50,0.3); | |
background-color: $window-content; | |
//animation: article forwards $animation-duration infinite; | |
transform-origin: 50% 50%; | |
&:nth-child(1) { | |
right: 100%; | |
z-index: 50; | |
transform: scale(.8); | |
opacity: .3; | |
animation: article-one forwards $animation-duration infinite; | |
} | |
&:nth-child(2) { | |
right: 0; | |
z-index: 50; | |
animation: article-two forwards $animation-duration infinite; | |
} | |
&:nth-child(3) { | |
right: 0; | |
z-index: 45; | |
transform-origin: 100% 50%; | |
transform: scale(.8); | |
animation: article-three forwards $animation-duration infinite; | |
} | |
&:nth-child(4) { | |
right: 0; | |
z-index: 40px; | |
transform-origin: 100% 50%; | |
transform: scale(.7); | |
opacity: .3; | |
animation: article-four forwards $animation-duration infinite; | |
} | |
} | |
button { | |
position: absolute; | |
bottom: 45px; | |
right: ($window-width - 25 - $button-size); | |
margin: 0; | |
padding: 0; | |
width: $button-size; | |
height: $button-size; | |
border: 0; | |
border-radius: 100%; | |
-webkit-appearance: none; | |
background-color: $button-color; | |
animation: button forwards $animation-duration infinite; | |
} | |
// Animations | |
@keyframes button { | |
0%, 20% { | |
bottom: 45px; | |
right: ($window-width - 25 - $button-size); | |
transform: scale(1); | |
} | |
35% { | |
bottom: 90px; | |
right: ($window-width + 35px); | |
transform: scale(1); | |
} | |
50% { | |
bottom: 90px; | |
right: ($window-width + 35px); | |
transform: scale(.5625); | |
} | |
65%, 85% { | |
bottom: 90px; | |
right: (($window-width * 2) - 30px); | |
transform: scale(.5625); | |
} | |
} | |
@keyframes article-one { | |
0%, 50% { | |
right: 100%; | |
transform: scale(.8); | |
opacity: .3; | |
} | |
50% { | |
right: 100%; | |
transform: scale(.8); | |
opacity: .3; | |
} | |
65%, 100% { | |
transform: scale(.8); | |
right: 250%; | |
opacity: 0; | |
} | |
} | |
@keyframes article-two { | |
0%, 40% { | |
right: 0; | |
transform: scale(1); | |
opacity: 1; | |
} | |
50% { | |
right: 0; | |
transform: scale(.8); | |
opacity: 1; | |
} | |
65%, 100% { | |
transform: scale(.8); | |
right: 100%; | |
opacity: .3; | |
} | |
} | |
@keyframes article-three { | |
0%, 40% { | |
right: 0; | |
transform: scale(0.8); | |
} | |
50% { | |
right: 0; | |
transform: scale(0.7); | |
} | |
65%, 100% { | |
right: 0; | |
transform: scale(1); | |
} | |
} | |
@keyframes article-four { | |
0%, 40% { | |
right: 0; | |
transform-origin: 100% 50%; | |
transform: scale(.7); | |
opacity: .3; | |
} | |
50% { | |
right: -20px; | |
transform-origin: 100% 50%; | |
transform: scale(.6); | |
opacity: .3; | |
} | |
65%, 85% { | |
right: 0; | |
transform-origin: 100% 50%; | |
transform: scale(.7); | |
opacity: .3; | |
} | |
} | |
// Unimportant bits | |
* { | |
box-sizing: border-box; | |
} | |
html, | |
body { | |
margin: 0; | |
padding: 0; | |
height: 100%; | |
} | |
body { | |
display: flex; | |
justify-content: center; | |
align-items: center; | |
background-color: $background-color; | |
} | |
.credit { | |
display: none; | |
position: fixed; | |
right: 20px; | |
bottom: 20px; | |
margin: 0; | |
color: #fff; | |
font-size: 14px; | |
font-family: Avenir Next, Helvetica Neue, sans-serif; | |
// The CodePen preview/thumbnail window is 300px in height | |
@media (min-height: 350px) { | |
display: block; | |
} | |
a { | |
display: inline-block; | |
color: #fff; | |
text-decoration: none; | |
border-bottom: 1px dashed rgba(255,255,255,.3); | |
transition: border-color ease-out .15s; | |
&:focus, | |
&:hover { | |
border-bottom-color: #fff; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment