2014-11-20 2 views
3

Я бы хотел прокрутить несколько div в одно и то же время.Прокрутка нескольких элементов/DIVs

У меня есть то, что работает, но это не производительное на медленных машины (мобильные особенно)

<!-- HTML --> 
<div class="container"> 
    <div class="row"> 
     <div class="scroller"> 
      <div>some really long content that just keeps going on and on and on and on and on and on and on and on and on and on and on and on and on</div> 
     </div> 
    </div> 
    <div class="row"> 
     <div class="scroller"> 
      <div>some really long content that just keeps going on and on and on and on and on and on and on and on and on and on and on and on and on</div> 
     </div> 
    </div> 
    <div class="row"> 
     <div class="scroller"> 
      <div>some really long content that just keeps going on and on and on and on and on and on and on and on and on and on and on and on and on</div> 
     </div> 
    </div> 
    <div class="row"> 
     <div class="scroller"> 
      <div>some really long content that just keeps going on and on and on and on and on and on and on and on and on and on and on and on and on</div> 
     </div> 
    </div> 
    <div class="row"> 
     <div class="scroller"> 
      <div>some really long content that just keeps going on and on and on and on and on and on and on and on and on and on and on and on and on</div> 
     </div> 
    </div> 
</div> 
<style> 
/* CSS */ 
    .container { width:300px; } 
    .scroller { width:100%; height:40px; padding:0 0 16px; line-height:40px; overflow-x:auto; overflow-y:hidden; white-space:nowrap; } 
</style> 

<script> 
// jQuery 
$(".scroller").scroll(function(){ 
    $(".scroller").scrollLeft($(this).scrollLeft()); 
}); 
</script> 

Here's a pen/demo

Я могу видеть, что whevever прокручивает элемент, что она прокручивается другой элементы того же класса, но поскольку я установил «слушатель» прокрутки в этом классе, функция снова срабатывает для каждого из других элементов, поскольку они прокручиваются с помощью метода scrollLeft.

Есть ли у кого-нибудь идеи, как я могу это улучшить?

+0

Таким образом, только для уточнения: поведение прокрутки, все прокрутки в то же время предназначено, и это всего лишь производительность? – Markai

+0

Правильно @ Маркай. – RussAtkins

+0

И должны ли они быть обновлены в реальном времени, то есть когда перемещается полоса прокрутки или она достаточно, чтобы переместить их в конце прокрутки? – Markai

ответ

2

Вы можете использовать следующий фрагмент кода: {нужно несколько тестов, не уверен, что он обрабатывает все случаи}

$(".scroller").css('outline', 0).attr('tabindex' , -1).scroll(function(e){ 
    if (!$(this).is(':hover') && !$(this).is(':focus')) return; 
    $(".scroller").not(this).scrollLeft($(this).scrollLeft()); 
}); 
+0

Это определенно намного быстрее, спасибо, хотя на мобильном (Android-хром) мне кажется, что мне нужно «touchstart», и подождите несколько мс до тех пор, пока не будут применены: focus или: hover. Это можно продемонстрировать добавлением .scroller: hover, .scroller: focus {background-color: # 333; } в css – RussAtkins

1

Вы можете отключить обработчик прокрутки всех элементов перед вызовом scrollLeft() повторно включить обработчики прокрутки после , Это предотвратит повторный вызов обработчика.

var scrollHandler = function(){ 
    var $scrollers = $(".scroller"); 
    $scrollers.off("scroll", scrollHandler); 
    $scrollers.scrollLeft($(this).scrollLeft()); 
    setTimeout(function(){$scrollers.on("scroll", scrollHandler);}, 0); 
} 

$(".scroller").on("scroll", scrollHandler); 
+1

Как я вижу, вы должны отложить повторное связывание: 'setTimeout (function() {$ scrollers.on (" scroll ", scrollHandler);}, 0);' –

+0

Good call @ A.Wolff - обновлено мой код. – CodingWithSpike

+0

Я думаю, это самый чистый путь! –

0

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

$(".scroller").scroll(function(e){ 
    $(".scroller").not(this).scrollLeft($(this).scrollLeft()); 
}); 
+0

Я попытался это изначально, проблема в том, что «$ (this) .scrollLeft()« перезапускает весь mehod на другом «.scroller», который, в свою очередь, вызывает себя ... это может быть показано добавив это в метод прокрутки: 'var $ index = $ (this) .index (". scroller "); // это индекс для игнорирования. console.log ($ index); ' – RussAtkins

1

Не могли бы вы просто только прокручивать элементы, которые оттиск позиция отличается?

$(".scroller").on('scroll', function(event){ 
    var a = $(this).scrollLeft(); 
    $(".scroller").each(function(){ 
    var b = $(this).scrollLeft(); 
    if(a !== b){ 
     $(this).scrollLeft(a); 
    } 
    }); 
}); 
+1

К сожалению, по-прежнему сохраняются события прокрутки для других DIV. Хотя я не уверен, что такое точная проблема с вопросом OP –

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