Initial commit
This commit is contained in:
133
js/overlay.js
Normal file
133
js/overlay.js
Normal file
@@ -0,0 +1,133 @@
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const header = document.querySelector('header');
|
||||
const body = document.querySelector('body');
|
||||
const menuToggle = document.querySelector('.menu-toggle');
|
||||
const mainMenu = document.querySelector('.main-menu');
|
||||
const menuOverlay = document.querySelector('.overlay');
|
||||
const menuIcon = document.querySelector('.menu-toggle i');
|
||||
const wpAdminBar = document.querySelector('#wpadminbar');
|
||||
const stickyHeaderMobile = document.querySelector('.header-right');
|
||||
const searchButton = document.querySelector('.search-button');
|
||||
const searchPanel = document.querySelector('.search-panel');
|
||||
const searchIcon = document.querySelector('.search-button i');
|
||||
const searchInput = document.querySelector('.search-panel__input');
|
||||
|
||||
const breakpointTablet = 768;
|
||||
|
||||
mainMenu.style.top = `${mainMenu.offsetHeight * -1}px`;
|
||||
searchPanel.style.top = `${searchPanel.offsetHeight * -1}px`;
|
||||
|
||||
// Compute the pixel offset at which panels should appear (just below the header)
|
||||
function getHeaderBottom() {
|
||||
const adminBarHeight = wpAdminBar ? wpAdminBar.offsetHeight : 0;
|
||||
if (window.innerWidth < breakpointTablet) {
|
||||
if (window.scrollY > header.getBoundingClientRect().bottom) {
|
||||
return stickyHeaderMobile.getBoundingClientRect().bottom + window.scrollY;
|
||||
}
|
||||
return header.getBoundingClientRect().bottom + window.scrollY;
|
||||
}
|
||||
return header.offsetHeight + adminBarHeight;
|
||||
}
|
||||
|
||||
function updateOverlay() {
|
||||
const anyOpen = mainMenu.classList.contains('active') || searchPanel.classList.contains('active');
|
||||
menuOverlay.classList.toggle('active', anyOpen);
|
||||
if (anyOpen) {
|
||||
body.style.overflow = 'hidden';
|
||||
} else {
|
||||
body.style.removeProperty('overflow');
|
||||
}
|
||||
}
|
||||
|
||||
// --- Menu ---
|
||||
function openMenu() {
|
||||
mainMenu.scrollTo(0, 0);
|
||||
if (window.innerWidth < breakpointTablet) {
|
||||
const adminBarHeight = wpAdminBar ? wpAdminBar.offsetHeight : 0;
|
||||
if (window.scrollY > header.getBoundingClientRect().bottom) {
|
||||
mainMenu.style.height = `${window.innerHeight - adminBarHeight - stickyHeaderMobile.offsetHeight}px`;
|
||||
} else {
|
||||
mainMenu.style.height = `${window.innerHeight - header.getBoundingClientRect().bottom}px`;
|
||||
}
|
||||
} else {
|
||||
mainMenu.style.removeProperty('height');
|
||||
}
|
||||
mainMenu.style.top = `${getHeaderBottom()}px`;
|
||||
mainMenu.classList.add('active');
|
||||
menuIcon.classList.remove('iconoir-menu');
|
||||
menuIcon.classList.add('iconoir-xmark');
|
||||
}
|
||||
|
||||
function closeMenu() {
|
||||
mainMenu.style.top = `${mainMenu.offsetHeight * -1}px`;
|
||||
mainMenu.classList.remove('active');
|
||||
menuIcon.classList.remove('iconoir-xmark');
|
||||
menuIcon.classList.add('iconoir-menu');
|
||||
}
|
||||
|
||||
function toggleMenu() {
|
||||
if (searchPanel.classList.contains('active')) closeSearch();
|
||||
if (mainMenu.classList.contains('active')) {
|
||||
closeMenu();
|
||||
} else {
|
||||
openMenu();
|
||||
}
|
||||
updateOverlay();
|
||||
}
|
||||
|
||||
// --- Search ---
|
||||
function openSearch() {
|
||||
searchPanel.style.top = `${getHeaderBottom()}px`;
|
||||
searchPanel.classList.add('active');
|
||||
searchIcon.classList.remove('iconoir-search');
|
||||
searchIcon.classList.add('iconoir-xmark');
|
||||
setTimeout(function() { if (searchInput) searchInput.focus(); }, 400);
|
||||
}
|
||||
|
||||
function closeSearch() {
|
||||
searchPanel.style.top = `${searchPanel.offsetHeight * -1}px`;
|
||||
searchPanel.classList.remove('active');
|
||||
searchIcon.classList.remove('iconoir-xmark');
|
||||
searchIcon.classList.add('iconoir-search');
|
||||
}
|
||||
|
||||
function toggleSearch() {
|
||||
if (mainMenu.classList.contains('active')) closeMenu();
|
||||
if (searchPanel.classList.contains('active')) {
|
||||
closeSearch();
|
||||
} else {
|
||||
openSearch();
|
||||
}
|
||||
updateOverlay();
|
||||
}
|
||||
|
||||
// --- Event listeners ---
|
||||
menuToggle.addEventListener('click', toggleMenu);
|
||||
searchButton.addEventListener('click', toggleSearch);
|
||||
|
||||
menuOverlay.addEventListener('click', function() {
|
||||
if (mainMenu.classList.contains('active')) closeMenu();
|
||||
if (searchPanel.classList.contains('active')) closeSearch();
|
||||
updateOverlay();
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', function(e) {
|
||||
if (e.key === 'Escape') {
|
||||
if (mainMenu.classList.contains('active')) closeMenu();
|
||||
if (searchPanel.classList.contains('active')) closeSearch();
|
||||
updateOverlay();
|
||||
}
|
||||
});
|
||||
|
||||
let resizeTimeout;
|
||||
window.addEventListener('resize', function() {
|
||||
clearTimeout(resizeTimeout);
|
||||
resizeTimeout = setTimeout(function() {
|
||||
if (mainMenu.classList.contains('active')) closeMenu();
|
||||
if (searchPanel.classList.contains('active')) closeSearch();
|
||||
updateOverlay();
|
||||
mainMenu.style.top = `${mainMenu.offsetHeight * -1}px`;
|
||||
searchPanel.style.top = `${searchPanel.offsetHeight * -1}px`;
|
||||
}, 150);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user