I have the following code: http://jsfiddle.net/odj8v0x4/.
function stopGlobe() {
$('.mapfront').removeClass('mapfront-anim');
$('.mapback').removeClass('mapback-anim');
}
function startGlobe() {
$('.mapfront').addClass('mapfront-anim');
$('.mapback').addClass('mapback-anim');
}
@keyframes mapfront_spin {
0% {
background-position: 1400px 0%;
}
100% {
background-position: 0 0%;
}
}
@keyframes mapback_spin {
0% {
background-position: 0 0%;
}
100% {
background-position: 1400px 0%;
}
}
@-webkit-keyframes mapfront_spin {
0% {
background-position: 1400px 0%;
}
100% {
background-position: 0 0%;
}
}
@-webkit-keyframes mapback_spin {
0% {
background-position: 0 0%;
}
100% {
background-position: 1400px 0%;
}
}
body {
margin: 50px;
background: #000;
}
.globe {
width: 400px;
height: 400px;
position: relative;
}
.front {
width: 400px;
height: 400px;
background: url(http://dl.dropboxusercontent.com/u/17180596/SphereForeground.png);
z-index: 5;
position: absolute;
top: 0;
left: 0;
}
.back {
width: 400px;
height: 400px;
background: url(http://dl.dropboxusercontent.com/u/17180596/SphereBackground.png);
z-index: 2;
position: absolute;
top: 0;
left: 0;
}
.mapfront, .mapback {
border-radius: 300px;
width: 340px;
height: 340px;
position: absolute;
top: 30px;
left: 30px;
z-index: 4;
}
.mapfront {
background: url(http://dl.dropboxusercontent.com/u/17180596/CartoForeground.png) repeat-x;
}
.mapfront-anim {
-webkit-animation: mapfront_spin 15s linear infinite;
animation: mapfront_spin 15s linear infinite;
}
.mapback {
background: url(http://dl.dropboxusercontent.com/u/17180596/CartoBackground.png) repeat-x;
position: absolute;
}
.mapback-anim {
-webkit-animation: mapback_spin 15s linear infinite;
animation: mapback_spin 15s linear infinite;
}
<div class="globe">
<div class="front"></div>
<div class="mapfront mapfront-anim"></div>
<div class="mapback mapback-anim"></div>
<div class="back"></div>
</div>
After executing javascript functions stopGlobe()
animation stops, but stops abruptly.
Can I smoothly stop the animation, to avoid sudden jumps in and then continue the animation again from the point at which it left off?
The animation-timing-function specifies the speed curve of an animation. The speed curve defines the TIME an animation uses to change from one set of CSS styles to another. The speed curve is used to make the changes smoothly.
Use a transition time of 0.6s when you hover and an animation time of 0.01 when you hover off. This way, the animation will reset itself to its original position pretty much immediately and stop the funky behaviour.
The fact is that, in most cases, the performance of CSS-based animations is almost the same as JavaScripted animations — in Firefox at least. Some JavaScript-based animation libraries, like GSAP and Velocity. JS, even claim that they are able to achieve better performance than native CSS transitions/animations.
The animation-play-state property specifies whether the animation is running or paused. Note: Use this property in a JavaScript to pause an animation in the middle of a cycle.
You can achieve this using only CSS.
All that you need is a little movement to make it smooth.
So, I set a transform translate when needed. And this transform is transitioned with an ease-out, to produce the smoothing effect.
So, when hovering, the animation stops (suddenly). But at the same time, a the transform translate is applied, and since this transform is transitioned with the appropiate easing, it starts immediately with the same speed that had the animation.
This speed will slowdown according to the easing, until it stops.
I add a wrapper in the element that has the translate applied. To avoid that this transform "moves" the element, we need to make the element bigger than the visible space, and set inside the wrapper that will limit the visible part (that will be static)
Just hover on the globe. (look ma, no JS)
@keyframes mapfront_spin {
0% { background-position: 1400px 0%; }
100% { background-position: 0 0%; }
}
@keyframes mapback_spin {
0% { background-position: 0 0%; }
100% { background-position: 1400px 0%; }
}
@-webkit-keyframes mapfront_spin {
0% { background-position: 1400px 0%; }
100% { background-position: 0 0%; }
}
@-webkit-keyframes mapback_spin {
0% { background-position: 0 0%; }
100% { background-position: 1400px 0%; }
}
body {
margin: 50px;
background: #000;
}
.globe {
width: 400px;
height: 400px;
position: relative;
}
.front {
width: 400px;
height: 400px;
background: url(http://dl.dropboxusercontent.com/u/17180596/SphereForeground.png);
z-index: 5;
position: absolute;
top: 0;
left: 0;
}
.back {
width: 400px;
height: 400px;
background: url(http://dl.dropboxusercontent.com/u/17180596/SphereBackground.png);
z-index: 2;
position: absolute;
top: 0;
left: 0;
}
.mapfront, .mapback {
border-radius: 300px;
width: 340px;
height: 340px;
position: absolute;
top: 30px;
left: 30px;
z-index: 4;
overflow: hidden;
}
.mapfront-inner {
width: 380px;
height: 340px;
top: 0px;
left: 0px;
position: absolute;
background: url(http://dl.dropboxusercontent.com/u/17180596/CartoForeground.png) repeat-x;
transition: transform 1s ease-out;
}
.mapfront-anim {
-webkit-animation: mapfront_spin 15s linear infinite;
animation: mapfront_spin 15s linear infinite;
}
.globe:hover .mapfront-anim,
.globe:hover .mapback-anim
{
-webkit-animation-play-state: paused;
animation-play-state: paused;
}
.globe:hover .mapfront-inner {
transform: translateX(-40px);
}
.mapback-inner {
width: 380px;
height: 340px;
top: 0px;
left: -40px;
background: url(http://dl.dropboxusercontent.com/u/17180596/CartoBackground.png) repeat-x;
position: absolute;
transition: transform 1s ease-out;
}
.globe:hover .mapback-inner {
transform: translateX(40px);
}
.mapback-anim {
-webkit-animation: mapback_spin 15s linear infinite;
animation: mapback_spin 15s linear infinite;
}
<div class="globe">
<div class="front"></div>
<div class="mapfront">
<div class="mapfront-inner mapfront-anim">
</div>
</div>
<div class="mapback">
<div class="mapback-inner mapback-anim">
</div>
</div>
<div class="back"></div>
</div>
You aren't going to like this answer, but reality is that CSS3 animations aren't really useful to achieve this. To make this work you would need to replicate a lot of your CSS in your Javascript which kind of destroys the point (Like for example in this closely related answer Change speed of animation CSS3?). To really make it stop smoothly your best bet would be to write the animation on a platform like the Greensock animation library which provides all the tools you need to make it actually smoothly stop instead of suddenly stop.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With