html-воспроизведение gif один раз при наведении и воспроизведение в обратном порядке при наведении мыши
Я хочу иметь GIF, который воспроизводится один раз, когда вы наведете на него курсор мыши и остановитесь на последнем кадре, а затем, когда вы переместите мышь с изображения, он должен воспроизводиться назад и останавливаться на первом кадре.
У меня есть статическое изображение для первого и последнего кадра, а также отдельные анимированные GIF-файлы, воспроизводящие анимацию вперед и назад, я просто не знаю, как я буду это программировать.
Оптимально я бы просто использовал CSS, но из того, что я знаю, это кажется невозможным без js/jquery, однако, если у кого-то есть какие-либо идеи, это будет очень ценно.
1 ответ:
Я думаю, что это было бы трудно с чистым CSS, так как как только вы загружаете анимированный gif, он бесконечно петляет независимо от того, виден он или нет. Таким образом, вам придется синхронизировать начало gif с
mouseover/mouseoutсобытия.Вот реализация jQuery, которая изменяет атрибут
srcна событияmouseoverиmouseout. Блокировка вращения обрабатывает случай, когда Выmouseoutилиmouseoverво время анимации-он ждет, пока анимация не будет выполнена, а затем воспроизводит обратный ход, если мышь не будет завис над элементом, когда прямая анимация заканчивается.
var firstFrame = "http://imgur.com/UeMOrix.gif"; var lastFrame = "http://imgur.com/vy7weQ1.gif"; var forwardAnimation = "http://i.imgur.com/UB0g8dT.gif"; var backwardAnimation = "http://i.imgur.com/aIxrX26.gif"; var animationLength = 5040; var playing = false; var checkingIfPlaying = false; function playForward() { if ($("#animation").is(":hover")){ playing = true; $("#animation").attr("src", forwardAnimation); window.setTimeout(function () { $("#animation").attr("src", lastFrame); playing = false; }, animationLength); } else { $("#animation").attr("src", firstFrame); } } function playBackward() { if ($("#animation").is(":hover")) { $("#animation").attr("src", lastFrame); } else { playing = true; $("#animation").attr("src", backwardAnimation); window.setTimeout(function () { $("#animation").attr("src", firstFrame); playing = false; }, animationLength); } } $("#animation").mouseover(function (e) { if (!checkingIfPlaying) { checkingIfPlaying = window.setInterval(function () { if (!playing) { window.clearInterval(checkingIfPlaying); playForward() checkingIfPlaying = false; } }, 0); } }); $("#animation").mouseout(function (e) { if (!checkingIfPlaying) { checkingIfPlaying = window.setInterval(function () { if (!playing) { window.clearInterval(checkingIfPlaying); playBackward() checkingIfPlaying = false; } }, 0); } });<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <title>so</title> <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script> </head> <body> <!-- preload images to prevent flickering --> <div style="display: none;"> <img src="http://i.imgur.com/UB0g8dT.gif"> <img src="http://i.imgur.com/aIxrX26.gif"> <img src="http://imgur.com/vy7weQ1.gif"> </div> <img id="animation" src="http://imgur.com/UeMOrix.gif"> </body> </html>
Comments