2015-06-25 3 views
1

Текущий сценарий:Правильный способ написать идеальный анимации с помощью JQuery

У меня есть список divs, который содержит набор элементов, которые Свитки автоматически на основе количества divs настоящего. Этот список divs размещен внутри parentdiv и с фиксированным height.

Требование:

  • Не анимировать т.е. свиток, если длина divs настоящих внутри меньше 4.
  • Animate с одинаковой скоростью до последнего div и прокрутить назад от дна до верхних тисков наоборот.
  • Остановить прокрутку при наведении указателя на любого ребенка div.

Выполнено:

  • скроллинг делается т.е., если оно меньше, чем 4 элемента присутствуют не прокрутки.
  • Прокрутка останавливается при наведении любого ребенка div.
  • Анимация до нижнего элемента и начало с начала.

Проблемы, стоящие в настоящее время:

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

DEMONSTRATION

HTML

<div id="events_partial" class="container body-content col-md-12 col-lg-12 set-max-height"> 
    <div class="row sec-container" id="secContainer"> 
     <div style="top: -550.242px; opacity: 1;" id="secDetails"> 
      <div class="container"> 
       <p><h3><strong> Program in Place 1 &nbsp;on&nbsp;11/22/2015</strong></h3></p> 
       <p> 
        Program Description which is a very long text on document and it can be more than 2 lines 
       </p> 
      </div> 
      <div class="container"> 
       <p><h3><strong> Program in Place 1 &nbsp;on&nbsp;11/22/2015</strong></h3></p> 
       <p> 
        Program Description which is a very long text on document and it can be more than 2 lines 
       </p> 
      </div> 
      <div class="container"> 
       <p><h3><strong> Program in Place 1 &nbsp;on&nbsp;11/22/2015</strong></h3></p> 
       <p> 
        Program Description which is a very long text on document and it can be more than 2 lines 
       </p> 
      </div> 

      <div class="container"> 
       <p><h3><strong> Program in Place 1 &nbsp;on&nbsp;11/22/2015</strong></h3></p> 
       <p> 
        Program Description which is a very long text on document and it can be more than 2 lines 
       </p> 
      </div> 
      <div class="container"> 
       <p><h3><strong> Program in Place 1 &nbsp;on&nbsp;11/22/2015</strong></h3></p> 
       <p> 
        Program Description which is a very long text on document and it can be more than 2 lines 
       </p> 
      </div> 
      <div class="container"> 
       <p><h3><strong> Program in Place 1 &nbsp;on&nbsp;11/22/2015</strong></h3></p> 
       <p> 
        Program Description which is a very long text on document and it can be more than 2 lines 
       </p> 
      </div> 
      <div class="container"> 
       <p><h3><strong> Program in Place 1 &nbsp;on&nbsp;11/22/2015</strong></h3></p> 
       <p> 
        Program Description which is a very long text on document and it can be more than 2 lines 
       </p> 
      </div> 
      <div class="container"> 
       <p><h3><strong> Program in Place 1 &nbsp;on&nbsp;11/22/2015</strong></h3></p> 
       <p> 
        Program Description which is a very long text on document and it can be more than 2 lines 
       </p> 
      </div> 
     </div> 
    </div> 
</div> 

CSS

#events_partial { 
    min-height: 385px !important; 
    margin-top: 57px; 
    overflow: hidden; 
} 
.set-max-height { 
    max-height: 385px !important; 
    padding-top: 30px !important; 
} 

.sec-container { 
    overflow: hidden !important; 
    min-height: 200px; 
} 

#secDetails { 
    position: absolute; 
    margin-top: 0px; 
} 

JS

var animateTime = 50000; //kept varying time because as number of items increases the speed time decreased 
var shouldAnimate = true; 
if ($("#secDetails .container").length < 4) { 
    shouldAnimate = false; 
} 
if ($("#secDetails .container").length >= 4 && $("#secDetails .container").length < 9) 
    animateTime = 10000; 
function marqueePlay() { 
    if (shouldAnimate) { 
     $("#secDetails").animate(
     { 
      top: $("#events_partial").height() - $("#secDetails").height(), 
      opacity: 1 
     }, animateTime, function() { 
      $("#secDetails").css("top", 1); 
      $("#secDetails").css("opacity", 1); 
      marqueePlay(); 
     }); 
    } 
} 
marqueePlay(); 
$("#secDetails").hover(function() { 
    $(this).stop(); //Stop the animation when mouse in 
}, 
function() { 
    marqueePlay(); //Start the animation when mouse out 
}); 

Любая помощь очень ценится.

+0

кажется проблемой 'облегчения'. [[Ссылка] (http://api.jquery.com/animate/)] и [[Ссылка] (http: //api.jqueryui.com/easings /)] должен помочь, я думаю. –

ответ

1

Вот что я смог понять.

Проблема:

  • Существует по умолчанию легкость в действии, что вы хотите избавиться. медленный старт, средний быстрый и медленный финал в анимации один другой easing, который может быть применен к анимации. В вашем случае вы явно не хотите этого, и вы хотели бы, чтобы вещи оживляли в очень linear fashion.
  • Нет прямого способа возобновить анимацию jQuery, о которой я знаю. Поэтому после остановки анимации при зависании, когда вы снова вызываете marqueePlay(), она попытается анимировать оставшееся расстояние за время, заданное в переменной animateTime. Расстояние уменьшается, но время снова применяется. Следовательно, ваша анимация, кажется, медленнее движется в течение небольшого времени, а затем возвращается к нормальной скорости. Кажется, что это так, но на самом деле оно ведет себя так, как должно.

Предлагаемое решение:

  • Основываясь на моем понимании выше, ваш линейный анимация может быть очень легко достигается с помощью requestAnimationFrame API.
  • избежать animate() метода JQuery позволяет легко пауза & резюме наших анимации с помощью простого логического флага.

Ниже приведен фрагмент действия или если вы заинтересованы в его просмотре как jsFiddle.

Отрывок:

// [http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/] 
 
window.requestAnimFrame=(function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(callback){window.setTimeout(callback,1000/60);};})(); 
 
var secDetails=$('#secDetails'); 
 
var container=secDetails.find('.container'); 
 
var eventsPartial=$('#events_partial'); 
 
var currTop=0; 
 
var destTop=eventsPartial.height()-secDetails.height()-parseInt(eventsPartial.css('margin-top')); 
 
var isPaused=false; 
 
var isFirstLoop=true; 
 
var speed=1; 
 
if(container.length>=4&&container.length<9){ 
 
\t requestAnimFrame(render); 
 
\t secDetails.hover(function(){isPaused=true;},function(){isPaused=false;}); 
 
\t currTop=destTop; 
 
} 
 
function render(){ 
 
\t requestAnimFrame(render); 
 
\t if(!isPaused){ 
 
\t \t secDetails.css({transform:'translate3d(1px,'+roundDecimal(currTop,2)+'px,0px)'}); 
 
\t \t currTop+=!isFirstLoop?-speed:speed; 
 
\t \t if(currTop>0) isFirstLoop=false; 
 
\t \t if(currTop<=destTop) currTop=0; 
 
\t } 
 
} 
 
function roundDecimal(value,place){ return Math.round(value*Math.pow(10,place))/Math.pow(10,place); }
#events_partial { 
 
\t min-height: 385px !important; 
 
\t margin-top: 57px; 
 
\t overflow: hidden; 
 
} 
 
.set-max-height { 
 
\t max-height: 385px !important; 
 
\t padding-top: 30px !important; 
 
} 
 
.sec-container { 
 
\t overflow: hidden !important; 
 
\t min-height: 200px; 
 
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"/> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> 
 
<div id="events_partial" class="container body-content col-md-12 col-lg-12 set-max-height"> 
 
\t <div class="row sec-container" id="secContainer"> 
 
\t \t <div id="secDetails"> 
 
\t \t \t <div class="container"> 
 
       <h3><strong> Program in Place 1 &nbsp;on&nbsp;11/22/2015</strong></h3><p>Program Description which is a very long text on document and it can be more than 2 lines</p> 
 
\t \t \t </div> 
 
\t \t \t <div class="container"> 
 
\t \t \t \t <h3><strong> Program in Place 2 &nbsp;on&nbsp;11/22/2015</strong></h3><p>Program Description which is a very long text on document and it can be more than 2 lines</p> 
 
\t \t \t </div> 
 
\t \t \t <div class="container"> 
 
\t \t \t \t <h3><strong> Program in Place 3 &nbsp;on&nbsp;11/22/2015</strong></h3><p>Program Description which is a very long text on document and it can be more than 2 lines</p> 
 
\t \t \t </div> 
 
\t \t \t <div class="container"> 
 
\t \t \t \t <h3><strong> Program in Place 4 &nbsp;on&nbsp;11/22/2015</strong></h3><p>Program Description which is a very long text on document and it can be more than 2 lines</p> 
 
\t \t \t </div> 
 
\t \t \t <div class="container"> 
 
\t \t \t \t <h3><strong> Program in Place 5 &nbsp;on&nbsp;11/22/2015</strong></h3><p>Program Description which is a very long text on document and it can be more than 2 lines</p> 
 
\t \t \t </div> 
 
\t \t \t <div class="container"> 
 
\t \t \t \t <h3><strong> Program in Place 6 &nbsp;on&nbsp;11/22/2015</strong></h3><p>Program Description which is a very long text on document and it can be more than 2 lines</p> 
 
\t \t \t </div> 
 
\t \t \t <div class="container"> 
 
\t \t \t \t <h3><strong> Program in Place 7 &nbsp;on&nbsp;11/22/2015</strong></h3><p>Program Description which is a very long text on document and it can be more than 2 lines</p> 
 
\t \t \t </div> 
 
\t \t \t <div class="container"> 
 
\t \t \t \t <h3><strong> Program in Place 8 &nbsp;on&nbsp;11/22/2015</strong></h3><p>Program Description which is a very long text on document and it can be more than 2 lines</p> 
 
\t \t \t </div> 
 
\t \t </div> 
 
\t </div> 
 
</div>

Позвольте мне знать, если что-то неясно.

P.S. Хотя лично мне не нравится внезапный прыжок, который случается, когда он достигает самого нижнего, а затем снова выводит первый на экран и снова начинает оживлять. Но я могу понять, что это требование в вашем сценарии, возможно, это просто подходит для этого. Это вещь вкуса. Я бы заставил их двигаться вверх и вниз, оживляясь, как yoyo, если бы у меня было это по-своему;).

Update: Вот ваш yoyo jsFiddle. Также забыл упомянуть, что вы можете контролировать скорость анимации, используя переменную speed в коде. Надеюсь это поможет.

+0

Любит это решение !! Это Бинго! Если возможно, вы можете показать образец _aimating как yoyo_, чтобы, если мне это нравится, я пойду с ним только .. :) –

+1

добавил ** Обновление ** выше. –

+0

Спасибо большое @Tahir. Его работа прекрасна, и это очень помогло. Приветствуйте и еще раз спасибо за вашу помощь! :) –

 Смежные вопросы

  • Нет связанных вопросов^_^