Остановить анимацию при загрузке, при наведении мыши на активацию - PullRequest
36 голосов
/ 28 апреля 2011

У меня есть страница с большим количеством картинок.

<img src="gif/1303552574110.1.gif" alt="" >
<img src="gif/1302919192204.gif" alt="" >
<img src="gif/1303642234740.gif" alt="" >
<img src="gif/1303822879528.gif" alt="" >
<img src="gif/1303825584512.gif" alt="" >

Что я ищу

1 При загрузке страницы => Анимации для всех картинок остановлены

2 При наведении курсора =>Анимации запускаются для этого gif

3 On mouseout => Анимация снова останавливается для этого gif

Я полагаю, это можно сделать в Jquery, но я не знаю, как.

Ответы [ 10 ]

52 голосов
/ 28 апреля 2011

Нет, вы не можете управлять анимацией изображений.

Вам потребуются две версии каждого изображения: одна анимированная, а другая нет.При наведении курсора вы можете легко переключаться с одного изображения на другое.

Пример:

$(function(){
  $('img').each(function(e){
    var src = $(e).attr('src');
    $(e).hover(function(){
      $(this).attr('src', src.replace('.gif', '_anim.gif'));
    }, function(){
      $(this).attr('src', src);
    });
  });
});

Обновление:

Время идет, возможности меняются.Как указал kritzikatzi, наличие двух версий изображения - не единственный вариант, вы, очевидно, можете использовать элемент canvas для создания копии первого кадра анимации.Обратите внимание, что это работает не во всех браузерах, например, IE 8 не поддерживает элемент canvas.

15 голосов
/ 25 сентября 2011

Я понимаю, что этот ответ опоздал, но я нашел довольно простое, элегантное и эффективное решение этой проблемы и счел необходимым опубликовать его здесь.

Однако я чувствую, что мне нужно кое-что прояснитьзаключается в том, что это не запускает gif-анимацию при наведении мыши, приостанавливает ее при наведении мыши и продолжает ее при повторном наведении мыши.К сожалению, это невозможно сделать с гифками.(Можно сделать так, чтобы строка изображений, отображаемых одно за другим, выглядела как gif, но разбирать каждый кадр вашего gif-файла и копировать все эти URL-адреса в сценарий потребовало бы много времени)

Что мойРешение - сделать изображение похожим на движущееся при наведении мыши.Вы делаете первый кадр вашего gif изображения и помещаете это изображение на веб-страницу, затем заменяете изображение gif при наведении курсора мыши, и похоже, что оно начинает двигаться.Он сбрасывается при наведении мыши.

Просто вставьте этот скрипт в раздел head вашего HTML:

$(document).ready(function()
{
    $("#imgAnimate").hover(
        function()
        {
            $(this).attr("src", "GIF URL HERE");
        },
        function()
        {
            $(this).attr("src", "STATIC IMAGE URL HERE");
        });
});

И поместите этот код в тег img изображения, которое вы хотите анимировать.

id="imgAnimate"

Это загрузит GIF при наведении мыши, так что будет казаться, что ваше изображение начинает двигаться.(Это лучше, чем загрузка GIF onload, потому что тогда переход от статического изображения к GIF прерывистый, потому что GIF начнется со случайного кадра)

для более чем одного изображения просто пересоздать сценарий создайте функцию:

<script type="text/javascript">

var staticGifSuffix = "-static.gif";
var gifSuffix = ".gif";

$(document).ready(function() {

  $(".img-animate").each(function () {

     $(this).hover(
        function()
        {
            var originalSrc = $(this).attr("src");
            $(this).attr("src", originalSrc.replace(staticGifSuffix, gifSuffix));
        },
        function()
        {
            var originalSrc = $(this).attr("src");
            $(this).attr("src", originalSrc.replace(gifSuffix, staticGifSuffix));  
        }
     );

  });

});
</script>

</head>
<body>

<img class="img-animate" src="example-static.gif" >
<img class="img-animate" src="example-static.gif" >
<img class="img-animate" src="example-static.gif" >
<img class="img-animate" src="example-static.gif" >
<img class="img-animate" src="example-static.gif" >

</body>

Этот кодовый блок является функционирующей веб-страницей (основанной на информации, которую вы мне дали), которая будет отображать статические изображения и при наведении, загружать и отображать GIF-файлы.Все, что вам нужно сделать, это вставить URL для статических изображений.

8 голосов
/ 08 февраля 2013

Я думаю, плагин jQuery freezeframe.js может пригодиться для вас. freezeframe.js - это плагин jQuery для автоматической приостановки GIF-файлов и возобновления анимации при наведении мыши.

Полагаю, вы можете легко адаптировать его, чтобы он работал вместо загрузки страницы.

5 голосов
/ 28 апреля 2011

Наилучшим вариантом, вероятно, является неподвижное изображение, которым вы заменяете gif, когда хотите остановить его.

<img src="gif/1303552574110.1.gif" alt="" class="anim" >
<img src="gif/1302919192204.gif" alt="" class="anim" >
<img src="gif/1303642234740.gif" alt="" class="anim" >
<img src="gif/1303822879528.gif" alt="" class="anim" >
<img src="gif/1303825584512.gif" alt="" class="anim" >

$(window).load(function() {
  $(".anim").src("stillimage.gif");
});

$(".anim").mouseover(function {
  $(this).src("animatedimage.gif");
});

$(".anim").mouseout(function {
  $(this).src("stillimage.gif");
});

Возможно, вы хотите иметь два массива, содержащих пути к неподвижным и анимированным изображениям, которые вы можете назначить каждому изображению.

2 голосов
/ 18 октября 2014

Для возобновления анимации изображения GIF, вы можете использовать код:

$('#img_gif').attr('src','file.gif?' + Math.random());
2 голосов
/ 11 января 2013

Вы можете решить эту проблему, имея длинную полосу, которую вы показываете поэтапно, как кинолента. Тогда вы можете остановить фильм на любом кадре. Пример ниже (скрипта доступна на http://jsfiddle.net/HPXq4/9/):

разметка:

 <div class="thumbnail-wrapper">
     <img src="blah.jpg">
 </div>

КСС:

.thumbnail-wrapper{
   width:190px;
   height:100px;
   overflow:hidden;
   position:absolute;
}
.thumbnail-wrapper img{
   position:relative;
   top:0;
}

JS:

var gifTimer;
var currentGifId=null;
var step = 100; //height of a thumbnail
$('.thumbnail-wrapper img').hover(
   function(){
      currentGifId = $(this)
      gifTimer = setInterval(playGif,500);
   },
   function(){
       clearInterval(gifTimer);
       currentGifId=null;
   }
);

var playGif = function(){
   var top = parseInt(currentGifId.css('top'))-step;
   var max = currentGifId.height();
   console.log(top,max)
   if(max+top<=0){
     console.log('reset')
     top=0;
   }
   currentGifId.css('top',top);
}

очевидно, это можно оптимизировать гораздо дальше, но я упростил этот пример для удобства чтения

1 голос
/ 19 июня 2014

Более элегантной версией Марка Крамера будет следующее:

function animateImg(id, gifSrc){
  var $el = $(id),
    staticSrc = $el.attr('src');
  $el.hover(
    function(){
      $(this).attr("src", gifSrc);
    },
    function(){
      $(this).attr("src", staticSrc);
    });
}

$(document).ready(function(){
  animateImg('#id1', 'gif/gif1.gif');
  animateImg('#id2', 'gif/gif2.gif');
});

Или еще лучше использовать атрибуты данных:

$(document).ready(function(){
  $('.animated-img').each(function(){
    var $el = $(this),
      staticSrc = $el.attr('src'),
      gifSrc = $el.data('gifSrc');
    $el.hover(
      function(){
        $(this).attr("src", gifSrc);
      },
      function(){
        $(this).attr("src", staticSrc);
      });
  });
});

И изображение будет выглядеть примерно так:

<img class="animated-img" src=".../img.jpg" data-gif-src=".../gif.gif" />

Примечание: этот код не протестирован, но должен работать нормально.

0 голосов
/ 31 декабря 2018

Связанный ответ, вы можете указать количество воспроизведений на GIF. Ниже GIF имеет 3 воспроизведения (10 секунд, 30 секунд). Через 30 секунд после загрузки страницы она останавливается на «0:01».

Обновите страницу, чтобы перезапустить все 3 воспроизведения

Вы должны изменить сам GIF. Здесь можно найти простой инструмент для изменения воспроизведения GIF https://ezgif.com/loop-count.

Чтобы увидеть пример однопетлевого gif-файла в действии на целевой странице, закажите этот сайт с помощью одного gif-файла https://git -lfs.github.com /

enter image description here

0 голосов
/ 07 февраля 2017

Добавляя суффикс следующим образом:

$('#img_gif').attr('src','file.gif?' + Math.random());  

браузер вынужден загружать новое изображение каждый раз, когда пользователь заходит на страницу.Кроме того, кеш клиента может быть быстро заполнен.

Здесь следует альтернативное решение, которое я тестировал на Chrome 49 и Firefox 45.
В таблице стилей CSS установите для свойства display значение none, как это:

#img_gif{
  display:'none';
}

За пределамиОператор '$ (document) .ready' вставка:

$(window).load(function(){ $('#img_gif').show(); });

Каждый раз, когда пользователь обращается к странице, анимация запускается после полной загрузки всех элементов.Это единственный способ найти анимацию gif и html5.

Обратите внимание, что:
Анимация gif не будет перезапущена после обновления страницы (например, после нажатия клавиши «F5»).
Оператор «$ (document) .ready» не производит то же самоеэффект "$ (window) .load".
Свойство "видимость" не дает такого же эффекта, как "отображение".

0 голосов
/ 28 апреля 2011

Есть только один путь из того, что я знаю.

Имейте 2 изображения, сначала JPEG-файл с первым кадром (или что вы хотите) GIF и фактический GIF.

Загрузите страницу с установленным jpeg и, наведя курсор мыши, замените jpeg на gif.Вы можете предварительно загрузить гифки, если хотите, или если они большого размера показывают загрузку, когда гиф загружается, а затем замените jpeg на него.при наведении курсора мыши, остановите его, а затем возобновите воспроизведение с остановленного фрейма, тогда это невозможно сделать с помощью комбинации javascript + gif.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...