@@ -674,13 +674,43 @@ var Search = Control.extend({
674674 // function activateResult
675675 // sets property and adds class to active result
676676 activateResult : function ( $result ) {
677+ // Get position top of last active element
678+ var lastResultPosTop = parseInt ( this . $activeResult && this . $activeResult . position ( ) . top || 0 , 10 ) ;
677679 this . deactivateResult ( ) ;
678680 this . $activeResult = $result ;
679681 this . $activeResult . addClass ( this . options . keyboardActiveClass ) ;
680682
681- var activeResultOffset = this . getActiveResultOffset ( ) ;
683+ // Get position top of current active element
684+ var activeResultPosTop = parseInt ( this . $activeResult . position ( ) . top ) ;
685+ var resultsContainerHeight = this . $resultsContainer . height ( ) ;
682686
683- this . $resultsContainer . scrollTop ( this . $activeResult . position ( ) . top - activeResultOffset ) ;
687+ // Detect if the user is arrowing down
688+ var isMovingDown = lastResultPosTop < this . $activeResult . position ( ) . top ;
689+ var isBelow = activeResultPosTop > resultsContainerHeight ;
690+ var isAbove = activeResultPosTop < 0 ;
691+
692+ if ( isMovingDown && isBelow ) {
693+ this . resetScrollToBottom ( activeResultPosTop , resultsContainerHeight ) ;
694+ }
695+ else if ( isAbove ) {
696+ this . resetScrollToTop ( activeResultPosTop ) ;
697+ }
698+ } ,
699+
700+ resetScrollToTop : function ( activeResultPosTop ) {
701+ this . $resultsContainer . scrollTop (
702+ this . $resultsContainer . scrollTop ( ) +
703+ activeResultPosTop
704+ ) ;
705+ } ,
706+
707+ resetScrollToBottom : function ( activeResultPosTop , resultsContainerHeight ) {
708+ // Calculate active result's position bottom
709+ var scrollTo = ( activeResultPosTop + this . $activeResult . outerHeight ( ) ) -
710+ // Calculate the current scrolled position of the bottom of the list
711+ ( this . getActiveResultOffset ( ) + resultsContainerHeight ) ;
712+
713+ this . $resultsContainer . scrollTop ( scrollTo ) ;
684714 } ,
685715
686716 // function deactivateResult
0 commit comments