@@ -187,35 +187,72 @@ module.exports = function draw(gd) {
187187
188188 scrollHandler ( scrollBoxY , scrollBarHeight , scrollRatio ) ;
189189
190+ // scroll legend by mousewheel or touchpad swipe up/down
190191 legend . on ( 'wheel' , function ( ) {
191192 scrollBoxY = Lib . constrain (
192193 opts . _scrollY +
193- d3 . event . deltaY / scrollBarYMax * scrollBoxYMax ,
194+ ( ( d3 . event . deltaY / scrollBarYMax ) * scrollBoxYMax ) ,
194195 0 , scrollBoxYMax ) ;
195196 scrollHandler ( scrollBoxY , scrollBarHeight , scrollRatio ) ;
196197 if ( scrollBoxY !== 0 && scrollBoxY !== scrollBoxYMax ) {
197198 d3 . event . preventDefault ( ) ;
198199 }
199200 } ) ;
200201
201- var eventY0 , scrollBoxY0 ;
202+ var eventY0 , eventY1 , scrollBoxY0 ;
202203
203- var drag = d3 . behavior . drag ( )
204+ var getScrollBarDragY = function ( scrollBoxY0 , eventY0 , eventY1 ) {
205+ var y = ( ( eventY1 - eventY0 ) / scrollRatio ) + scrollBoxY0 ;
206+ return Lib . constrain ( y , 0 , scrollBoxYMax ) ;
207+ } ;
208+
209+ var getNaturalDragY = function ( scrollBoxY0 , eventY0 , eventY1 ) {
210+ var y = ( ( eventY0 - eventY1 ) / scrollRatio ) + scrollBoxY0 ;
211+ return Lib . constrain ( y , 0 , scrollBoxYMax ) ;
212+ } ;
213+
214+ // scroll legend by dragging scrollBAR
215+ var scrollBarDrag = d3 . behavior . drag ( )
204216 . on ( 'dragstart' , function ( ) {
205- eventY0 = d3 . event . sourceEvent . clientY ;
217+ var e = d3 . event . sourceEvent ;
218+ if ( e . type === 'touchstart' ) {
219+ eventY0 = e . changedTouches [ 0 ] . clientY ;
220+ } else {
221+ eventY0 = e . clientY ;
222+ }
206223 scrollBoxY0 = scrollBoxY ;
207224 } )
208225 . on ( 'drag' , function ( ) {
209226 var e = d3 . event . sourceEvent ;
210227 if ( e . buttons === 2 || e . ctrlKey ) return ;
211-
212- scrollBoxY = Lib . constrain (
213- ( e . clientY - eventY0 ) / scrollRatio + scrollBoxY0 ,
214- 0 , scrollBoxYMax ) ;
228+ if ( e . type === 'touchmove' ) {
229+ eventY1 = e . changedTouches [ 0 ] . clientY ;
230+ } else {
231+ eventY1 = e . clientY ;
232+ }
233+ scrollBoxY = getScrollBarDragY ( scrollBoxY0 , eventY0 , eventY1 ) ;
215234 scrollHandler ( scrollBoxY , scrollBarHeight , scrollRatio ) ;
216235 } ) ;
236+ scrollBar . call ( scrollBarDrag ) ;
217237
218- scrollBar . call ( drag ) ;
238+ // scroll legend by touch-dragging scrollBOX
239+ var scrollBoxTouchDrag = d3 . behavior . drag ( )
240+ . on ( 'dragstart' , function ( ) {
241+ var e = d3 . event . sourceEvent ;
242+ if ( e . type === 'touchstart' ) {
243+ eventY0 = e . changedTouches [ 0 ] . clientY ;
244+ scrollBoxY0 = scrollBoxY ;
245+ }
246+ } )
247+ . on ( 'drag' , function ( ) {
248+ var e = d3 . event . sourceEvent ;
249+ if ( e . type === 'touchmove' ) {
250+ eventY1 = e . changedTouches [ 0 ] . clientY ;
251+ scrollBoxY = getNaturalDragY ( scrollBoxY0 , eventY0 , eventY1 ) ;
252+ scrollHandler ( scrollBoxY , scrollBarHeight , scrollRatio ) ;
253+ }
254+ } ) ;
255+ scrollBox . call ( scrollBoxTouchDrag ) ;
219256 }
220257
221258 function scrollHandler ( scrollBoxY , scrollBarHeight , scrollRatio ) {
0 commit comments