CSS3 animation firing just once in Firefox using Jquery add/remove class events -
i've run across number of posts here detailing problems css3 animations not working in firefox, 1 animation fires once:
firefox runs css animation once
and
documented bugs of firefox/jquery/css animations together?
but these fixes not relevant issue. i've got these animations working in safari/chrome, , have correct vendor prefixes css (even though firefox shouldn't need them). i'm using jquery add / remove class events trigger animations, , can see in firebug classes changing when expect them to.
the issue animation fires first time, never again, , defaults making panel disappear , reappear
css:
/* custom sliding panel */ @-webkit-keyframes panelslideleft { { opacity: $panelopacitystart; -webkit-transform: translatex(0); } { opacity: $panelopacityend; -webkit-transform: translatex($panelwidth); } } @-moz-keyframes panelslideleft { { opacity: $panelopacitystart; -moz-transform: translatex(0); } { opacity: $panelopacityend; -moz-transform: translatex($panelwidth); } } @keyframes panelslideleft { { opacity: $panelopacitystart; transform: translatex(0); } { opacity: $panelopacityend; transform: translatex($panelwidth); } } .slide-panel-left-open { opacity: $panelopacityend; -webkit-animation: panelslideleft $animationduration linear; -moz-animation: panelslideleft $animationduration linear; animation: panelslideleft $animationduration linear; -webkit-transform: translatex($panelwidth); -moz-transform: translatex($panelwidth); transform: translatex($panelwidth); } .slide-panel-left-close { -webkit-animation: panelslideleft $animationduration linear reverse; -moz-animation: panelslideleft $animationduration linear reverse; animation: panelslideleft $animationduration linear reverse; }
and in javascript, use boolean determine classes modify, , slidepanel.side set on jquery object , changing expected 'left' or 'right', in firefox (there right sliding panel uses function).
js:
slidepanel.bind('togglepanel', function() { if(slidepanel.open) { slidepanel.removeclass('slide-panel-' + slidepanel.side + '-open'); slidepanel.addclass('slide-panel-' + slidepanel.side + '-close'); } else { slidepanel.removeclass('slide-panel-' + slidepanel.side + '-close'); slidepanel.addclass('slide-panel-' + slidepanel.side + '-open'); } slidepanel.open = slidepanel.open ? false : true; });
regardless of whether actual bug or not, think functional example being requested.
i created fiddle implements animation toggles using classes when object clicked.
css animation jsfiddle:
please excuse crudity of example. original question did not include html , css referenced variables such #panelwidth, took creative license , tried create working example maintains spirit of original.
in css (which supports webkit , mozilla, not include non-prefix options brevity), specify animation parameters individually using longhand format.
the animation-fill-mode property important understand. can read more here: http://www.w3schools.com/cssref/css3_pr_animation-fill-mode.asp
html:
<div id="slidepanel">slide panel</div>
css:
/* custom sliding panel */ @-moz-keyframes panelslideleft { { opacity: 1.0; -moz-transform: translatex(200px); } { opacity: 1.0; -moz-transform: translatex(0px); } } @-moz-keyframes panelslideright { { opacity: 1.0; -moz-transform: translatex(0px); } { opacity: 1.0; -moz-transform: translatex(200px); } } @-webkit-keyframes panelslideleft { { opacity: 1.0; -webkit-transform: translatex(200px); } { opacity: 1.0; -webkit-transform: translatex(0px); } } @-webkit-keyframes panelslideright { { opacity: 1.0; -webkit-transform: translatex(0px); } { opacity: 1.0; -webkit-transform: translatex(200px); } } .slide-panel-right { -moz-animation-name: panelslideright; -moz-animation-duration: 0.35s; -moz-transition-timing-function: ease-in; -moz-animation-iteration-count: 1; -moz-animation-fill-mode: both; -webkit-animation-name: panelslideright; -webkit-animation-duration: 0.35s; -webkit-transition-timing-function: ease-in; -webkit-animation-iteration-count: 1; -webkit-animation-fill-mode: both; } .slide-panel-left { -moz-animation-name: panelslideleft; -moz-animation-duration: 0.35s; -moz-transition-timing-function: ease-in; -moz-animation-iteration-count: 1; -moz-animation-fill-mode: none; -webkit-animation-name: panelslideleft; -webkit-animation-duration: 0.35s; -webkit-transition-timing-function: ease-in; -webkit-animation-iteration-count: 1; -webkit-animation-fill-mode: none; } #slidepanel { position: absolute; top: 0px; left: 0px; width: 80px; height: 80px; border: 1px solid green; padding: 8px; }
js:
var open = false; $("#slidepanel").on('click', function() { if(open) { $(this).removeclass('slide-panel-right'); $(this).addclass('slide-panel-left'); } else { $(this).removeclass('slide-panel-left'); $(this).addclass('slide-panel-right'); } open = open ? false : true; });
similar results (with less code) can accomplished using css transitions. here jsfiddle demonstrate:
css transitions jsfiddle
Comments
Post a Comment