Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.03.2015, 16:51
Аспирант
Отправить личное сообщение для piraids Посмотреть профиль Найти все сообщения от piraids
 
Регистрация: 20.08.2013
Сообщений: 88

jScrollPane анимация без очереди
Использую такой плагин:
https://github.com/vitch/jScrollPane

По клику на стрелку вызывается функция в которой запускается скрол по горизонтали на x пикселей. Вкратце это выглядит вот так:

function Scroll() {
 var element = $('#test').jScrollPane({
                    showArrows:false,
                    maintainPosition:true,
                    horizontalGutter:0,
                    verticalGutter:0
                  }),
        api = element.data('jsp'),
        apiScrollWidth = 100;
        api.scrollByX(apiScrollWidth, true);
}

$('.arrow').click(function(e){
  e.preventDefault();
  Scroll();
});


вот по клику на стрелку смещение происходит на 100px вправо
если быстро кликать на стрелку то сбивается смещение - вместо 100 сдвигается на меньшее, как этого избежать? я понимаю что необходимо вызывать функцию по завершению текущей анимации, вот только как узнать что анимация закончилась? callback функций в плагине я не нашел, может слепой..

пробывал дописывать вот так:
var element = $('#test').jScrollPane({
                    showArrows:false,
                    maintainPosition:true,
                    horizontalGutter:0,
                    verticalGutter:0
                  }).bind('jsp-scroll-x', scrollHandler);

function scrollHandler(event, destLeft, animateScroll, isAtLeft, isAtRight)
{
      console.log(event);
}


так срабатывает при скроллинге, но показывает не то что нужно

набросал пример - если быстро щелкать то сбивается, как решить?

также пример этотже здесь http://learn.javascript.ru/play/YI3mV

нашел animate в api - api.animate - как бы вытянуть оттуда callback?

<!DOCTYPE html>
<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  	#test{ overflow: hidden; }
  	.red { background-color: red; width: 30px; height: 30px; }
  	.green { background-color: green; width: 30px; height: 30px; }
  	table { border-collapse: collapse; border: 0; }
    .arrow { position: absolute; top: 5%; border: 1px solid; padding: 0 5px; cursor:pointer; }
    .arrow.right { right: 0; }
    .arrow.left { left: 0; }
    .wrap { position: relative; width: 129px; padding: 0 35px; }
    .jspHorizontalBar { display: none; }
  </style>
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
  <script src="http://jscrollpane.kelvinluck.com/script/jquery.jscrollpane.js"></script>
  <link rel="stylesheet" href="http://jscrollpane.kelvinluck.com/style/jquery.jscrollpane.css" type="text/css" media="screen">
  <script src="http://jscrollpane.kelvinluck.com/script/jquery.mousewheel.js"></script>
  <script>
	$(document).ready(function(){
		var element = $('#test').jScrollPane({ showArrows:false,maintainPosition:true, horizontalGutter:0, verticalGutter:0 });
    	  
      	function Scroll(element, side) {
       	  side = '' || side;
          var api = element.data('jsp'),
              mark = '';
          
          if (side == 'left') {
            mark = '-';
          }
        
          api.scrollByX(mark+'32', true);
      	}

      	$('.arrow').click(function(){ 
          var side = '';
          if ($(this).is('.left')) {
            side = 'left';
          }
          Scroll(element, side); 
        });
    });
  </script>
</head>

<body>
<!-- вот такой получился пример -->
<div class="wrap">
  	<div class="arrow left">◄</div>
	<div id="test">
        <table>
			<tr>
				<td><div class="red"></div></td>
				<td><div class="green"></div></td>
				<td><div class="red"></div></td>
				<td><div class="green"></div></td>
             	<td><div class="red"></div></td>
               	<td><div class="green"></div></td>
				<td><div class="red"></div></td>
              	<td><div class="green"></div></td>
				<td><div class="red"></div></td>
              	<td><div class="red"></div></td>
				<td><div class="green"></div></td>
				<td><div class="red"></div></td>
				<td><div class="green"></div></td>
             	<td><div class="red"></div></td>
               	<td><div class="green"></div></td>
				<td><div class="red"></div></td>
              	<td><div class="green"></div></td>
				<td><div class="red"></div></td>
       	 	</tr>
     	</table>
  	</div>
  	<div class="arrow right">►</div>
</div>
</body>
</html>

Последний раз редактировалось piraids, 12.03.2015 в 17:25.
Ответить с цитированием
  #2 (permalink)  
Старый 16.03.2015, 09:53
Аспирант
Отправить личное сообщение для piraids Посмотреть профиль Найти все сообщения от piraids
 
Регистрация: 20.08.2013
Сообщений: 88

топ
Ответить с цитированием
  #3 (permalink)  
Старый 16.03.2015, 10:24
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

piraids,
зачем вам куча плагинов для обыкновенного слайдера ?
<!DOCTYPE html>
<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  	#test{ overflow: hidden;  }
  	.red { background-color: red; width: 30px; height: 30px; }
  	.green { background-color: green; width: 30px; height: 30px; }
  	table { border-collapse: collapse; border: 0; position: relative; top: 0;}
    .arrow { position: absolute; top: 5%; border: 1px solid; padding: 0 5px; cursor:pointer; }
    .arrow.right { right: 0; }
    .arrow.left { left: 0; }
    .wrap { position: relative; width: 129px; padding: 0 35px; }
    .jspHorizontalBar { display: none; }
  </style>
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
  <script>
	$(document).ready(function(){
		var element = $('#test'), table = $('table', element),left = 0, min = element.width() - table.width() ;
      	$('.arrow').click(function(){
          left += $(this).is('.left') ? 32 : -32;
          left < min && (left = min);
          left > 0 && (left = 0);
          table.stop(true,true).animate({left : left},800)
        });
    });
  </script>
</head>

<body>
<!-- вот такой получился пример -->
<div class="wrap">
  	<div class="arrow left">&#9668;</div>
	<div id="test">
        <table>
			<tr>
				<td><div class="red"></div></td>
				<td><div class="green"></div></td>
				<td><div class="red"></div></td>
				<td><div class="green"></div></td>
             	<td><div class="red"></div></td>
               	<td><div class="green"></div></td>
				<td><div class="red"></div></td>
              	<td><div class="green"></div></td>
				<td><div class="red"></div></td>
              	<td><div class="red"></div></td>
				<td><div class="green"></div></td>
				<td><div class="red"></div></td>
				<td><div class="green"></div></td>
             	<td><div class="red"></div></td>
               	<td><div class="green"></div></td>
				<td><div class="red"></div></td>
              	<td><div class="green"></div></td>
				<td><div class="red"></div></td>
       	 	</tr>
     	</table>
  	</div>
  	<div class="arrow right">&#9658;</div>
</div>
</body>
</html>
Ответить с цитированием
  #4 (permalink)  
Старый 17.03.2015, 11:49
Аспирант
Отправить личное сообщение для piraids Посмотреть профиль Найти все сообщения от piraids
 
Регистрация: 20.08.2013
Сообщений: 88

рони,
согласен) и без плагина все работает)
но все равно интересно как можно разрешить проблему с плагином, кроме как не использовать его или использовать другой?) никак?)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книгу без воды, обычным языком, с нуля до конца сразу с примерами понятную xcislav Учебные материалы 8 22.07.2014 15:20
Воспроизведение аудиофайлов в заданной очереди javascript Роберт Потоцкий Общие вопросы Javascript 3 30.03.2014 15:28
Анимация в real-time приложениях(Нужны советы) ak-o AJAX и COMET 5 05.04.2013 11:34
Анимация по очереди zebra741258963 jQuery 6 14.12.2011 08:21
Анимация. Помогите понять почему не работает. kadurban jQuery 4 08.07.2010 20:50