2013-06-03 2 views
1

Я пытаюсь создать горизонтальный скроллер для этого. http://www.k2.pl/горизонтальный ускоренный карусельный скроллер

Я сделал прототип здесь. http://jsfiddle.net/Uu3aP/1

Я заглянул в плагины карусели, но никто не функционирует так, как хотелось бы.

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

Здесь я нахожусь, любая помощь будет оценена по достоинству.

HTML

<div id="scroll"> 
<div id="scrollContainer"> 
<ul> 
    <li><img src="http://placehold.it/350x350" alt="" /></li> 
    <li><img src="http://placehold.it/350x350" alt="" /></li> 
    <li><img src="http://placehold.it/350x350" alt="" /></li> 
    <li><img src="http://placehold.it/350x350" alt="" /></li> 
    <li><img src="http://placehold.it/350x350" alt="" /></li> 
</ul> 
</div> 

CSS

body { 
    margin: 0; 
} 
#scroll { 
    width: 100%; 
    overflow: hidden; 
} 
#scrollContainer * { 
    float: left; 
    list-style: none; 
    margin: 0; 
    padding: 0; 
} 

JAVASCRIPT

$(document).ready(function() { 

    var $totalwidth = 0; 
    var $paneTarget = $('#scroll'); 
    var $paneContainer = $('#scrollContainer'); 
    var $this = $(this); 
    var $w = $this.width(); 

    $paneTarget.find('li').each(function() { 
     $totalwidth += $this.width(); 
     $paneContainer.width($totalwidth); 
    }); 

    $paneTarget.on('mousemove', function(e) { 
     if ((e.pageX) < $w/2) { 
      $paneTarget.stop().scrollTo({top:'0', left:'-=100'}, 200, {easing: 'linear'}); 
     } else if ((e.pageX) > ($w/2)) { 
      $paneTarget.stop().scrollTo({top:'0', left:'+=100'}, 200, {easing: 'linear'}); 
     } 
     else { 
      $paneTarget.stop(); 
     } 
    }); 

}); 

ответ

2

Я играл немного с скрипку и пришел с этим: Fiddle

Вместо использования плагина scrollTo или анимации jQuery я создал настраиваемый метод анимации, который вызывается с помощью setInterval.

// This gets called from the setInterval and handles the animating 
function animationLoop() { 
    var dx = targetX - posX, // Difference 
     vx = dx * EASING;  // Velocity 

    // Add velocity to x position and update css with new position 
    posX += vx; 
    $paneContainer.css({left: posX});    
} 

targetX обновляется в обработчике MouseMove

// Calculate the new x position for the scroll container 
targetX = Math.round((event.pageX/windowWidth) * maxScroll); 

[Редактировать]
Для обработки изменения размеров окна у вас есть в основном только для сброса WindowWidth и maxScroll переменные:

$(window).on('resize', function() { 
    windowWidth = $(window).width(); 
    maxScroll = -(containerWidth - windowWidth); 

    // OPTIONAL: 
    // Move scrollpane to original position on resize 
    targetX = 0; 
    // Start animating if it's not already 
    // Probably better in a new function: duplicate code from mousemove.. 
    if (!animInterval) { 
     animInterval = setInterval(animationLoop, 1000/FPS); 
    } 
}); 

Updated jsfiddle

+0

Это действительно умное спасибо! Я все еще пытаюсь определить, как все это работает. У меня вопрос. Когда я превращаю это в функцию и вызывается изменение размера, оно работает, но становится глючным, http://jsfiddle.net/qfNyM/ – hyperdrive

+0

В вашем обработчике изменения размера вам нужно только повторно инициализировать windowWidth и maxScroll. – Hendrik

+0

Спасибо. Я получил его для работы, завернув его в функцию и удалив объявление var. Является ли это больше работы, тогда это нужно делать, и, честно говоря, я не знаю, как повторно инициализировать переменные из-за пределов функции, я рассмотрю это. Вы очень помогли. – hyperdrive

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