My Rails app has a feature similar to reddit where users can upvote or downvote content. I'm currently working on creating a CSS3 animation that triggers when a user clicks the downvote button.
Here's how I'm using JQuery:
<div class="animations">
<%= image_tag "ballerino.png", class: "fixed no-display", id: "to-animate", style: "margin-top: 80px; width: 40%" %>
<script>
$("#downvote").on('click',function() {
$('#to-animate').removeClass('fixed');
$('#to-animate').removeClass('no-display');
$('#to-animate').addClass('animation-left-to-right');
});
</script>
</div> <!-- animations -->
This code is then rendered as a partial for each Joke
object on the page:
<div class="text-center col-xs-1">
<% if current_user %>
<div class="width: 100%"><%= link_to " ", joke_up_vote_path(joke), id: "upvote", class: 'glyphicon glyphicon-chevron-up', method: :post, style: "margin-right: 0; margin-left: 0" %></div>
<% else %>
<div class="width: 100%"><%= link_to " ", new_user_session_path, id: "upvote", class: 'glyphicon glyphicon-chevron-up', method: :post, style: "margin-right: 0; margin-left: 0" %></div>
<% end %>
<div class="width: 100%"><h3 style="margin-top: 0; margin-bottom: 0"><strong><%= joke.points %></strong></h3></div>
<% if current_user %>
<div class="width: 100%"><%= link_to " ", joke_down_vote_path(joke), id: "downvote", class: 'glyphicon glyphicon-chevron-down', method: :post, style: "margin-right: 0; margin-left: 0" %></div>
<% else %>
<div class="width: 100%"><%= link_to " ", new_user_session_path, id: "downvote", class: 'glyphicon glyphicon-chevron-down', method: :post, style: "margin-right: 0; margin-left: 0" %></div>
<% end %>
</div>
Additionally, here's the CSS code from my application.scss
file for the animations:
/* ANIMATIONS */
.animation-left-to-right{
animation: l-r-ballerina linear 4s;
animation-iteration-count: 1;
transform-origin: 50% 50%;
animation-fill-mode:forwards; /*when the spec is finished*/
-webkit-animation: l-r-ballerina linear 4s;
-webkit-animation-iteration-count: 1;
-webkit-transform-origin: 50% 50%;
-webkit-animation-fill-mode:forwards; /*Chrome 16+, Safari 4+*/
-moz-animation: l-r-ballerina linear 4s;
-moz-animation-iteration-count: 1;
-moz-transform-origin: 50% 50%;
-moz-animation-fill-mode:forwards; /*FF 5+*/
-o-animation: l-r-ballerina linear 4s;
-o-animation-iteration-count: 1;
-o-transform-origin: 50% 50%;
-o-animation-fill-mode:forwards; /*Not implemented yet*/
-ms-animation: l-r-ballerina linear 4s;
-ms-animation-iteration-count: 1;
-ms-transform-origin: 50% 50%;
-ms-animation-fill-mode:forwards; /*IE 10+*/
}
@keyframes l-r-ballerina{
0% { transform: translate(-400px,0px) rotate(0deg) ; }
10% { transform: translate(-200px,0px) rotate(-10deg) ; }
20% { transform: translate(-100px,0px) rotate(10deg) ; }
30% { transform: translate(0px,0px) rotate(-10deg) ; }
40% { transform: translate(100px,0px) rotate(10deg) ; }
50% { transform: translate(300px,0px) rotate(-10deg) ; }
100% { transform: translate(3000px,0px) rotate(-10deg) ; }
}
@-moz-keyframes l-r-ballerina{
0% { -moz-transform: translate(-400px,0px) rotate(0deg) ; }
10% { -moz-transform: translate(-200px,0px) rotate(-10deg) ; }
20% { -moz-transform: translate(-100px,0px) rotate(10deg) ; }
30% { -moz-transform: translate(0px,0px) rotate(-10deg) ; }
40% { -moz-transform: translate(100px,0px) rotate(10deg) ; }
50% { -moz-transform: translate(300px,0px) rotate(-10deg) ; }
100% {-moz-transform: translate(3000px,0px) rotate(-10deg) ; }
}
@-webkit-keyframes l-r-ballerina {
0% { -webkit-transform: translate(-400px,0px) rotate(0deg) ; }
10% { -webkit-transform: translate(-200px,0px) rotate(-10deg) ; }
20% { -webkit-transform: translate(-100px,0px) rotate(10deg) ; }
30% { -webkit-transform: translate(0px,0px) rotate(-10deg) ; }
40% { -webkit-transform: translate(100px,0px) rotate(10deg) ; }
50% { -webkit-transform: translate(300px,0px) rotate(-10deg) ; }
100% { -webkit-transform: translate(3000px,0px) rotate(-10deg) ; }
}
@-o-keyframes l-r-ballerina {
0% { -o-transform: translate(-400px,0px) rotate(0deg) ; }
10% { -o-transform: translate(-200px,0px) rotate(-10deg) ; }
20% { -o-transform: translate(-100px,0px) rotate(10deg) ; }
30% { -o-transform: translate(0px,0px) rotate(-10deg) ; }
40% { -o-transform: translate(100px,0px) rotate(10deg) ; }
50% { -o-transform: translate(300px,0px) rotate(-10deg) ; }
100% { -o-transform: translate(3000px,0px) rotate(-10deg) ; }
}
@-ms-keyframes l-r-ballerina {
0% { -ms-transform: translate(-400px,0px) rotate(0deg) ; }
10% { -ms-transform: translate(-200px,0px) rotate(-10deg) ; }
20% { -ms-transform: translate(-100px,0px) rotate(10deg) ; }
30% { -ms-transform: translate(0px,0px) rotate(-10deg) ; }
40% { -ms-transform: translate(100px,0px) rotate(10deg) ; }
50% { -ms-transform: translate(300px,0px) rotate(-10deg) ; }
100% { -ms-transform: translate(3000px,0px) rotate(-10deg) ; }
}
.fixed {
position: fixed;
}
.no-display {
display: none;
}
I could use some help troubleshooting this issue with the animations triggered by JQuery and CSS. I'm still learning about animations and JQuery, so any assistance would be greatly appreciated.
ADDED FIDDLE
$(".downvote").on('click', function() {
$('#to-animate').removeClass('fixed');
$('#to-animate').removeClass('no-display');
$('#to-animate').addClass('animation-left-to-right');
});
/* ANIMATIONS */
.animation-left-to-right {
animation: l-r-ballerina linear 4s;
animation-iteration-count: 1;
transform-origin: 50% 50%;
animation-fill-mode: forwards;
/*when the spec is finished*/
-webkit-animation: l-r-ballerina linear 4s;
-webkit-animation-iteration-count: 1;
-webkit-transform-origin: 50% 50%;
-webkit-animation-fill-mode: forwards;
/*Chrome 16+, Safari 4+*/
-moz-animation: l-r-ballerina linear 4s;
-moz-animation-iteration-count: 1;
-moz-transform-origin: 50% 50%;
-moz-animation-fill-mode: forwards;
/*FF 5+*/
-o-animation: l-r-ballerina linear 4s;
-o-animation-iteration-count: 1;
-o-transform-origin: 50% 50%;
-o-animation-fill-mode: forwards;
/*Not implemented yet*/
-ms-animation: l-r-ballerina linear 4s;
-ms-animation-iteration-count: 1;
-ms-transform-origin: 50% 50%;
-ms-animation-fill-mode: forwards;
/*IE 10+*/
}
@keyframes l-r-ballerina {
0% {
transform: translate(-400px, 0px) rotate(0deg);
}
10% {
transform: translate(-200px, 0px) rotate(-10deg);
}
20% {
transform: translate(-100px, 0px) rotate(10deg);
}
30% {
transform: translate(0px, 0px) rotate(-10deg);
}
40% {
transform: translate(100px, 0px) rotate(10deg);
}
50% {
transform: translate(300px, 0px) rotate(-10deg);
}
100% {
transform: translate(3000px, 0px) rotate(-10deg);
}
}
@-moz-keyframes l-r-ballerina {
0% {
-moz-transform: translate(-400px, 0px) rotate(0deg);
}
...
I've provided a simulation of the problem in the fiddle above. It includes a div instead of an image with the same ID for visibility.