demarches-normaliennes/app/javascript/controllers/sticky_top_controller.ts

44 lines
1.1 KiB
TypeScript
Raw Normal View History

import { ApplicationController } from './application_controller';
export class StickyTopController extends ApplicationController {
// Ajusts top of sticky top components when there is a sticky header.
connect(): void {
const header = document.getElementById('sticky-header');
if (!header) {
return;
}
this.adjustTop(header);
window.addEventListener('resize', () => this.adjustTop(header));
this.listenHeaderMutations(header);
}
private listenHeaderMutations(header: HTMLElement) {
const config = { childList: true, subtree: true };
const callback: MutationCallback = (mutationsList) => {
for (const mutation of mutationsList) {
if (mutation.type === 'childList') {
this.adjustTop(header);
break;
}
}
};
const observer = new MutationObserver(callback);
observer.observe(header, config);
}
private adjustTop(header: HTMLElement) {
const headerHeight = header.clientHeight;
if (headerHeight > 0) {
(this.element as HTMLElement).style.top = `${headerHeight + 8}px`;
}
}
}