2013-06-25 4 views
1

아래쪽으로 자동 스크롤하고 다시 맨 위로 계속 돌아가려면 id list의 요소가 있지만 사용자가 스크롤을 제어 할 수 있도록 스크롤을 중지해야합니다. 사용자가 요소에 "mousemove mousedown"이없는 일정 시간이 지나면 요소가 자동 스크롤을 다시 시작해야합니다.시간 초과 후 자동 스크롤

타임 아웃 (자동 스크롤 다운 후 자동 스크롤) 및 간격 (위아래 자동 스크롤 계속) 및 "mousemove mousedown"이벤트를 관리하고 해당 이벤트가 발생하면 애니메이션을 중지하는 데 어려움이 있습니다. 내 코드는 뒤죽박죽이었다.

내 아래로 스크롤 :

$("#list").animate({ 
scrollTop : $("#list")[0].scrollHeight 
}, timeDown); 

위로 스크롤 : 당신이 호출 할 animate 콜백을 사용할 수있는 것보다

$("#list").animate({ 
    scrollTop : 0 
}, timeUp); 

답변

1

http://jsbin.com/oqadud/3/edit

$list = $('#list'); 
$listSH = $list[0].scrollHeight - $list.outerHeight(); 

function loop(){ 
    var t = $list.scrollTop(); 
    $list.stop().animate({scrollTop : !t ? $listSH : 0 }, 2000, loop); 
} 
loop(); 

$list.on('mouseenter mouseleave', function(e){ 
    return e.type=="mouseenter"? $list.stop() : loop(); 
}); 

$listSH가 실제로 사용 가능한 scrollHeight를 반환합니다 function loop()은 ou를 반복합니다. r 애니메이션. 하는 MouseLeave 또는 기타 상황의 경우에 우리는 다른 $listSH에 부울 !t (is0==false) 애니메이션이 0에 애니메이션을 경우에 할 수있는 무엇 ternary operator (? :)을 요청할 수 있도록 - 우리가 현재 $list.scrollTop(); 위치를 얻기 위해 필요한 loop 내부

. DOM 준비 당신이 전화에

시작/당신의 loop()

'mouseenter mouseleave' 횡령 사건에와 다시 삼항 연산자의 내부가 수행
mouseenter == 이벤트 IF : .stop() 어떤 애니메이션 ELSE
: loop() 기능을 다시 시작하십시오 (내가 말했듯이 현재 scrollTop()에서).

+1

아주 좋습니다. 나는 mouseenter보다는 mouseout 시간 초과를 찾고 있었다. 방금 settimeout에 추가했습니다. 그리고 자동 스크롤을 할 시간을 정하고 자동 스크롤을 할 시간을 어떻게 내릴 것인가? – John

+0

@Anonymous 몇시에요? 당신은 당신이 필요로하는 무엇이든으로'2000 년을 변경할 수있다 –

+1

나는 분리 된 상하 스크롤 속도를 원했다. 나는 그것을 알아 냈다, 나는 삼항 연산자를 추가했다 :! t? timeDown : timeUp 여기서 2000입니다. – John