Изчистване на проблема с setInterval

Имам известни затруднения при стартирането на множество анимации в Safari без забавяне на браузъра. Моите анимации са гладки във всички други браузъри.

Не съм сигурен дали има нещо общо с моя скрипт:

var looping;

function loop()
{
    var scrollTop = $(window).scrollTop();
    if( scrollTop > 300 && scrollTop < 1001 )
    {
        looping = setInterval(function()
        {
            $('.page.active .strip').stop().animate(
            {
                'background-position': '-=100px'
            },1000,'linear');
        },1000);
    }
    else if( scrollTop < 301 || scrollTop > 1000 )
    {
    clearInterval(looping);
    $('.page.active .strip').stop();
    }
}

Това, което се опитвам да постигна, е да направя безкрайно въртящо се изображение.

Опитах и ​​двете следните неща, за да спре анимацията:

clearInterval(looping);
$('.page.active .strip').stop();

Което не работи. Както можете да видите по-горе, искам анимацията да се изпълнява само след като лентата е видима за потребителя.

В същото време пуснах тази анимация.

function loadLandingSlider()
{
    totalImg = $('.page.active #rotating-item-wrapper img').length;

    rotate = setInterval(
    function() 
    {
        loadImg();
    }, 3000);
}

function loadImg()
{
    $('.page.active .rotating-item').fadeOut(1000);
    $('.page.active #rot' + counter).fadeIn(1000);  

    if(counter == totalImg) counter = 1;
    else counter ++;
}

Това е само основна галерия с изчезване на изображения

Опитах да заменя скрипта с css3 анимации, но това го забави още повече

Оценявам всяка помощ!


person Phillip-juan    schedule 30.01.2014    source източник
comment
Можете ли да предоставите демонстрация на jsfiddle, ако е възможно?   -  person ʞɹᴉʞ ǝʌɐp    schedule 30.01.2014
comment
проблемът е, че има доста малко код. Но сега ще го добавя   -  person Phillip-juan    schedule 30.01.2014
comment
Какво ще кажете за добавяне на clearInterval(looping); като първи ред в if блок в loop(). Можете ли да опитате това? т.е. clearInterval(цикъл); и в блока if и else.   -  person ʞɹᴉʞ ǝʌɐp    schedule 30.01.2014
comment
Стартирането на анимации вътре в setInterval, които имат същата продължителност на интервала, може да причини проблеми. Времето не е достатъчно точно, вероятно анимацията не е напълно завършена, когато се случи следващият интервал, така че те започват да се нареждат на опашка. Да не говорим, защо бихте анимирали на стъпки от 100, вместо просто да анимирате цялата дължина?   -  person Kevin B    schedule 30.01.2014
comment
@KevinB Причината за този метод е да се направи безкраен цикъл. Разбирам откъде идвате с времето, но все още не съм намерил по-лесно решение за това.   -  person Phillip-juan    schedule 30.01.2014
comment
@Dirk, благодаря за простото работещо решение. Винаги е нещо дребно. :-)   -  person Phillip-juan    schedule 30.01.2014
comment
Самоизпълняваща се функция? в пълното обратно извикване на анимацията, изпълнете функцията, която го стартира отново.   -  person Kevin B    schedule 30.01.2014
comment
Така че това работи ли за вас? Тогава бих го добавил като отговор.   -  person ʞɹᴉʞ ǝʌɐp    schedule 30.01.2014
comment
Можете ли да добавите като отговор, тогава ще приема @ Дейв   -  person Phillip-juan    schedule 30.01.2014
comment
@KevinB Мисля, че съм го правил и преди. Мисля, че поради изоставащата анимация преминах към различни решения.   -  person Phillip-juan    schedule 30.01.2014


Отговори (1)


Направете цикъла си да изглежда така...

Добавете clearInterval(looping); като първи ред в блок if в loop(). Можете ли да опитате това? т.е. clearInterval(looping); в блока if и else.

var looping;

function loop()
{
  var scrollTop = $(window).scrollTop();
  clearInterval(looping);
  if( scrollTop > 300 && scrollTop < 1001 )
  {
    looping = setInterval(function()
    {
        $('.page.active .strip').stop().animate(
        {
            'background-position': '-=100px'
        },1000,'linear');
    },1000);
  }
  else if( scrollTop < 301 || scrollTop > 1000 )
  {
    $('.page.active .strip').stop();
  }
}
person ʞɹᴉʞ ǝʌɐp    schedule 30.01.2014
comment
Открих, че добавянето на clearInterval на първия ред във функцията, блокът else е ненужен. Но благодаря :-) - person Phillip-juan; 30.01.2014
comment
Да, можете да импровизирате. - person ʞɹᴉʞ ǝʌɐp; 30.01.2014