-
Notifications
You must be signed in to change notification settings - Fork 7.3k
/
beyondFullPageHandler.js
84 lines (71 loc) · 3.03 KB
/
beyondFullPageHandler.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import * as utils from '../common/utils.js';
import { getState, setState } from "../common/state.js";
import { setPrevTime } from '../common/tick.js';
import { getOptions } from '../common/options.js';
import { scrollTo } from '../common/scrollTo.js';
import { wheelDataHandler } from './wheelDataHandler.js';
import { getScrollSettings } from '../common/utilsFP.js';
export function beyondFullPageHandler(container, e){
var curTime = new Date().getTime();
var pauseScroll = getState().isBeyondFullpage && container.getBoundingClientRect().bottom >= 0 && wheelDataHandler.getDirection() === 'up';
var g_isAboutToScrollToFullPage = getState().isAboutToScrollToFullPage;
if(g_isAboutToScrollToFullPage){
setPrevTime(curTime);
utils.preventDefault(e);
return false;
}
if(getState().isBeyondFullpage){
if(!pauseScroll){
keyframeTime('set', 'beyondFullpage', 1000);
}
else {
var shouldSetFixedPosition = !g_isAboutToScrollToFullPage && (!keyframeTime('isNewKeyframe', 'beyondFullpage') || !wheelDataHandler.isAccelerating() );
var scrollSettings;
if( shouldSetFixedPosition ){
scrollSettings = getScrollSettings(utils.getLast(getState().sections).item.offsetTop + utils.getLast(getState().sections).item.offsetHeight);
scrollSettings.element.scrollTo(0, scrollSettings.options);
setState({isAboutToScrollToFullPage: false});
utils.preventDefault(e);
return false;
}
else if( wheelDataHandler.isAccelerating() ){
pauseScroll = false;
setState({isAboutToScrollToFullPage: true});
setState({scrollTrigger: 'wheel'});
scrollSettings = getScrollSettings(utils.getLast(getState().sections).item.offsetTop);
setState({canScroll: false});
scrollTo(scrollSettings.element, scrollSettings.options, getOptions().scrollingSpeed, function(){
setState({canScroll: true});
setState({isBeyondFullpage: false});
setState({isAboutToScrollToFullPage: false});
});
utils.preventDefault(e);
return false;
}
}
if(!g_isAboutToScrollToFullPage){
// allow normal scrolling, but quitting
if(!pauseScroll){
return true;
}
}
}
}
var keyframeTime = (function(){
let isNew = false;
var frames = {};
var timeframes = {};
return function(action, name, timeframe){
switch(action){
case 'set':
frames[name] = new Date().getTime();
timeframes[name] = timeframe;
break;
case 'isNewKeyframe':
const current = new Date().getTime();
isNew = current - frames[name] > timeframes[name];
break;
}
return isNew;
};
})();