-
Notifications
You must be signed in to change notification settings - Fork 434
/
scroller.js
87 lines (65 loc) · 1.93 KB
/
scroller.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
85
86
87
import utils from './utils';
import animateScroll from './animate-scroll';
import events from './scroll-events';
let __mapped = {}
let __activeLink;
export default {
unmount: () => {
__mapped = {};
},
register: (name, element) => {
__mapped[name] = element;
},
unregister: (name) => {
delete __mapped[name];
},
get: (name) => __mapped[name] || document.getElementById(name) || document.getElementsByName(name)[0] || document.getElementsByClassName(name)[0],
setActiveLink: (link) => __activeLink = link,
getActiveLink: () => __activeLink,
scrollTo(to, props) {
let target = this.get(to);
if (!target) {
console.warn("target Element not found");
return;
}
props = Object.assign({}, props, { absolute: false });
let containerId = props.containerId;
let container = props.container;
let containerElement;
if (containerId) {
containerElement = document.getElementById(containerId);
} else if (container && container.nodeType) {
containerElement = container;
} else {
containerElement = document;
}
props.absolute = true;
let horizontal = props.horizontal
let scrollOffset = utils.scrollOffset(containerElement, target, horizontal) + (props.offset || 0);
/*
* if animate is not provided just scroll into the view
*/
if (!props.smooth) {
if (events.registered['begin']) {
events.registered['begin'](to, target);
}
if (containerElement === document) {
if (props.horizontal) {
window.scrollTo(scrollOffset, 0);
} else {
window.scrollTo(0, scrollOffset);
}
} else {
containerElement.scrollTop = scrollOffset;
}
if (events.registered['end']) {
events.registered['end'](to, target);
}
return;
}
/*
* Animate scrolling
*/
animateScroll.animateTopScroll(scrollOffset, props, to, target);
}
};