2012-02-10 4 views
42

두 개의 div를 특정 너비 (예 : 500px) 크기로 만들려합니다. 다른 하나는 수평으로 정렬됩니다.두 div의 스크롤 위치를 어떻게 동기화합니까?

위쪽 상자는 스크롤 막대를 숨기고 아래쪽에는 스크롤 막대가 표시되어야하며 사용자가 스크롤하면 위쪽 상자의 오프셋을 아래쪽 상자의 값으로 변경하고 싶습니다. 따라서 맨 아래 DIV가 수평으로 스크롤하면 맨 위 DIV가 한꺼번에 스크롤됩니다.

Jquery에서이 작업을 쉽게 처리하면이 작업을 수행 할 수 있습니다. 여기

답변

77
$('#bottom').on('scroll', function() { 
    $('#top').scrollTop($(this).scrollTop()); 
}); 

우리는 그들의 스크롤 위치를 동기화 스크롤 막대 요소에서 scrollTop 값을 받고, 그것은 가치가 모든 .scrollTop()를 사용하여, 다른 요소에 대한 scrollTop을 설정하는 : http://api.jquery.com/scrollTop

이것은 가정 하단 요소의 ID는 bottom이고 상단 요소의 ID는 top입니다.

당신은 top 요소를 사용하여 CSS의 스크롤 바 숨길 수

: 여기

#top { 
    overflow : hidden; 
} 

데모입니다 : 내가 정말이 할 수있는 이유를 해본 적이 가정 http://jsfiddle.net/sgcer/1884/

하지만, 그것은 행동에서 매우 시원해 보입니다.

+0

좋은 예 (감사합니다!). 우연히 유사한 예제를 제공 할 수 있습니까? Jquery Scroll Left를 사용하여 수평으로 스크롤 할 수 있습니까? –

+1

@JosephU. :), 두 개의 인스턴스에 대해'scrollTop'을'scrollLeft'로 바꾸려고 했습니까? – Jasper

+2

@JosephU. 다음은'scrollTop' 대신에'scrollLeft'를 사용하는 방법을 보여주는 업데이트 된 JSFiddle입니다 : http://jsfiddle.net/sgcer/1/ – Jasper

9
나는 당신 모두에게 이중 방향 솔루션 덕분 찾고 있었어요

, 당신의 contibutions 내가이 일을 도왔다 :

$('#cells').on('scroll', function() { 
$('#hours').scrollTop($(this).scrollTop()); 
$('#days').scrollLeft($(this).scrollLeft());}); 

JSFiddle에 참조 :

https://jsfiddle.net/sgcer/1274/가 언젠가 누군가 도움의 희망 -)

24

나는 이것이 낡은 스레드라는 것을 알고 있지만 어쩌면 이것이 누군가를 도울 것입니다. 두 방향으로 스크롤을 동기화해야하는 경우 두 컨테이너의 스크롤 이벤트를 처리하고 스크롤 값을 설정하는 것만으로는 충분하지 않습니다. 그 이유는 스크롤 이벤트가 주기적으로 진행되고 스크롤이 원활하지 않기 때문입니다. 마우스 휠에 의해 Hightom에 의해 주어진 예제). 여기

var isSyncingLeftScroll = false; 
 
var isSyncingRightScroll = false; 
 
var leftDiv = document.getElementById('left'); 
 
var rightDiv = document.getElementById('right'); 
 

 
leftDiv.onscroll = function() { 
 
    if (!isSyncingLeftScroll) { 
 
    isSyncingRightScroll = true; 
 
    rightDiv.scrollTop = this.scrollTop; 
 
    } 
 
    isSyncingLeftScroll = false; 
 
} 
 

 
rightDiv.onscroll = function() { 
 
    if (!isSyncingRightScroll) { 
 
    isSyncingLeftScroll = true; 
 
    leftDiv.scrollTop = this.scrollTop; 
 
    } 
 
    isSyncingRightScroll = false; 
 
}
.container { 
 
    width: 200px; 
 
    height: 500px; 
 
    overflow-y: auto; 
 
} 
 

 
.leftContainer { 
 
    float: left; 
 
} 
 

 
.rightContainer { 
 
    float: right; 
 
}
<div id="left" class="container leftContainer"> 
 
Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt, ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur? At vero eos et accusamus et iusto odio dignissimos ducimus, qui blanditiis praesentium voluptatum deleniti atque corrupti, quos dolores et quas molestias excepturi sint, obcaecati cupiditate non provident, similique sunt in culpa, qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio, cumque nihil impedit, quo minus id, quod maxime placeat, facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet, ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat. 
 
</div> 
 
<div id="right" class="container rightContainer"> 
 
Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt, ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur? At vero eos et accusamus et iusto odio dignissimos ducimus, qui blanditiis praesentium voluptatum deleniti atque corrupti, quos dolores et quas molestias excepturi sint, obcaecati cupiditate non provident, similique sunt in culpa, qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio, cumque nihil impedit, quo minus id, quod maxime placeat, facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet, ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat. 
 
</div>
fiddle입니다 : 여기

이미 스크롤을 동기화 할 수 있는지 확인하는 방법의 예입니다.

+1

완벽 ... 위대한 작품! 고맙습니다. – factorypolaris

+0

위대한, 감사합니다 !! – Wilson

관련 문제