This repository has been archived by the owner on Aug 22, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsticky-header.js
114 lines (92 loc) · 3.98 KB
/
sticky-header.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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
var verge = require('verge');
var jQuery = require('jquery');
;(function ($) {
$.fn.sticky = function( options ) {
var settings = $.extend({
type: "scroll-top",
minimalViewportWidth: 0,
timeout: 100,
targetElement: '',
minTop: 0,
isStickyClass: 'is-sticky',
stickyWrapperClass: 'sticky-wrapper',
scrollTopClass: 'scroll-top',
hoverClass: 'sticky-hover',
stickyOnHover: true
}, options );
return this.each(function() {
var intervalId = false;
var isCurrentlySticky = null;
var isCurrentlyVisible = null;
var scrollbarPreviousVerticalPosition = 0;
var $element = $(this);
var $body = $('body');
var targetElement = settings.targetElement || this;
var stickyElementHeight = $element.height()
+ parseInt($element.css('margin-bottom').replace('px', ''))
+ parseInt($element.css('margin-top').replace('px', ''));
var minTop = settings.minTop;
if (!minTop) {
minTop = stickyElementHeight;
} else if (settings.targetElement) {
minTop = $(targetElement).offset().top;
}
function update() {
if (settings.minimalViewportWidth > 0 && verge.viewportW() > settings.minimalViewportWidth) {
return false;
}
var scrollbarVerticalPosition = $(window).scrollTop();
var isSticky = false;
var isScrollingDown = scrollbarVerticalPosition > scrollbarPreviousVerticalPosition;
var isVisible = scrollbarVerticalPosition <= minTop;
var isVisibleSticky = (settings.type == 'always') || (scrollbarVerticalPosition <= minTop + stickyElementHeight);
if (settings.stickyOnHover) {
isVisibleSticky = isVisibleSticky || $element.hasClass(settings.hoverClass);
}
if (isVisible) {
isSticky = false;
} else if (isScrollingDown) {
isSticky = isVisibleSticky;
} else {
isSticky = true;
}
scrollbarPreviousVerticalPosition = scrollbarVerticalPosition;
if (isCurrentlySticky == isSticky && isCurrentlyVisible == isVisible) {
return;
}
if (intervalId) {
clearTimeout(intervalId);
}
intervalId = setTimeout(function () {
if (isSticky) {
$element.addClass(settings.isStickyClass);
} else {
$element.removeClass(settings.isStickyClass);
}
if (isVisible) {
$body.addClass(settings.scrollTopClass);
$body.css('padding-top', 0);
$element.removeClass(settings.stickyWrapperClass);
} else {
$body.removeClass(settings.scrollTopClass);
$body.css('padding-top', stickyElementHeight);
$element.addClass(settings.stickyWrapperClass);
}
}, settings.timeout);
isCurrentlySticky = isSticky;
isCurrentlyVisible = isVisible;
}
if (settings.stickyOnHover) {
$element.hover(function () {
$element.addClass(settings.hoverClass);
}, function () {
$element.removeClass(settings.hoverClass);
update();
})
}
$(window).scroll(function (event) {
update();
});
});
};
}( jQuery, verge, document));