Автопрокрутка DIV - - PullRequest
       13

Автопрокрутка DIV -

0 голосов
/ 09 мая 2018

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

Вот скрипка прототипа: http://jsfiddle.net/creativesplash/4xuy7fc6/1/

А вот фрагмент:

// global level variables.
var isPaused = false;
var direction = 1;
var element = $('#box');

// interval for scroll.
setInterval(function () {
    if (!isPaused) {
        var pos = element.scrollLeft();
        var offset = 1 * direction;
        element.scrollLeft(pos + offset);

        // Change the scroll direction when hit an end.
        if ((element[0].scrollWidth - element.scrollLeft() == element.outerWidth()) || (element.scrollLeft() <= 0)) {
            direction *= -1;
        }
    }

}, 10);

$('#box').hover(

function () {
    isPaused = true;
}, function () {
    isPaused = false;
});
.boxes {width:75px; height:75px; display:inline-block; border:1px solid #ccc; text-align:center; padding-top:50px;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="box" class="timeline container" style="overflow-y:scroll; width:100%; white-space:nowrap">
  <div class="boxes">1</div>
  <div class="boxes">2</div>
  <div class="boxes">3</div>
  <div class="boxes">4</div>
  <div class="boxes">5</div>
  <div class="boxes">6</div>
  <div class="boxes">7</div>
  <div class="boxes">8</div>
  <div class="boxes">9</div>
  <div class="boxes">10</div>
  <div class="boxes">1</div>
  <div class="boxes">2</div>
  <div class="boxes">3</div>
  <div class="boxes">4</div>
  <div class="boxes">5</div>
  <div class="boxes">6</div>
  <div class="boxes">7</div>
  <div class="boxes">8</div>
  <div class="boxes">9</div>
  <div class="boxes">10</div>
  <div class="boxes">1</div>
  <div class="boxes">2</div>
  <div class="boxes">3</div>
  <div class="boxes">4</div>
  <div class="boxes">5</div>
  <div class="boxes">6</div>
  <div class="boxes">7</div>
  <div class="boxes">8</div>
  <div class="boxes">9</div>
  <div class="boxes">10</div>
  <div class="boxes">1</div>
  <div class="boxes">2</div>
  <div class="boxes">3</div>
  <div class="boxes">4</div>
  <div class="boxes">5</div>
  <div class="boxes">6</div>
  <div class="boxes">7</div>
  <div class="boxes">8</div>
  <div class="boxes">9</div>
  <div class="boxes">10</div>
</div>

1 Ответ

0 голосов
/ 09 мая 2018

Если я правильно понял, ваш код работает хорошо, но вы хотите более эффективный способ для таких устройств, как мобильные устройства, у которых нет hover?

А как насчет touchstart события? как то так:

$('#box').on('touchstart', function(ev){
  if (isPaused){
    isPaused = false;
  }else{
    isPaused = true;
  }
});

Я не проверял это, я не знаю, будет ли это работать так, как вы ожидаете, но моя логика здесь:
Окна прокручиваются, затем пользователь нажимает #box, и он останавливается, если он снова касается, он снова начинает прокручиваться. Это всего лишь идея.

EDIT

Вот фрагмент того, о чем мы говорили в комментариях
Таймер холостого хода до прокрутки + перетаскивание и касание события, чтобы остановить прокрутку
откройте фрагмент и запустите для проверки

$(document).ready(function(){
  // global level variables.
  var isPaused = false;
  var direction = 1;
  var element = $('#box');
  var waitTimerUntilScroll = 4000;
  var idleTimer = setTimeout(setScrolling, waitTimerUntilScroll);
  var scroller;

  window.onmousemove = resetTimer;
  window.onmousedown = resetTimer; 
  window.ontouchstart = resetTimer; 
  window.onclick = resetTimer;     
  window.onkeypress = resetTimer;   
  window.addEventListener('scroll', resetTimer, true); 
  
  $('#box').on('touchstart', function(ev){
    if (isPaused){
      isPaused = false;
    }else{
      isPaused = true;
    }
	});
  
  $('#box').hover(
  	function () {
    	isPaused = true;
    }, 
    function () {
      isPaused = false;
    }
  );  
  
  function resetTimer() {
    clearTimeout(idleTimer);
    idleTimer = setTimeout(setScrolling, waitTimerUntilScroll);  // time is in milliseconds
  }
  
  // interval for scroll - called only when idle
  function setScrolling(){
    scroller = setInterval(function () {
      if (!isPaused) {
        clearTimeout(idleTimer);
        var pos = element.scrollLeft();
        var offset = 1 * direction;
        element.scrollLeft(pos + offset);

        // Change the scroll direction when hit an end.
        if ((element[0].scrollWidth - element.scrollLeft() == element.outerWidth()) || (element.scrollLeft() <= 0)) {
            direction *= -1;
          }
      }

    }, 10);
	}
});
.boxes {width:75px; height:75px; display:inline-block; border:1px solid #ccc; text-align:center; padding-top:50px;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="box" class="timeline container" style="overflow-y:scroll; width:100%; white-space:nowrap">
  <div class="boxes">1</div>
  <div class="boxes">2</div>
  <div class="boxes">3</div>
  <div class="boxes">4</div>
  <div class="boxes">5</div>
  <div class="boxes">6</div>
  <div class="boxes">7</div>
  <div class="boxes">8</div>
  <div class="boxes">9</div>
  <div class="boxes">10</div>
  <div class="boxes">1</div>
  <div class="boxes">2</div>
  <div class="boxes">3</div>
  <div class="boxes">4</div>
  <div class="boxes">5</div>
  <div class="boxes">6</div>
  <div class="boxes">7</div>
  <div class="boxes">8</div>
  <div class="boxes">9</div>
  <div class="boxes">10</div>
  <div class="boxes">1</div>
  <div class="boxes">2</div>
  <div class="boxes">3</div>
  <div class="boxes">4</div>
  <div class="boxes">5</div>
  <div class="boxes">6</div>
  <div class="boxes">7</div>
  <div class="boxes">8</div>
  <div class="boxes">9</div>
  <div class="boxes">10</div>
  <div class="boxes">1</div>
  <div class="boxes">2</div>
  <div class="boxes">3</div>
  <div class="boxes">4</div>
  <div class="boxes">5</div>
  <div class="boxes">6</div>
  <div class="boxes">7</div>
  <div class="boxes">8</div>
  <div class="boxes">9</div>
  <div class="boxes">10</div>
</div>
...