2016-08-03 4 views
3

스크롤 막대가있는 페이지에 두 개의 div가 성공적으로 표시되고 한 div가 스크롤 될 때 jQuery를 사용하여 다른 스크롤이 적절하게 스크롤됩니다.부끄러운 스크롤 휠없이 Divs의 동기화 스크롤

$('#left').scroll(function() { 
    $('#right').scrollTop($(this).scrollTop()); 
}); 

$('#right').scroll(function() { 
    $('#left').scrollTop($(this).scrollTop()); 
}); 

이 키보드를 사용하거나 스크롤 할 스크롤 막대를 드래그 클릭으로 함께으로 잘 작동하지만 마우스 스크롤 휠을 사용하는 경우는 그 사실에, 나는 생각한다, 때문에, 매우 느린 '피드백 루프'가 있습니다.

마우스 휠을 사용하여 스크롤하는 것이 원활하게 이루어 지도록이 루프를 방지 할 수있는 방법이 있습니까?

여기에 fiddle이 있습니다.

+0

허용 된 대답은 정말 (아마 때문에 내가 동기화 스크롤을하기 위해 노력하고있어 테이블의 규모의) 나를 위해 작동하지 않았지만, 다른 문제에 [이 답변 ] (https://stackoverflow.com/questions/39261456/reducing-scroll-jank-when-using-overflow-y-scroll/39377543#39377543) 많은 도움이되었습니다. – Constantinos

답변

3

divsscroll 이벤트 리스너가 있다는 것이 문제입니다. 그 사건은 그때 튀어 오릅니다. 하나의 workaroung은 off으로 다른 청취자를 바인딩 해제 한 후 나중에 다시 할당하는 것입니다.

브라우저가 scrollTop을 새 값으로 설정하는 데 다소 시간이 걸리기 때문에 약간의 지연이 있어야합니다. 한 가지 방법은 setTimeout을이 작업에 사용하는 것입니다.

// a helper variable 
var timeout; 

$('#left, #right').on("scroll", function callback() { 
    // clear the 'timeout' every 'scroll' event call 
    // to prevent re-assign 'scroll' event to other element 
    // before finished scrolling 
    clearTimeout(timeout); 

    // get the used elements 
    var source = $(this), 
     target = $(source.is("#left") ? '#right' : '#left'); 

    // remove the callback from the other 'div' and set the 'scrollTop' 
    target.off("scroll").scrollTop(source.scrollTop()); 

    // create a new 'timeout' and reassign 'scroll' event 
    // to other 'div' on 100ms after the last event call 
    timeout = setTimeout(function() { 
     target.on("scroll", callback); 
    }, 100); 
}); 

Working example.

+1

글쎄,이게 더 빠를 지 모르겠다. 'id' 셀렉터는 꽤 빠르며'not()'는 필터 액션입니다. 어쩌면 더 빠를 수도 있고 아닐 수도 있습니다. 하지만 당신의 접근 방식은 확실히 작동합니다! @Guedes 작업 예제를 위해 여기에서했습니다. http://jsfiddle.net/sgcer/1794/ – eisbehr

+0

방금이 프로젝트를 구현했으며 완벽하게 작동합니다! 감사! –

+0

여러분, 환영합니다 @PhilipStratford! – eisbehr

관련 문제