@@ -60,6 +60,7 @@ function stack() {
6060 sectionNext = d3 . select ( section [ 0 ] [ 1 ] ) . style ( "display" , "block" ) ;
6161
6262 d3 . select ( window )
63+ . on ( "beforeunload" , function ( ) { scrollTo ( 0 , 0 ) ; } ) // Reset to top on F5
6364 . on ( "resize.stack" , resize )
6465 . on ( "scroll.stack" , reposition )
6566 . on ( "keydown.stack" , keydown )
@@ -119,34 +120,31 @@ function stack() {
119120 if ( ! isNaN ( y0 ) ) scrollTo ( 0 , ( y = y0 ) * windowHeight ) ;
120121 }
121122
122- function reposition ( ) {
123- var y1 = pageYOffset / windowHeight ,
124- i1 = Math . max ( 0 , Math . min ( n - 1 , Math . floor ( y1 ) ) ) ;
123+ function reposition ( _pageYOffset ) {
124+ _pageYOffset = _pageYOffset || pageYOffset ;
125+ var y1 = _pageYOffset / windowHeight ,
126+ i1 = Math . max ( 0 , Math . min ( n - 1 , y1 ) ) ;
127+ i1 = i1 > i ? Math . floor ( i1 ) : Math . ceil ( i1 ) ;
125128
126129 if ( i !== i1 ) {
127130 if ( i1 === i + 1 ) { // advance one
128131 sectionCurrent . style ( "display" , "none" ) ;
129132 sectionCurrent = sectionNext ;
130133 sectionNext = d3 . select ( section [ 0 ] [ i1 + 1 ] ) ;
131- dispatchEvent ( { type : "deactivate" } , i ) ;
132- if ( i1 < n - 1 ) dispatchEvent ( { type : "activate" } , i1 + 1 ) ;
133134 } else if ( i1 === i - 1 ) { // rewind one
134135 sectionNext . style ( "display" , "none" ) ;
135136 sectionNext = sectionCurrent ;
136137 sectionCurrent = d3 . select ( section [ 0 ] [ i1 ] ) ;
137- if ( i < n - 1 ) dispatchEvent ( { type : "deactivate" } , i + 1 ) ;
138- dispatchEvent ( { type : "activate" } , i1 ) ;
139138 } else { // skip
140139 sectionCurrent . style ( "display" , "none" ) ;
141140 sectionNext . style ( "display" , "none" ) ;
142141 sectionCurrent = d3 . select ( section [ 0 ] [ i1 ] ) ;
143142 sectionNext = d3 . select ( section [ 0 ] [ i1 + 1 ] ) ;
144- if ( ! isNaN ( i ) ) dispatchEvent ( { type : "deactivate" } , i + 1 ) , dispatchEvent ( { type : "deactivate" } , i ) ;
145- dispatchEvent ( { type : "activate" } , i1 ) ;
146- if ( i1 < n - 1 ) dispatchEvent ( { type : "activate" } , i1 + 1 ) ;
147143 }
148144 sectionCurrent . style ( "display" , "block" ) . style ( "opacity" , 1 ) ;
149145 sectionNext . style ( "display" , "block" ) ;
146+ if ( ! isNaN ( i ) ) dispatchEvent ( { type : "deactivate" } , i ) ;
147+ if ( i1 < n ) dispatchEvent ( { type : "activate" } , i1 ) ;
150148 i = i1 ;
151149 }
152150
@@ -173,8 +171,11 @@ function stack() {
173171 case 33 : // page up
174172 delta = d3 . event . metaKey ? - Infinity : - 1 ; break ;
175173 case 32 : // space
176- delta = d3 . event . shiftKey ? - 1 : 1 ;
177- break ;
174+ delta = d3 . event . shiftKey ? - 1 : 1 ; break ;
175+ case 36 : // home
176+ delta = - Infinity ; break ;
177+ case 35 : // end
178+ delta = Infinity ; break ;
178179 default : return ;
179180 }
180181
@@ -187,7 +188,7 @@ function stack() {
187188 d3 . select ( document . documentElement )
188189 . interrupt ( )
189190 . transition ( )
190- . duration ( 500 )
191+ . duration ( Math . abs ( delta ) > 1 ? 0 : 500 )
191192 . tween ( "scroll" , function ( ) {
192193 var i = d3 . interpolateNumber ( pageYOffset , yt * windowHeight ) ;
193194 return function ( t ) { scrollTo ( 0 , i ( t ) ) ; } ;
@@ -197,6 +198,19 @@ function stack() {
197198 d3 . event . preventDefault ( ) ;
198199 }
199200
201+ stack . scrollToPage = function ( page ) {
202+ sectionCurrent . transition ( )
203+ . style ( "opacity" , 0 )
204+ . each ( "end" , function ( ) {
205+ reposition ( page * windowHeight ) ;
206+ sectionCurrent
207+ . transition ( )
208+ . style ( "opacity" , 1 )
209+ ;
210+ } )
211+ ;
212+ } ;
213+
200214 stack . size = function ( _ ) {
201215 return arguments . length ? ( size = [ + _ [ 0 ] , + _ [ 1 ] ] , resize ( ) , stack ) : size ;
202216 } ;
0 commit comments