Skip to content
Snippets Groups Projects
Commit e358aadb authored by Jan-Hendrik Willms's avatar Jan-Hendrik Willms Committed by Jan-Hendrik Willms
Browse files

fixes #4005

Closes #4005

Merge request studip/studip!2860
parent 360efa75
No related branches found
No related tags found
No related merge requests found
...@@ -17,7 +17,7 @@ const scroll = function(scrolltop) { ...@@ -17,7 +17,7 @@ const scroll = function(scrolltop) {
const HeaderMagic = { const HeaderMagic = {
enable() { enable() {
fold = $('#navigation-level-1').height(); fold = $('#navigation-level-1').height();
Scroll.addHandler('header', scroll); Scroll.addHandler('header', scroll, true);
}, },
disable() { disable() {
Scroll.removeHandler('header'); Scroll.removeHandler('header');
......
...@@ -6,49 +6,54 @@ ...@@ -6,49 +6,54 @@
* Updates/calls to the callback are synchronized to screen refresh by using * Updates/calls to the callback are synchronized to screen refresh by using
* the animation frame method (which will fallback to a timer based solution). * the animation frame method (which will fallback to a timer based solution).
*/ */
var handlers = {}; const handlers = {};
var animId = false; let animId = false;
var lastTop = null; let lastTop = null;
var lastLeft = null; let lastLeft = null;
function scrollHandler() {
var scrollTop = $(document).scrollTop();
var scrollLeft = $(document).scrollLeft();
if (scrollTop !== lastTop || scrollLeft !== lastLeft) {
$.each(handlers, function(index, handler) {
handler(scrollTop, scrollLeft);
});
lastTop = scrollTop;
lastLeft = scrollLeft;
}
animId = false;
engageScrollTrigger();
}
function refresh() { function refresh() {
var hasHandlers = !$.isEmptyObject(handlers); const hasHandlers = Object.keys(handlers).length > 0;
if (!hasHandlers && animId !== false) { if (!hasHandlers && animId !== false) {
window.cancelAnimationFrame(animId); window.cancelAnimationFrame(animId);
animId = false; animId = false;
} else if (hasHandlers && animId === false) { } else if (hasHandlers && animId === false) {
animId = window.requestAnimationFrame(scrollHandler); animId = window.requestAnimationFrame(() => Scroll.executeHandlers());
} }
} }
function engageScrollTrigger() { function engageScrollTrigger() {
$(window).off('scroll.studip-handler'); window.removeEventListener('scroll', refresh);
$(window).one('scroll.studip-handler', refresh); window.addEventListener('scroll', refresh, {once: true});
} }
const Scroll = { const Scroll = {
addHandler(index, handler) { executeHandlers(only_these = []) {
const scrollTop = document.scrollingElement.scrollTop;
const scrollLeft = document.scrollingElement.scrollLeft;
if (scrollTop !== lastTop || scrollLeft !== lastLeft) {
for (const [index, handler] of Object.entries(handlers)) {
if (only_these.length === 0 || only_these.includes(index)) {
handler(scrollTop, scrollLeft);
}
}
lastTop = scrollTop;
lastLeft = scrollLeft;
}
animId = false;
engageScrollTrigger();
},
addHandler(index, handler, immediate = false) {
handlers[index] = handler; handlers[index] = handler;
engageScrollTrigger(); engageScrollTrigger();
if (immediate) {
Scroll.executeHandlers([index]);
}
}, },
removeHandler(index) { removeHandler(index) {
delete handlers[index]; delete handlers[index];
......
...@@ -594,6 +594,9 @@ export default { ...@@ -594,6 +594,9 @@ export default {
attributeFilter: ['class'] attributeFilter: ['class']
}) })
}); });
// Check initial state after load
this.headerMagic = document.querySelector('body').classList.contains('fixed');
}, },
beforeDestroy() { beforeDestroy() {
this.classObserver.disconnect(); this.classObserver.disconnect();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment