forked from FrontendMatter/bootstrap-layout-scrollable
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscrollable.js
More file actions
85 lines (71 loc) · 1.93 KB
/
Copy pathscrollable.js
File metadata and controls
85 lines (71 loc) · 1.93 KB
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
import {
SCROLLABLE_SELECTOR,
SCROLLABLE_DATA_KEY,
SCROLLABLE_DATA,
SCROLLABLE_EVENTS
} from './config'
export class Scrollable {
/**
* Scrollable constructor
* @return {Scrollable} A Scrollable instance
*/
constructor () {
jQuery(SCROLLABLE_SELECTOR).each((index, el) => this.init(el))
}
/**
* Get a jQuery element
* @param {String|jQuery} elementOrSelector jQuery element or DOM selector
* @return {jQuery} A jQuery element
*/
_element (elementOrSelector) {
return elementOrSelector instanceof jQuery ? elementOrSelector : jQuery(elementOrSelector)
}
/**
* Get a scrollable element
* @param {String|jQuery} el jQuery element or DOM selector
* @return {jQuery} jQuery element
*/
_scrollableElement (el) {
return this._element(el).simplebar('getScrollElement')
}
/**
* Initialize a scrollable element
* @param {String|jQuery} el jQuery element or DOM selector
*/
init (el) {
el = this._element(el)
if (jQuery.fn.simplebar === undefined) {
return
}
if (!el.data(SCROLLABLE_DATA_KEY)) {
// DATA
el.data(SCROLLABLE_DATA_KEY, true)
// CSS CLASSES
el.addClass('simplebar')
if (el.data('scrollable-direction') === 'horizontal') {
el.addClass('simplebar-horizontal')
}
// INITIALIZE
el.simplebar()
// EVENTS
el.simplebar().on('scroll', (e) => {
el.trigger(SCROLLABLE_EVENTS.scroll, [this._scrollableElement(el)])
clearTimeout(el.data(SCROLLABLE_DATA.scrollTimer))
el.data(SCROLLABLE_DATA.scrollTimer, setTimeout(() => {
el.trigger(SCROLLABLE_EVENTS.scrollEnd, [this._scrollableElement(el)])
}, 100))
})
// LISTENERS
el.on(SCROLLABLE_EVENTS.scrollTo, (id) => {
const toElement = document.querySelector(id)
if (toElement) {
this._scrollableElement(el).animate({
scrollTop: toElement.offsetTop
})
}
})
}
}
}
// export instance
export let scrollable = new Scrollable()