Showing how we can use custom CSS classes for each stage of a CSS Animation with the transition component.
A Pen by Sarah Drasner on CodePen.
Showing how we can use custom CSS classes for each stage of a CSS Animation with the transition component.
A Pen by Sarah Drasner on CodePen.
<div id="app"> | |
<h3>Bounce the Ball!</h3> | |
<button @click="toggleShow"> | |
<span v-if="isShowing">Get it gone!</span> | |
<span v-else>Here we go!</span> | |
</button> | |
<transition | |
name="ballmove" | |
enter-active-class="bouncein" | |
leave-active-class="rollout"> | |
<div v-if="isShowing"> | |
<app-child class="child"></app-child> | |
</div> | |
</transition> | |
</div> | |
<script type="text/x-template" id="childarea"> | |
<div class="ball"></div> | |
</script> |
const Child = { | |
template: '#childarea' | |
}; | |
new Vue({ | |
el: '#app', | |
data() { | |
return { | |
isShowing: false | |
} | |
}, | |
methods: { | |
toggleShow() { | |
this.isShowing = !this.isShowing; | |
} | |
}, | |
components: { | |
appChild: Child | |
} | |
}); |
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.10/vue.min.js"></script> |
@mixin ballb($yaxis: 0) { | |
transform: translate3d(0, $yaxis, 0); | |
} | |
body { | |
font-family: 'Bitter', serif; | |
width: 100vw; | |
height: 100vh; | |
background: #eeeeee; /* Old browsers */ | |
background: -moz-linear-gradient(top, #eeeeee 0%, #cccccc 65%, #eeeeee 99%); /* FF3.6-15 */ | |
background: -webkit-linear-gradient(top, #eeeeee 0%,#cccccc 65%,#eeeeee 99%); /* Chrome10-25,Safari5.1-6 */ | |
background: linear-gradient(to bottom, #eeeeee 0%,#cccccc 65%,#eeeeee 99%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ | |
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#eeeeee',GradientType=0 ); /* IE6-9 */ | |
} | |
#app { | |
text-align: center; | |
margin: 60px; | |
max-width: 320px; | |
margin: 0 auto; | |
display: table; | |
} | |
.num { | |
color: #AF007E; | |
} | |
button { | |
font-family: 'Bitter'; | |
background: #c62735; | |
color: white; | |
border: 0; | |
padding: 5px 15px; | |
margin: 0 10px; | |
border-radius: 4px; | |
outline: 0; | |
cursor: pointer; | |
} | |
h4 { | |
margin: 0 0 15px; | |
} | |
hr { | |
border-color: #F2FAFF; | |
opacity: 0.5; | |
margin: 15px 0; | |
} | |
.ball { | |
width: 60px; | |
height: 60px; | |
background: url("https://s3-us-west-2.amazonaws.com/s.cdpn.io/28963/soccerball.svg"); | |
transform-origin: 50% 50%; | |
transform: translate3d(0, 300px, 0) rotate(0); | |
} | |
@keyframes bouncein { | |
1% { @include ballb(-400px); } | |
20%, 40%, 60%, 80%, 95%, 99%, 100% { @include ballb() } | |
30% { @include ballb(-80px); } | |
50% { @include ballb(-40px); } | |
70% { @include ballb(-30px); } | |
90% { @include ballb(-15px); } | |
97% { @include ballb(-10px); } | |
} | |
@keyframes rollout { | |
0% { transform: translate3d(0, 300px, 0); } | |
100% { transform: translate3d(1000px, 300px, 0); } | |
} | |
@keyframes ballroll { | |
0% { transform: rotate(0); } | |
100% { transform: rotate(1000deg); } | |
} | |
.ballmove-enter { | |
@include ballb(-400px); | |
} | |
.bouncein { | |
animation: bouncein 0.9s cubic-bezier(0.47, 0, 0.745, 0.715) both; | |
} | |
.rollout { | |
width: 60px; | |
height: 60px; | |
animation: rollout 2s cubic-bezier(0.55, 0.085, 0.68, 0.53) both; | |
div { | |
animation: ballroll 2s cubic-bezier(0.55, 0.085, 0.68, 0.53) both; | |
} | |
} |